浏览代码

Replace polling by a semaphore in hdf5 file

Corentin Salingue 8 年之前
父节点
当前提交
42ed4d9035
共有 1 个文件被更改,包括 26 次插入14 次删除
  1. 26 14
      src/core/disk_ops/disk_hdf5.c

+ 26 - 14
src/core/disk_ops/disk_hdf5.c

@@ -233,7 +233,7 @@ static void * _starpu_hdf5_internal_thread(void * arg)
                         _starpu_hdf5_protect_stop(work->base);
 
                         /* Update event to tell it's finished */
-                        *((int *) work->event) = 1;
+                        starpu_sem_post((starpu_sem_t *) work->event);
 
                         free(work);
                 }
@@ -553,24 +553,24 @@ static void starpu_hdf5_close(void *base, void *obj, size_t size STARPU_ATTRIBUT
 
 static void starpu_hdf5_wait(void * event)
 {
-        volatile int * finished = (int *) event;
+        starpu_sem_t * finished = (starpu_sem_t *) event;
 
-        while (*finished == 0)
-                ;
+        starpu_sem_wait(finished);
 }
 
 static int starpu_hdf5_test(void * event)
 {
-        volatile int * finished = (int *) event;
+        starpu_sem_t * finished = (starpu_sem_t *) event;
 
-        return *finished == 1;
+        return starpu_sem_trywait(finished) == 0;
 }
 
 static int starpu_hdf5_full_read(void *base, void *obj, void **ptr, size_t *size)
 {
         struct starpu_hdf5_obj * dataObj = (struct starpu_hdf5_obj *) obj;
 
-        int finished = 0;
+        starpu_sem_t finished;
+        starpu_sem_init(&finished, 0, 0);
 
         _starpu_hdf5_protect_start(base);
         *size = _starpu_get_size_obj(dataObj);
@@ -581,48 +581,59 @@ static int starpu_hdf5_full_read(void *base, void *obj, void **ptr, size_t *size
         starpu_hdf5_send_work(base, obj, *ptr, 0, *size, (void*) &finished, FULL_READ);
         
         starpu_hdf5_wait(&finished);
+
+        starpu_sem_destroy(&finished);
         
         return 0;
 }
 
 static int starpu_hdf5_full_write(void *base, void *obj, void *ptr, size_t size)
 {
-        int finished = 0;
+        starpu_sem_t finished;
+        starpu_sem_init(&finished, 0, 0);
 
         starpu_hdf5_send_work(base, obj, ptr, 0, size, (void*) &finished, FULL_WRITE);
 
         starpu_hdf5_wait(&finished);
 
+        starpu_sem_destroy(&finished);
+
         return 0;
 }
 
 static int starpu_hdf5_read(void *base, void *obj, void *buf, off_t offset, size_t size)
 {
-        int finished = 0;
+        starpu_sem_t finished;
+        starpu_sem_init(&finished, 0, 0);
 
         starpu_hdf5_send_work(base, obj, buf, offset, size, (void*) &finished, READ);
 
         starpu_hdf5_wait(&finished);
 
+        starpu_sem_destroy(&finished);
+
         return 0;
 }
 
 static int starpu_hdf5_write(void *base, void *obj, const void *buf, off_t offset, size_t size)
 {
-        int finished = 0;
+        starpu_sem_t finished;
+        starpu_sem_init(&finished, 0, 0);
 
         starpu_hdf5_send_work(base, obj, (void *) buf, offset, size, (void*) &finished, WRITE);
 
         starpu_hdf5_wait(&finished);
 
+        starpu_sem_destroy(&finished);
+
         return 0;
 }
 
 static void * starpu_hdf5_async_read(void *base, void *obj, void *buf, off_t offset, size_t size)
 {
-        int * finished;
+        starpu_sem_t * finished;
         _STARPU_MALLOC(finished, sizeof(*finished));
-        *finished = 0;
+        starpu_sem_init(finished, 0, 0);
 
         starpu_hdf5_send_work(base, obj, buf, offset, size, (void*) finished, READ);
 
@@ -631,9 +642,9 @@ static void * starpu_hdf5_async_read(void *base, void *obj, void *buf, off_t off
 
 static void * starpu_hdf5_async_write(void *base, void *obj, void *buf, off_t offset, size_t size)
 {
-        int * finished;
+        starpu_sem_t * finished;
         _STARPU_MALLOC(finished, sizeof(*finished));
-        *finished = 0;
+        starpu_sem_init(finished, 0, 0);
 
         starpu_hdf5_send_work(base, obj, (void *) buf, offset, size, (void*) finished, WRITE);
 
@@ -642,6 +653,7 @@ static void * starpu_hdf5_async_write(void *base, void *obj, void *buf, off_t of
 
 static void starpu_hdf5_free_request(void * event)
 {
+        starpu_sem_destroy(event);
         free(event);
 }