genlock: Update version to match release on CodeAurora Forum
Change-Id: Ia45afc73723a9abc1cd55da8a8d0013c171b9855
Signed-off-by: Naseer Ahmed <naseer@codeaurora.org>
diff --git a/libgenlock/genlock.cpp b/libgenlock/genlock.cpp
index bfec641..150ae13 100644
--- a/libgenlock/genlock.cpp
+++ b/libgenlock/genlock.cpp
@@ -54,7 +54,8 @@
} else if (lockType & GENLOCK_READ_LOCK) {
kLockType = GENLOCK_RDLOCK;
} else {
- ALOGE("%s: invalid lockType (lockType = %d)", __FUNCTION__, lockType);
+ ALOGE("%s: invalid lockType (lockType = %d)",
+ __FUNCTION__, lockType);
return -1;
}
return kLockType;
@@ -62,35 +63,50 @@
/* Internal function to perform the actual lock/unlock operations */
genlock_status_t perform_lock_unlock_operation(native_handle_t *buffer_handle,
- int lockType, int timeout)
+ int lockType, int timeout,
+ int flags)
{
if (private_handle_t::validate(buffer_handle)) {
ALOGE("%s: handle is invalid", __FUNCTION__);
return GENLOCK_FAILURE;
}
- private_handle_t *hnd = reinterpret_cast<private_handle_t*>(buffer_handle);
+ private_handle_t *hnd = reinterpret_cast<private_handle_t*>
+ (buffer_handle);
if ((hnd->flags & private_handle_t::PRIV_FLAGS_UNSYNCHRONIZED) == 0) {
if (hnd->genlockPrivFd < 0) {
- ALOGE("%s: the lock has not been created, or has not been attached",
- __FUNCTION__);
+ ALOGE("%s: the lock has not been created,"
+ "or has not been attached", __FUNCTION__);
return GENLOCK_FAILURE;
}
genlock_lock lock;
lock.op = lockType;
- lock.flags = 0;
+ lock.flags = flags;
lock.timeout = timeout;
lock.fd = hnd->genlockHandle;
- if (ioctl(hnd->genlockPrivFd, GENLOCK_IOC_LOCK, &lock)) {
- ALOGE("%s: GENLOCK_IOC_LOCK failed (lockType0x%x, err=%s fd=%d)", __FUNCTION__,
+#ifdef GENLOCK_IOC_DREADLOCK
+ if (ioctl(hnd->genlockPrivFd, GENLOCK_IOC_DREADLOCK, &lock)) {
+ ALOGE("%s: GENLOCK_IOC_DREADLOCK failed (lockType0x%x,"
+ "err=%s fd=%d)", __FUNCTION__,
lockType, strerror(errno), hnd->fd);
if (ETIMEDOUT == errno)
return GENLOCK_TIMEDOUT;
return GENLOCK_FAILURE;
}
+#else
+ // depreciated
+ if (ioctl(hnd->genlockPrivFd, GENLOCK_IOC_LOCK, &lock)) {
+ ALOGE("%s: GENLOCK_IOC_LOCK failed (lockType0x%x, err=%s fd=%d)"
+ ,__FUNCTION__, lockType, strerror(errno), hnd->fd);
+ if (ETIMEDOUT == errno)
+ return GENLOCK_TIMEDOUT;
+
+ return GENLOCK_FAILURE;
+ }
+#endif
}
return GENLOCK_NO_ERROR;
}
@@ -269,7 +285,7 @@
ALOGW("%s: trying to lock a buffer with timeout = 0", __FUNCTION__);
}
// Call the private function to perform the lock operation specified.
- ret = perform_lock_unlock_operation(buffer_handle, kLockType, timeout);
+ ret = perform_lock_unlock_operation(buffer_handle, kLockType, timeout, 0);
#endif
return ret;
}
@@ -287,7 +303,7 @@
#ifdef USE_GENLOCK
// Do the unlock operation by setting the unlock flag. Timeout is always
// 0 in this case.
- ret = perform_lock_unlock_operation(buffer_handle, GENLOCK_UNLOCK, 0);
+ ret = perform_lock_unlock_operation(buffer_handle, GENLOCK_UNLOCK, 0, 0);
#endif
return ret;
}
@@ -320,10 +336,38 @@
lock.fd = hnd->genlockHandle;
lock.timeout = timeout;
if (ioctl(hnd->genlockPrivFd, GENLOCK_IOC_WAIT, &lock)) {
- ALOGE("%s: GENLOCK_IOC_WAIT failed (err=%s)", __FUNCTION__, strerror(errno));
+ ALOGE("%s: GENLOCK_IOC_WAIT failed (err=%s)", __FUNCTION__,
+ strerror(errno));
return GENLOCK_FAILURE;
}
}
#endif
return GENLOCK_NO_ERROR;
}
+
+/*
+ * Convert a write lock that we own to a read lock
+ *
+ * @param: handle of the buffer
+ * @param: timeout value for the wait.
+ * return: error status.
+ */
+genlock_status_t genlock_write_to_read(native_handle_t *buffer_handle,
+ int timeout) {
+ genlock_status_t ret = GENLOCK_NO_ERROR;
+#ifdef USE_GENLOCK
+ if (0 == timeout) {
+ ALOGW("%s: trying to lock a buffer with timeout = 0", __FUNCTION__);
+ }
+ // Call the private function to perform the lock operation specified.
+#ifdef GENLOCK_IOC_DREADLOCK
+ ret = perform_lock_unlock_operation(buffer_handle, GENLOCK_RDLOCK, timeout,
+ GENLOCK_WRITE_TO_READ);
+#else
+ // depreciated
+ ret = perform_lock_unlock_operation(buffer_handle, GENLOCK_RDLOCK,
+ timeout, 0);
+#endif
+#endif
+ return ret;
+}
diff --git a/libgenlock/genlock.h b/libgenlock/genlock.h
index 0995557..1976c0d 100644
--- a/libgenlock/genlock.h
+++ b/libgenlock/genlock.h
@@ -79,15 +79,17 @@
genlock_status_t genlock_attach_lock(native_handle_t *buffer_handle);
/*
- * Lock the buffer specified by the buffer handle. The lock held by the buffer
- * is specified by the lockType. This function will block if a write lock is
- * requested on the buffer which has previously been locked for a read or write
- * operation. A buffer can be locked by multiple clients for read. An optional
- * timeout value can be specified. By default, there is no timeout.
+ * Lock the buffer specified by the buffer handle. The lock held by the
+ * buffer is specified by the lockType. This function will block if a write
+ * lock is requested on the buffer which has previously been locked for a
+ * read or write operation. A buffer can be locked by multiple clients for
+ * read. An optional timeout value can be specified.
+ * By default, there is no timeout.
*
* @param: handle of the buffer
* @param: type of lock to be acquired by the buffer.
- * @param: timeout value in ms. GENLOCK_MAX_TIMEOUT is the maximum timeout value.
+ * @param: timeout value in ms. GENLOCK_MAX_TIMEOUT is the maximum timeout
+ * value.
* @return error status.
*/
genlock_status_t genlock_lock_buffer(native_handle_t *buffer_handle,
@@ -111,8 +113,17 @@
*/
genlock_status_t genlock_wait(native_handle_t *buffer_handle, int timeout);
+ /*
+ * Convert a write lock that we own to a read lock
+ *
+ * @param: handle of the buffer
+ * @param: timeout value for the wait.
+ * return: error status.
+ */
+ genlock_status_t genlock_write_to_read(native_handle_t *buffer_handle,
+ int timeout);
+
#ifdef __cplusplus
}
#endif
-
#endif