threadsafe pad link/unlink

Original commit message from CVS:
threadsafe pad link/unlink
This commit is contained in:
Thomas Vander Stichele 2005-02-16 18:31:45 +00:00
parent 8263719f64
commit 325219ea1a
4 changed files with 88 additions and 10 deletions

View file

@ -139,7 +139,7 @@ END_TEST
while (THREAD_TEST_RUNNING ()) {
gst_object_set_name (object, thread_id);
/* a minimal sleep invokes a thread switch */
g_usleep (1);
THREAD_SWITCH ();
}
/* thread is done, so let's return */
@ -171,7 +171,7 @@ START_TEST (test_fake_object_name_threaded_wrong)
/* start looping and set/get name repeatedly */
for (i = 0; i < 1000; ++i) {
gst_object_set_name (object, "main");
g_usleep (1); /* switch */
THREAD_SWITCH ();
name = gst_object_get_name (object);
if (strcmp (name, "main") != 0) {
g_message ("MAIN: expected failure during run %d\n", i);
@ -209,7 +209,7 @@ START_TEST (test_fake_object_name_threaded_right)
GST_LOCK (object);
g_free (GST_OBJECT_NAME (object));
GST_OBJECT_NAME (object) = g_strdup ("main");
g_usleep (1); /* switch */
THREAD_SWITCH ();
name = g_strdup (GST_OBJECT_NAME (object));
GST_UNLOCK (object);
@ -244,8 +244,7 @@ thread_name_object_default (int *i)
/* g_message ("THREAD %p: setting default name on object %d\n",
g_thread_self (), j); */
gst_object_set_name (o, NULL);
/* a minimal sleep invokes a thread switch */
g_usleep (1);
THREAD_SWITCH ();
}
/* thread is done, so let's return */

View file

@ -58,6 +58,45 @@ START_TEST (test_link)
fail_unless (ret == GST_PAD_LINK_OK);
}
END_TEST
/* threaded link/unlink */
/* use globals */
GstPad * src, *sink;
void
thread_link_unlink (gpointer data)
{
THREAD_START ();
while (THREAD_TEST_RUNNING ()) {
gst_pad_link (src, sink);
gst_pad_unlink (src, sink);
THREAD_SWITCH ();
}
}
START_TEST (test_link_unlink_threaded)
{
GstCaps *caps;
int i;
src = gst_pad_new ("source", GST_PAD_SRC);
fail_if (src == NULL);
sink = gst_pad_new ("sink", GST_PAD_SINK);
fail_if (sink == NULL);
caps = gst_caps_new_any ();
gst_pad_set_caps (src, caps);
gst_pad_set_caps (sink, caps);
MAIN_START_THREADS (5, thread_link_unlink, NULL);
for (i = 0; i < 1000; ++i) {
gst_pad_is_linked (src);
gst_pad_is_linked (sink);
THREAD_SWITCH ();
}
MAIN_STOP_THREADS ();
}
END_TEST Suite * gst_pad_suite (void)
{
Suite *s = suite_create ("GstPad");
@ -65,6 +104,7 @@ END_TEST Suite * gst_pad_suite (void)
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_link);
tcase_add_test (tc_chain, test_link_unlink_threaded);
return s;
}

View file

@ -139,7 +139,7 @@ END_TEST
while (THREAD_TEST_RUNNING ()) {
gst_object_set_name (object, thread_id);
/* a minimal sleep invokes a thread switch */
g_usleep (1);
THREAD_SWITCH ();
}
/* thread is done, so let's return */
@ -171,7 +171,7 @@ START_TEST (test_fake_object_name_threaded_wrong)
/* start looping and set/get name repeatedly */
for (i = 0; i < 1000; ++i) {
gst_object_set_name (object, "main");
g_usleep (1); /* switch */
THREAD_SWITCH ();
name = gst_object_get_name (object);
if (strcmp (name, "main") != 0) {
g_message ("MAIN: expected failure during run %d\n", i);
@ -209,7 +209,7 @@ START_TEST (test_fake_object_name_threaded_right)
GST_LOCK (object);
g_free (GST_OBJECT_NAME (object));
GST_OBJECT_NAME (object) = g_strdup ("main");
g_usleep (1); /* switch */
THREAD_SWITCH ();
name = g_strdup (GST_OBJECT_NAME (object));
GST_UNLOCK (object);
@ -244,8 +244,7 @@ thread_name_object_default (int *i)
/* g_message ("THREAD %p: setting default name on object %d\n",
g_thread_self (), j); */
gst_object_set_name (o, NULL);
/* a minimal sleep invokes a thread switch */
g_usleep (1);
THREAD_SWITCH ();
}
/* thread is done, so let's return */

View file

@ -58,6 +58,45 @@ START_TEST (test_link)
fail_unless (ret == GST_PAD_LINK_OK);
}
END_TEST
/* threaded link/unlink */
/* use globals */
GstPad * src, *sink;
void
thread_link_unlink (gpointer data)
{
THREAD_START ();
while (THREAD_TEST_RUNNING ()) {
gst_pad_link (src, sink);
gst_pad_unlink (src, sink);
THREAD_SWITCH ();
}
}
START_TEST (test_link_unlink_threaded)
{
GstCaps *caps;
int i;
src = gst_pad_new ("source", GST_PAD_SRC);
fail_if (src == NULL);
sink = gst_pad_new ("sink", GST_PAD_SINK);
fail_if (sink == NULL);
caps = gst_caps_new_any ();
gst_pad_set_caps (src, caps);
gst_pad_set_caps (sink, caps);
MAIN_START_THREADS (5, thread_link_unlink, NULL);
for (i = 0; i < 1000; ++i) {
gst_pad_is_linked (src);
gst_pad_is_linked (sink);
THREAD_SWITCH ();
}
MAIN_STOP_THREADS ();
}
END_TEST Suite * gst_pad_suite (void)
{
Suite *s = suite_create ("GstPad");
@ -65,6 +104,7 @@ END_TEST Suite * gst_pad_suite (void)
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_link);
tcase_add_test (tc_chain, test_link_unlink_threaded);
return s;
}