diff --git a/src/mzscheme/src/mzrt.c b/src/mzscheme/src/mzrt.c index 8832082806..730186d5ed 100644 --- a/src/mzscheme/src/mzrt.c +++ b/src/mzscheme/src/mzrt.c @@ -240,6 +240,32 @@ int mzrt_rwlock_destroy(mzrt_rwlock *lock) { return pthread_rwlock_destroy(&lock->lock); } +struct mzrt_mutex { + pthread_mutex_t mutex; +}; + +int mzrt_mutex_create(mzrt_mutex **mutex) { + *mutex = malloc(sizeof(mzrt_mutex)); + return pthread_mutex_init(&(*mutex)->mutex, NULL); +} + +int mzrt_mutex_lock(mzrt_mutex *mutex) { + return pthread_mutex_lock(&mutex->mutex); +} + +int mzrt_mutex_trylock(mzrt_mutex *mutex) { + return pthread_mutex_trylock(&mutex->mutex); +} + +int mzrt_mutex_unlock(mzrt_mutex *mutex) { + return pthread_mutex_unlock(&mutex->mutex); +} + +int mzrt_mutex_destroy(mzrt_mutex *mutex) { + return pthread_mutex_destroy(&mutex->mutex); +} + + #ifdef MZ_XFORM END_XFORM_SUSPEND; #endif @@ -353,6 +379,37 @@ int mzrt_rwlock_destroy(mzrt_rwlock *lock) { return rc; } +struct mzrt_mutex { + CRITICAL_SECTION critical_section; +}; + +int mzrt_mutex_create(mzrt_mutex **mutex) { + *mutex = malloc(sizeof(mzrt_mutex)); + InitializeCriticalSection(&(*mutex)->critical_section); + return 0; +} + +int mzrt_mutex_lock(mzrt_mutex *mutex) { + EnterCriticalSection(&(*mutex)->critical_section); + return 0; +} + +int mzrt_mutex_trylock(mzrt_mutex *mutex) { + if (!TryEnterCriticalSection(&(*mutex)->critical_section)) + return 1; + return 0; +} + +int mzrt_mutex_unlock(mzrt_mutex *mutex) { + LeaveCriticalSection(&(*mutex)->critical_section); + return 0; +} + +int mzrt_mutex_destroy(mzrt_mutex *mutex) { + DeleteCriticalSection(&(*mutex)->critical_section); + return 0; +} + #ifdef MZ_XFORM END_XFORM_SUSPEND; #endif diff --git a/src/mzscheme/src/mzrt.h b/src/mzscheme/src/mzrt.h index a5de9a1917..98c96b864a 100644 --- a/src/mzscheme/src/mzrt.h +++ b/src/mzscheme/src/mzrt.h @@ -36,6 +36,8 @@ void *mz_proc_thread_wait(mz_proc_thread *thread); void mzrt_sleep(int seconds); +int mz_proc_thread_self(); +int mz_proc_thread_id(mz_proc_thread* thread); /****************** THREAD RWLOCK ******************************************/ /* mzrt_rwlock_*.c */ @@ -48,6 +50,14 @@ int mzrt_rwlock_trywrlock(mzrt_rwlock *lock); int mzrt_rwlock_unlock(mzrt_rwlock *lock); int mzrt_rwlock_destroy(mzrt_rwlock *lock); +/****************** THREAD MUTEX ******************************************/ +typedef struct mzrt_mutex mzrt_mutex; /* OPAQUE DEFINITION */ +int mzrt_mutex_create(mzrt_mutex **mutex); +int mzrt_mutex_lock(mzrt_mutex *mutex); +int mzrt_mutex_trylock(mzrt_mutex *mutex); +int mzrt_mutex_unlock(mzrt_mutex *mutex); +int mzrt_mutex_destroy(mzrt_mutex *mutex); + #endif