tests: handle unscheduled entries correctly
authorWim Taymans <wim.taymans@collabora.co.uk>
Mon, 23 Sep 2013 09:47:14 +0000 (11:47 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 23 Sep 2013 09:47:14 +0000 (11:47 +0200)
Make the testclock return GST_CLOCK_UNSCHEDULED when an unscheduled entry is
used for gst_clock_wait() or gst_clock_wait_async().

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=708605

libs/gst/check/gsttestclock.c
tests/check/libs/gsttestclock.c

index 120337b..f9737a6 100644 (file)
@@ -423,6 +423,9 @@ gst_test_clock_wait (GstClock * clock,
       "requesting synchronous clock notification at %" GST_TIME_FORMAT,
       GST_TIME_ARGS (GST_CLOCK_ENTRY_TIME (entry)));
 
+  if (GST_CLOCK_ENTRY_STATUS (entry) == GST_CLOCK_UNSCHEDULED)
+    goto was_unscheduled;
+
   if (gst_test_clock_lookup_entry_context (test_clock, entry) == NULL)
     gst_test_clock_add_entry (test_clock, entry, jitter);
 
@@ -434,6 +437,15 @@ gst_test_clock_wait (GstClock * clock,
   GST_OBJECT_UNLOCK (test_clock);
 
   return GST_CLOCK_ENTRY_STATUS (entry);
+
+  /* ERRORS */
+was_unscheduled:
+  {
+    GST_CAT_DEBUG_OBJECT (GST_CAT_TEST_CLOCK, test_clock,
+        "entry was unscheduled");
+    GST_OBJECT_UNLOCK (test_clock);
+    return GST_CLOCK_UNSCHEDULED;
+  }
 }
 
 static GstClockReturn
@@ -443,6 +455,9 @@ gst_test_clock_wait_async (GstClock * clock, GstClockEntry * entry)
 
   GST_OBJECT_LOCK (test_clock);
 
+  if (GST_CLOCK_ENTRY_STATUS (entry) == GST_CLOCK_UNSCHEDULED)
+    goto was_unscheduled;
+
   GST_CAT_DEBUG_OBJECT (GST_CAT_TEST_CLOCK, test_clock,
       "requesting asynchronous clock notification at %" GST_TIME_FORMAT,
       GST_TIME_ARGS (GST_CLOCK_ENTRY_TIME (entry)));
@@ -452,6 +467,15 @@ gst_test_clock_wait_async (GstClock * clock, GstClockEntry * entry)
   GST_OBJECT_UNLOCK (test_clock);
 
   return GST_CLOCK_OK;
+
+  /* ERRORS */
+was_unscheduled:
+  {
+    GST_CAT_DEBUG_OBJECT (GST_CAT_TEST_CLOCK, test_clock,
+        "entry was unscheduled");
+    GST_OBJECT_UNLOCK (test_clock);
+    return GST_CLOCK_UNSCHEDULED;
+  }
 }
 
 static void
index de59031..ab0c13d 100644 (file)
@@ -513,12 +513,17 @@ GST_START_TEST (test_single_shot_sync_unschedule)
   GstTestClock *test_clock;
   GstClockID clock_id;
   GtuClockWaitContext *wait_ctx;
+  gboolean wait_complete = FALSE;
 
   clock = gst_test_clock_new_with_start_time (GST_SECOND);
   test_clock = GST_TEST_CLOCK (clock);
 
   clock_id = gst_clock_new_single_shot_id (clock, GST_SECOND);
   gst_clock_id_unschedule (clock_id);
+  /* any wait should timeout immediately */
+  g_assert (gst_clock_id_wait_async (clock_id, test_async_wait_cb,
+          &wait_complete, NULL) == GST_CLOCK_UNSCHEDULED);
+  g_assert (gst_clock_id_wait (clock_id, NULL) == GST_CLOCK_UNSCHEDULED);
   gst_clock_id_unref (clock_id);
 
   clock_id = gst_clock_new_single_shot_id (clock, 2 * GST_SECOND);