diff --git a/ChangeLog b/ChangeLog index 57f7aba554..a3862083f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-07-16 Wim Taymans + + * testsuite/schedulers/143777-2.c: (main): + * testsuite/schedulers/147713.c: (handoff_src), (handoff_sink), + (main): + * testsuite/schedulers/Makefile.am: + Added cleanup code to testcase 143777-2. + Added testcase to show bug 147713, does not really show the + deadlock as I can't figure out how to trigger it, but it does + demonstrate bad ordering in the scheduler. + 2004-07-16 Thomas Vander Stichele * gst/gstvalue.c: (gst_value_deserialize_fraction): diff --git a/tests/old/testsuite/schedulers/143777-2.c b/tests/old/testsuite/schedulers/143777-2.c index 22e5cfc4ec..399bff2039 100644 --- a/tests/old/testsuite/schedulers/143777-2.c +++ b/tests/old/testsuite/schedulers/143777-2.c @@ -53,6 +53,9 @@ main (int argc, char **argv) g_assert_not_reached (); g_print ("%d\n", i); } + g_print ("cleaning up...\n"); + gst_object_unref (GST_OBJECT (pipeline)); + g_print ("done.\n"); return 0; } diff --git a/tests/old/testsuite/schedulers/147713.c b/tests/old/testsuite/schedulers/147713.c new file mode 100644 index 0000000000..0a2dc07dfa --- /dev/null +++ b/tests/old/testsuite/schedulers/147713.c @@ -0,0 +1,89 @@ +/* GStreamer + * Copyright (C) 2004 Wim Taymanse + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +static gint src_handoff = 0; + +static void +handoff_src (GstElement * element) +{ + g_print ("src handoff\n"); + src_handoff++; +} + +static void +handoff_sink (GstElement * element) +{ + g_print ("sink handoff\n"); + g_assert (src_handoff == 1); +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *pipeline, *src, *sink, *id1, *id2; + + gst_init (&argc, &argv); + + g_print ("setting up...\n"); + /* setup pipeline */ + pipeline = gst_element_factory_make ("pipeline", NULL); + g_assert (pipeline); + src = gst_element_factory_make ("fakesrc", NULL); + g_assert (src); + g_object_set (G_OBJECT (src), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (src), "handoff", (GCallback) handoff_src, NULL); + id1 = gst_element_factory_make ("identity", NULL); + g_assert (id1); + + id2 = gst_element_factory_make ("identity", NULL); + g_assert (id2); + g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL); + + sink = gst_element_factory_make ("fakesink", NULL); + g_assert (sink); + g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (sink), "handoff", (GCallback) handoff_sink, NULL); + + gst_bin_add_many (GST_BIN (pipeline), src, id1, NULL); + gst_element_link_pads (src, "src", id1, "sink"); + + if (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS) + g_assert_not_reached (); + + if (gst_element_set_state (id2, GST_STATE_PLAYING) != GST_STATE_SUCCESS) + g_assert_not_reached (); + if (gst_element_set_state (sink, GST_STATE_PLAYING) != GST_STATE_SUCCESS) + g_assert_not_reached (); + + gst_bin_add_many (GST_BIN (pipeline), sink, NULL); + gst_element_link_pads (id2, "src", sink, "sink"); + gst_element_link_pads (id1, "src", id2, "sink"); + gst_bin_add_many (GST_BIN (pipeline), id2, NULL); + + gst_bin_iterate (GST_BIN (pipeline)); + gst_bin_iterate (GST_BIN (pipeline)); + + g_print ("cleaning up...\n"); + gst_object_unref (GST_OBJECT (pipeline)); + src = id1 = id2 = sink = pipeline = NULL; + + g_print ("done.\n"); + return 0; +} diff --git a/tests/old/testsuite/schedulers/Makefile.am b/tests/old/testsuite/schedulers/Makefile.am index bec30900d0..630e8f7850 100644 --- a/tests/old/testsuite/schedulers/Makefile.am +++ b/tests/old/testsuite/schedulers/Makefile.am @@ -4,7 +4,7 @@ tests_pass = \ unlink_src unlink_sink \ relink_src relink_sink \ unref_src unref_sink \ - 143777 143777-2 + 143777 143777-2 147713 # don't enable this one unless it actually works. # useless_iteration diff --git a/testsuite/schedulers/143777-2.c b/testsuite/schedulers/143777-2.c index 22e5cfc4ec..399bff2039 100644 --- a/testsuite/schedulers/143777-2.c +++ b/testsuite/schedulers/143777-2.c @@ -53,6 +53,9 @@ main (int argc, char **argv) g_assert_not_reached (); g_print ("%d\n", i); } + g_print ("cleaning up...\n"); + gst_object_unref (GST_OBJECT (pipeline)); + g_print ("done.\n"); return 0; } diff --git a/testsuite/schedulers/147713.c b/testsuite/schedulers/147713.c new file mode 100644 index 0000000000..0a2dc07dfa --- /dev/null +++ b/testsuite/schedulers/147713.c @@ -0,0 +1,89 @@ +/* GStreamer + * Copyright (C) 2004 Wim Taymanse + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +static gint src_handoff = 0; + +static void +handoff_src (GstElement * element) +{ + g_print ("src handoff\n"); + src_handoff++; +} + +static void +handoff_sink (GstElement * element) +{ + g_print ("sink handoff\n"); + g_assert (src_handoff == 1); +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *pipeline, *src, *sink, *id1, *id2; + + gst_init (&argc, &argv); + + g_print ("setting up...\n"); + /* setup pipeline */ + pipeline = gst_element_factory_make ("pipeline", NULL); + g_assert (pipeline); + src = gst_element_factory_make ("fakesrc", NULL); + g_assert (src); + g_object_set (G_OBJECT (src), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (src), "handoff", (GCallback) handoff_src, NULL); + id1 = gst_element_factory_make ("identity", NULL); + g_assert (id1); + + id2 = gst_element_factory_make ("identity", NULL); + g_assert (id2); + g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL); + + sink = gst_element_factory_make ("fakesink", NULL); + g_assert (sink); + g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (sink), "handoff", (GCallback) handoff_sink, NULL); + + gst_bin_add_many (GST_BIN (pipeline), src, id1, NULL); + gst_element_link_pads (src, "src", id1, "sink"); + + if (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS) + g_assert_not_reached (); + + if (gst_element_set_state (id2, GST_STATE_PLAYING) != GST_STATE_SUCCESS) + g_assert_not_reached (); + if (gst_element_set_state (sink, GST_STATE_PLAYING) != GST_STATE_SUCCESS) + g_assert_not_reached (); + + gst_bin_add_many (GST_BIN (pipeline), sink, NULL); + gst_element_link_pads (id2, "src", sink, "sink"); + gst_element_link_pads (id1, "src", id2, "sink"); + gst_bin_add_many (GST_BIN (pipeline), id2, NULL); + + gst_bin_iterate (GST_BIN (pipeline)); + gst_bin_iterate (GST_BIN (pipeline)); + + g_print ("cleaning up...\n"); + gst_object_unref (GST_OBJECT (pipeline)); + src = id1 = id2 = sink = pipeline = NULL; + + g_print ("done.\n"); + return 0; +} diff --git a/testsuite/schedulers/Makefile.am b/testsuite/schedulers/Makefile.am index bec30900d0..630e8f7850 100644 --- a/testsuite/schedulers/Makefile.am +++ b/testsuite/schedulers/Makefile.am @@ -4,7 +4,7 @@ tests_pass = \ unlink_src unlink_sink \ relink_src relink_sink \ unref_src unref_sink \ - 143777 143777-2 + 143777 143777-2 147713 # don't enable this one unless it actually works. # useless_iteration