access_mode &= ~GST_LOCK_FLAG_EXCLUSIVE;
}
- if (access_mode) {
- /* shared counter > 1 and write access is not allowed */
- if (access_mode & GST_LOCK_FLAG_WRITE && IS_SHARED (state))
- goto lock_failed;
+ /* shared counter > 1 and write access is not allowed */
+ if (((state & GST_LOCK_FLAG_WRITE) != 0
+ || (access_mode & GST_LOCK_FLAG_WRITE) != 0)
+ && IS_SHARED (newstate))
+ goto lock_failed;
+ if (access_mode) {
if ((state & LOCK_FLAG_MASK) == 0) {
/* nothing mapped, set access_mode */
newstate |= access_mode;
GST_END_TEST;
+GST_START_TEST (test_lock)
+{
+ GstMemory *mem;
+
+ mem = gst_allocator_alloc (NULL, 10, NULL);
+ fail_unless (mem != NULL);
+
+ /* test exclusivity */
+ fail_unless (gst_memory_lock (mem, GST_MAP_WRITE | GST_LOCK_FLAG_EXCLUSIVE));
+ fail_if (gst_memory_lock (mem, GST_LOCK_FLAG_EXCLUSIVE));
+ fail_unless (gst_memory_lock (mem, GST_MAP_WRITE));
+ gst_memory_unlock (mem, GST_MAP_WRITE | GST_LOCK_FLAG_EXCLUSIVE);
+ gst_memory_unlock (mem, GST_MAP_WRITE);
+
+ /* no lock here */
+
+ fail_unless (gst_memory_lock (mem, GST_MAP_READ | GST_LOCK_FLAG_EXCLUSIVE));
+ fail_unless (gst_memory_lock (mem, GST_MAP_READ | GST_LOCK_FLAG_EXCLUSIVE));
+ gst_memory_unlock (mem, GST_MAP_READ | GST_LOCK_FLAG_EXCLUSIVE);
+ gst_memory_unlock (mem, GST_MAP_READ | GST_LOCK_FLAG_EXCLUSIVE);
+
+ /* no lock here */
+
+ fail_unless (gst_memory_lock (mem,
+ GST_MAP_READWRITE | GST_LOCK_FLAG_EXCLUSIVE));
+ fail_unless (gst_memory_lock (mem, GST_MAP_READ));
+ fail_if (gst_memory_lock (mem, GST_MAP_READ | GST_LOCK_FLAG_EXCLUSIVE));
+ fail_if (gst_memory_lock (mem, GST_LOCK_FLAG_EXCLUSIVE));
+ fail_unless (gst_memory_lock (mem, GST_MAP_WRITE));
+ gst_memory_unlock (mem, GST_MAP_WRITE);
+ gst_memory_unlock (mem, GST_MAP_READ);
+ gst_memory_unlock (mem, GST_MAP_READWRITE | GST_LOCK_FLAG_EXCLUSIVE);
+
+ gst_memory_unref (mem);
+}
+
+GST_END_TEST;
static Suite *
gst_memory_suite (void)
tcase_add_test (tc_chain, test_map_nested);
tcase_add_test (tc_chain, test_map_resize);
tcase_add_test (tc_chain, test_alloc_params);
+ tcase_add_test (tc_chain, test_lock);
return s;
}