--- a/gstreamer_core/tsrc/check/gst/gstsystemclock/src/gstsystemclock.c Fri Mar 19 09:35:09 2010 +0200
+++ b/gstreamer_core/tsrc/check/gst/gstsystemclock/src/gstsystemclock.c Fri Apr 16 15:15:52 2010 +0300
@@ -1,24 +1,15 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser 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
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the
-* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-* Boston, MA 02111-1307, USA.
-*
-* Description:
-*
-*/
+ /*
+ * Copyright © 2008 Nokia Corporation.
+ * This material, including documentation and any related
+ * computer programs, is protected by copyright controlled by
+ * Nokia Corporation. All rights are reserved. Copying,
+ * including reproducing, storing, adapting or translating, any
+ * or all of this material requires the prior written consent of
+ * Nokia Corporation. This material also contains confidential
+ * information which may not be disclosed to others without the
+ * prior written consent of Nokia Corporation.
+ * ============================================================================
+ */
/* GStreamer
* Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
@@ -53,11 +44,20 @@
void create_xml(int result)
{
+
if(result)
+ {
assert_failed = 1;
-
+ }
+
testResultXml(xmlfile);
close_log_file();
+
+ if(result)
+ {
+ exit (-1);
+ }
+
}
@@ -94,7 +94,7 @@
}
-#define TIME_UNIT (GST_SECOND / 5)
+#define TIME_UNIT (GST_SECOND)
static void
gst_clock_debug (GstClock * clock)
{
@@ -122,6 +122,7 @@
return FALSE;
}
+GMutex *store_lock;
static gboolean
store_callback (GstClock * clock, GstClockTime time,
GstClockID id, gpointer user_data)
@@ -129,7 +130,9 @@
GList **list = user_data;
GST_DEBUG ("unlocked async id %p", id);
+ g_mutex_lock (store_lock);
*list = g_list_append (*list, id);
+ g_mutex_unlock (store_lock);
return FALSE;
}
@@ -151,9 +154,12 @@
GstClockID id, id2;
GstClockTime base;
GstClockReturn result;
+ GstClockTime time_my;
+ int value;
xmlfile = "test_single_shot";
std_log(LOG_FILENAME_LINE, "Test Started test_single_shot");
+ GST_DEBUG ("test_single_shot started ");
clock = gst_system_clock_obtain ();
fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
@@ -184,15 +190,16 @@
gst_clock_id_unref (id);
- id = gst_clock_new_single_shot_id (clock, base + 2 * TIME_UNIT);
+ id = gst_clock_new_single_shot_id (clock, base + (2 * TIME_UNIT));
GST_DEBUG ("waiting one second async id %p", id);
result = gst_clock_id_wait_async (id, ok_callback, NULL);
- gst_clock_id_unref (id);
fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
g_usleep (TIME_UNIT / (2 * 1000));
+ gst_clock_id_unschedule (id);
+ gst_clock_id_unref (id);
- id = gst_clock_new_single_shot_id (clock, base + 5 * TIME_UNIT);
+ id = gst_clock_new_single_shot_id (clock, base + (5 * TIME_UNIT));
GST_DEBUG ("waiting one second async, with cancel on id %p", id);
result = gst_clock_id_wait_async (id, error_callback, NULL);
fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
@@ -204,13 +211,12 @@
GST_DEBUG ("canceled id %p", id);
GST_DEBUG ("waiting multiple one second async, with cancel");
- id = gst_clock_new_single_shot_id (clock, base + 5 * TIME_UNIT);
- id2 = gst_clock_new_single_shot_id (clock, base + 6 * TIME_UNIT);
+ id = gst_clock_new_single_shot_id (clock, base + (5 * TIME_UNIT));
+ id2 = gst_clock_new_single_shot_id (clock, base + (6 * TIME_UNIT));
GST_DEBUG ("waiting id %p", id);
result = gst_clock_id_wait_async (id, ok_callback, NULL);
fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
- gst_clock_id_unref (id);
GST_DEBUG ("waiting id %p", id2);
result = gst_clock_id_wait_async (id2, error_callback, NULL);
fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
@@ -220,8 +226,13 @@
gst_clock_id_unschedule (id2);
GST_DEBUG ("canceled id %p", id2);
gst_clock_id_unref (id2);
- g_usleep (TIME_UNIT / (2 * 1000));
+ g_usleep (TIME_UNIT / 1000 * 5);
+ fail_unless (((GstClockEntry *) id)->status == GST_CLOCK_OK,
+ "Waiting did not finish");
+ gst_clock_id_unref (id);
+ gst_object_unref (clock);
+ GST_DEBUG ("test_single_shot finished ");
std_log(LOG_FILENAME_LINE, "Test Successful");
create_xml(0);
}
@@ -317,6 +328,7 @@
std_log(LOG_FILENAME_LINE, "Test Started test_async_order");
+ store_lock = g_mutex_new ();
clock = gst_system_clock_obtain ();
fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
@@ -335,21 +347,26 @@
g_usleep (TIME_UNIT / 1000);
// at this point at least one of the timers should have timed out
+ g_mutex_lock (store_lock);
fail_unless (cb_list != NULL, "expected notification");
fail_unless (cb_list->data == id2,
"Expected notification for id2 to come first");
-
+ g_mutex_unlock (store_lock);
g_usleep (TIME_UNIT / 1000);
+ g_mutex_lock (store_lock);
// now both should have timed out
next = g_list_next (cb_list);
fail_unless (next != NULL, "expected second notification");
fail_unless (next->data == id1, "Missing notification for id1");
+ g_mutex_unlock (store_lock);
gst_clock_id_unref (id1);
gst_clock_id_unref (id2);
g_list_free (cb_list);
+ gst_object_unref (clock);
+ g_mutex_free (store_lock);
std_log(LOG_FILENAME_LINE, "Test Successful");
create_xml(0);
@@ -455,7 +472,7 @@
xmlfile = "test_mixed";
std_log(LOG_FILENAME_LINE, "Test Started test_mixed");
-
+ GST_DEBUG ("test_mixed started ");
info.clock = gst_system_clock_obtain ();
fail_unless (info.clock != NULL,
"Could not create instance of GstSystemClock");
@@ -495,6 +512,7 @@
gst_object_unref (info.clock);
std_log(LOG_FILENAME_LINE, "Test Successful");
+ GST_DEBUG ("test_mixed finished ");
create_xml(0);
}
@@ -542,8 +560,89 @@
}
-
-
+struct test_async_sync_interaction_data
+{
+ GMutex *lock;
+ GstClockID sync_id;
+ GstClockID sync_id2;
+ GstClockID async_id;
+ GstClockID async_id2;
+ GstClockID async_id3;
+};
+static gboolean
+test_async_sync_interaction_cb (GstClock * clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ struct test_async_sync_interaction_data *td =
+ (struct test_async_sync_interaction_data *) (user_data);
+ g_mutex_lock (td->lock);
+ if (id == td->async_id)
+ goto out;
+ if (id != td->async_id2 && id != td->async_id3)
+ goto out;
+ if (id == td->async_id3) {
+ gst_clock_id_unschedule (td->sync_id);
+ gst_clock_id_unschedule (td->async_id2);
+ }
+out:
+ g_mutex_unlock (td->lock);
+ return FALSE;
+}
+void test_async_sync_interaction()
+{
+ GstClock *clock;
+ GstClockReturn result;
+ GstClockTime base;
+ GstClockTimeDiff jitter;
+ struct test_async_sync_interaction_data td;
+ int i;
+ xmlfile = "test_async_sync_interaction";
+std_log(LOG_FILENAME_LINE, "Test Started test_async_sync_interaction");
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
+ td.lock = g_mutex_new ();
+ for (i = 0; i < 50; i++) {
+ gst_clock_debug (clock);
+ base = gst_clock_get_time (clock);
+ g_mutex_lock (td.lock);
+ td.async_id = gst_clock_new_single_shot_id (clock, base + 40 * GST_MSECOND);
+ td.async_id2 =
+ gst_clock_new_single_shot_id (clock, base + 30 * GST_MSECOND);
+ td.async_id3 =
+ gst_clock_new_single_shot_id (clock, base + 20 * GST_MSECOND);
+ td.sync_id2 = gst_clock_new_single_shot_id (clock, base + 10 * GST_MSECOND);
+ td.sync_id = gst_clock_new_single_shot_id (clock, base + 50 * GST_MSECOND);
+ g_mutex_unlock (td.lock);
+ result = gst_clock_id_wait_async (td.async_id,
+ test_async_sync_interaction_cb, &td);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ result = gst_clock_id_wait (td.sync_id2, &jitter);
+ fail_unless (result == GST_CLOCK_OK || result == GST_CLOCK_EARLY,
+ "Waiting did not return OK or EARLY");
+ result = gst_clock_id_wait_async (td.async_id2,
+ test_async_sync_interaction_cb, &td);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ gst_clock_id_unschedule (td.async_id);
+ result = gst_clock_id_wait_async (td.async_id3,
+ test_async_sync_interaction_cb, &td);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ result = gst_clock_id_wait (td.sync_id, &jitter);
+ fail_unless (result == GST_CLOCK_UNSCHEDULED || result == GST_CLOCK_EARLY,
+ "Waiting did not return UNSCHEDULED");
+ gst_clock_id_unschedule (td.async_id3);
+ g_mutex_lock (td.lock);
+ gst_clock_id_unref (td.sync_id);
+ gst_clock_id_unref (td.sync_id2);
+ gst_clock_id_unref (td.async_id);
+ gst_clock_id_unref (td.async_id2);
+ gst_clock_id_unref (td.async_id3);
+ g_mutex_unlock (td.lock);
+ }
+ g_mutex_free (td.lock);
+ gst_object_unref (clock);
+ std_log(LOG_FILENAME_LINE, "Test Successful");
+ create_xml(0);
+ }
/*void main(int argc,char** argv)
{
gst_init(&argc,&argv);
@@ -560,7 +659,7 @@
}*/
-void (*fn[8]) (void) = {
+void (*fn[]) (void) = {
test_range,
test_diff,
test_signedness,
@@ -568,7 +667,8 @@
test_periodic_shot,
test_periodic_multi,
test_async_order,
- test_mixed
+ test_mixed,
+ test_async_sync_interaction
};
char *args[] = {
@@ -580,6 +680,7 @@
"test_periodic_multi",
"test_async_order",
"test_mixed",
+ "test_async_sync_interaction"
};
GST_CHECK_MAIN (gst_systemclock);