mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-26 09:50:39 +00:00
threadsafe pad link/unlink
Original commit message from CVS: threadsafe pad link/unlink
This commit is contained in:
parent
8263719f64
commit
325219ea1a
|
@ -139,7 +139,7 @@ END_TEST
|
||||||
while (THREAD_TEST_RUNNING ()) {
|
while (THREAD_TEST_RUNNING ()) {
|
||||||
gst_object_set_name (object, thread_id);
|
gst_object_set_name (object, thread_id);
|
||||||
/* a minimal sleep invokes a thread switch */
|
/* a minimal sleep invokes a thread switch */
|
||||||
g_usleep (1);
|
THREAD_SWITCH ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* thread is done, so let's return */
|
/* 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 */
|
/* start looping and set/get name repeatedly */
|
||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
gst_object_set_name (object, "main");
|
gst_object_set_name (object, "main");
|
||||||
g_usleep (1); /* switch */
|
THREAD_SWITCH ();
|
||||||
name = gst_object_get_name (object);
|
name = gst_object_get_name (object);
|
||||||
if (strcmp (name, "main") != 0) {
|
if (strcmp (name, "main") != 0) {
|
||||||
g_message ("MAIN: expected failure during run %d\n", i);
|
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);
|
GST_LOCK (object);
|
||||||
g_free (GST_OBJECT_NAME (object));
|
g_free (GST_OBJECT_NAME (object));
|
||||||
GST_OBJECT_NAME (object) = g_strdup ("main");
|
GST_OBJECT_NAME (object) = g_strdup ("main");
|
||||||
g_usleep (1); /* switch */
|
THREAD_SWITCH ();
|
||||||
name = g_strdup (GST_OBJECT_NAME (object));
|
name = g_strdup (GST_OBJECT_NAME (object));
|
||||||
GST_UNLOCK (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_message ("THREAD %p: setting default name on object %d\n",
|
||||||
g_thread_self (), j); */
|
g_thread_self (), j); */
|
||||||
gst_object_set_name (o, NULL);
|
gst_object_set_name (o, NULL);
|
||||||
/* a minimal sleep invokes a thread switch */
|
THREAD_SWITCH ();
|
||||||
g_usleep (1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* thread is done, so let's return */
|
/* thread is done, so let's return */
|
||||||
|
|
|
@ -58,6 +58,45 @@ START_TEST (test_link)
|
||||||
fail_unless (ret == GST_PAD_LINK_OK);
|
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)
|
END_TEST Suite * gst_pad_suite (void)
|
||||||
{
|
{
|
||||||
Suite *s = suite_create ("GstPad");
|
Suite *s = suite_create ("GstPad");
|
||||||
|
@ -65,6 +104,7 @@ END_TEST Suite * gst_pad_suite (void)
|
||||||
|
|
||||||
suite_add_tcase (s, tc_chain);
|
suite_add_tcase (s, tc_chain);
|
||||||
tcase_add_test (tc_chain, test_link);
|
tcase_add_test (tc_chain, test_link);
|
||||||
|
tcase_add_test (tc_chain, test_link_unlink_threaded);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ END_TEST
|
||||||
while (THREAD_TEST_RUNNING ()) {
|
while (THREAD_TEST_RUNNING ()) {
|
||||||
gst_object_set_name (object, thread_id);
|
gst_object_set_name (object, thread_id);
|
||||||
/* a minimal sleep invokes a thread switch */
|
/* a minimal sleep invokes a thread switch */
|
||||||
g_usleep (1);
|
THREAD_SWITCH ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* thread is done, so let's return */
|
/* 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 */
|
/* start looping and set/get name repeatedly */
|
||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
gst_object_set_name (object, "main");
|
gst_object_set_name (object, "main");
|
||||||
g_usleep (1); /* switch */
|
THREAD_SWITCH ();
|
||||||
name = gst_object_get_name (object);
|
name = gst_object_get_name (object);
|
||||||
if (strcmp (name, "main") != 0) {
|
if (strcmp (name, "main") != 0) {
|
||||||
g_message ("MAIN: expected failure during run %d\n", i);
|
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);
|
GST_LOCK (object);
|
||||||
g_free (GST_OBJECT_NAME (object));
|
g_free (GST_OBJECT_NAME (object));
|
||||||
GST_OBJECT_NAME (object) = g_strdup ("main");
|
GST_OBJECT_NAME (object) = g_strdup ("main");
|
||||||
g_usleep (1); /* switch */
|
THREAD_SWITCH ();
|
||||||
name = g_strdup (GST_OBJECT_NAME (object));
|
name = g_strdup (GST_OBJECT_NAME (object));
|
||||||
GST_UNLOCK (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_message ("THREAD %p: setting default name on object %d\n",
|
||||||
g_thread_self (), j); */
|
g_thread_self (), j); */
|
||||||
gst_object_set_name (o, NULL);
|
gst_object_set_name (o, NULL);
|
||||||
/* a minimal sleep invokes a thread switch */
|
THREAD_SWITCH ();
|
||||||
g_usleep (1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* thread is done, so let's return */
|
/* thread is done, so let's return */
|
||||||
|
|
|
@ -58,6 +58,45 @@ START_TEST (test_link)
|
||||||
fail_unless (ret == GST_PAD_LINK_OK);
|
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)
|
END_TEST Suite * gst_pad_suite (void)
|
||||||
{
|
{
|
||||||
Suite *s = suite_create ("GstPad");
|
Suite *s = suite_create ("GstPad");
|
||||||
|
@ -65,6 +104,7 @@ END_TEST Suite * gst_pad_suite (void)
|
||||||
|
|
||||||
suite_add_tcase (s, tc_chain);
|
suite_add_tcase (s, tc_chain);
|
||||||
tcase_add_test (tc_chain, test_link);
|
tcase_add_test (tc_chain, test_link);
|
||||||
|
tcase_add_test (tc_chain, test_link_unlink_threaded);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue