mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-05-04 23:44:48 +00:00
threadsafe pad link/unlink
Original commit message from CVS: threadsafe pad link/unlink
This commit is contained in:
parent
8263719f64
commit
325219ea1a
4 changed files with 88 additions and 10 deletions
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue