diff options
Diffstat (limited to 'stdlib/stdlib.c')
| -rw-r--r-- | stdlib/stdlib.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/stdlib/stdlib.c b/stdlib/stdlib.c index cb9d2213..0266e788 100644 --- a/stdlib/stdlib.c +++ b/stdlib/stdlib.c @@ -621,4 +621,34 @@ public void sleep_num(double seconds) nanosleep(&ts, NULL); } +static void use_mutexed(Closure_t fn, void *userdata) +{ + void (*call)(void*, void*) = fn.fn; + struct data_t { + pthread_mutex_t mutex; + char item[0] __attribute__ ((aligned (8))); + }; + pthread_mutex_t *mutex = &((struct data_t*)userdata)->mutex; + pthread_mutex_lock(mutex); + void *mutexed_item = (void*)((struct data_t*)userdata)->item; + call(mutexed_item, fn.userdata); + pthread_mutex_unlock(mutex); +} + +public Closure_t _mutexed(const void *item, size_t size) +{ + struct data_t { + pthread_mutex_t mutex; + char item[size] __attribute__ ((aligned (8))); + }; + struct data_t *userdata = GC_MALLOC(sizeof(struct data_t)); + + pthread_mutex_init(&userdata->mutex, NULL); + memcpy(userdata->item, item, size); + return (Closure_t){ + .fn=(void*)use_mutexed, + .userdata=(void*)userdata, + }; +} + // vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0 |
