[Beignet] [PATCH 2/9] Add WAIT_ON_COND and WAIT_ON_COND to base object.
junyan.he at inbox.com
junyan.he at inbox.com
Tue Aug 2 11:38:49 UTC 2016
From: Junyan He <junyan.he at intel.com>
Also fix a bug in get ownership.
Signed-off-by: Junyan He <junyan.he at intel.com>
---
src/cl_base_object.c | 27 +++++++++++++++++++++++++++
src/cl_base_object.h | 17 +++++++++++------
2 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/src/cl_base_object.c b/src/cl_base_object.c
index 4661977..00c4b35 100644
--- a/src/cl_base_object.c
+++ b/src/cl_base_object.c
@@ -29,6 +29,7 @@ cl_object_init_base(cl_base_object obj, cl_ulong magic)
pthread_mutex_init(&obj->mutex, NULL);
pthread_cond_init(&obj->cond, NULL);
obj->owner = invalid_thread_id;
+ list_init(&obj->node);
}
LOCAL void
@@ -53,6 +54,12 @@ cl_object_destroy_base(cl_base_object obj)
assert(0);
}
+ if (!list_empty(&obj->node)) {
+ DEBUGP(DL_ERROR, "CL object %p, call destroy while still belong to some object %p",
+ obj, obj->node.prev);
+ assert(0);
+ }
+
obj->magic = CL_OBJECT_INVALID_MAGIC;
pthread_mutex_destroy(&obj->mutex);
pthread_cond_destroy(&obj->cond);
@@ -68,6 +75,12 @@ cl_object_take_ownership(cl_base_object obj, cl_int wait)
self = pthread_self();
pthread_mutex_lock(&obj->mutex);
+
+ if (pthread_equal(obj->owner, self)) { // Already get
+ pthread_mutex_unlock(&obj->mutex);
+ return 1;
+ }
+
if (pthread_equal(obj->owner, invalid_thread_id)) {
obj->owner = self;
pthread_mutex_unlock(&obj->mutex);
@@ -100,3 +113,17 @@ cl_object_release_ownership(cl_base_object obj)
pthread_mutex_unlock(&obj->mutex);
}
+
+LOCAL void
+cl_object_wait_on_cond(cl_base_object obj)
+{
+ assert(CL_OBJECT_IS_VALID(obj));
+ pthread_cond_wait(&obj->cond, &obj->mutex);
+}
+
+LOCAL void
+cl_object_notify_cond(cl_base_object obj)
+{
+ assert(CL_OBJECT_IS_VALID(obj));
+ pthread_cond_broadcast(&obj->cond);
+}
diff --git a/src/cl_base_object.h b/src/cl_base_object.h
index cba4330..42a4cfa 100644
--- a/src/cl_base_object.h
+++ b/src/cl_base_object.h
@@ -44,12 +44,13 @@
*************************************************************************/
typedef struct _cl_base_object {
- DEFINE_ICD(dispatch); /* Dispatch function table for icd */
- cl_ulong magic; /* Magic number for each CL object */
- atomic_t ref; /* Reference for each CL object */
- pthread_mutex_t mutex; /* THe mutex to protect this object MT safe */
- pthread_cond_t cond; /* Condition to wait for getting the object */
- pthread_t owner; /* The thread which own this object */
+ DEFINE_ICD(dispatch); /* Dispatch function table for icd */
+ cl_ulong magic; /* Magic number for each CL object */
+ atomic_t ref; /* Reference for each CL object */
+ list_head node; /* CL object node belong to some container */
+ pthread_mutex_t mutex; /* THe mutex to protect this object MT safe */
+ pthread_cond_t cond; /* Condition to wait for getting the object */
+ pthread_t owner; /* The thread which own this object */
} _cl_base_object;
typedef struct _cl_base_object *cl_base_object;
@@ -68,10 +69,14 @@ extern void cl_object_init_base(cl_base_object obj, cl_ulong magic);
extern void cl_object_destroy_base(cl_base_object obj);
extern cl_int cl_object_take_ownership(cl_base_object obj, cl_int wait);
extern void cl_object_release_ownership(cl_base_object obj);
+extern void cl_object_wait_on_cond(cl_base_object obj);
+extern void cl_object_notify_cond(cl_base_object obj);
#define CL_OBJECT_INIT_BASE(obj, magic) (cl_object_init_base((cl_base_object)obj, magic))
#define CL_OBJECT_DESTROY_BASE(obj) (cl_object_destroy_base((cl_base_object)obj))
#define CL_OBJECT_TAKE_OWNERSHIP(obj, wait) (cl_object_take_ownership((cl_base_object)obj, wait))
#define CL_OBJECT_RELEASE_OWNERSHIP(obj) (cl_object_release_ownership((cl_base_object)obj))
+#define CL_OBJECT_WAIT_ON_COND(obj) (cl_object_wait_on_cond((cl_base_object)obj))
+#define CL_OBJECT_NOTIFY_COND(obj) (cl_object_notify_cond((cl_base_object)obj))
#endif /* __CL_BASE_OBJECT_H__ */
--
2.7.4
____________________________________________________________
Can't remember your password? Do you need a strong and secure password?
Use Password manager! It stores your passwords & protects your account.
Check it out at http://mysecurelogon.com/manager
More information about the Beignet
mailing list