repair leak in managing OS-level locks

This commit is contained in:
Matthew Flatt 2015-08-17 09:46:07 -06:00
parent 693cdc673d
commit 641c56b6e9

View File

@ -468,12 +468,15 @@ int mzrt_rwlock_unlock(mzrt_rwlock *lock) {
} }
int mzrt_rwlock_destroy(mzrt_rwlock *lock) { int mzrt_rwlock_destroy(mzrt_rwlock *lock) {
pthread_mutex_destroy(&lock->m); int r = 0;
pthread_cond_destroy(&lock->cr);
pthread_cond_destroy(&lock->cw);
free(lock);
return 0; r |= pthread_mutex_destroy(&lock->m);
r |= pthread_cond_destroy(&lock->cr);
r |= pthread_cond_destroy(&lock->cw);
if (!r) free(lock);
return r;
} }
# endif # endif
@ -500,7 +503,10 @@ int mzrt_mutex_unlock(mzrt_mutex *mutex) {
} }
int mzrt_mutex_destroy(mzrt_mutex *mutex) { int mzrt_mutex_destroy(mzrt_mutex *mutex) {
return pthread_mutex_destroy(&mutex->mutex); int r;
r = pthread_mutex_destroy(&mutex->mutex);
if (!r) free(mutex);
return r;
} }
struct mzrt_cond { struct mzrt_cond {
@ -532,7 +538,10 @@ int mzrt_cond_broadcast(mzrt_cond *cond) {
} }
int mzrt_cond_destroy(mzrt_cond *cond) { int mzrt_cond_destroy(mzrt_cond *cond) {
return pthread_cond_destroy(&cond->cond); int r;
r = pthread_cond_destroy(&cond->cond);
if (!r) free(cond);
return r;
} }
struct mzrt_sema { struct mzrt_sema {
@ -588,11 +597,14 @@ int mzrt_sema_post(mzrt_sema *s)
int mzrt_sema_destroy(mzrt_sema *s) int mzrt_sema_destroy(mzrt_sema *s)
{ {
pthread_mutex_destroy(&s->m); int r = 0;
pthread_cond_destroy(&s->c);
free(s);
return 0; r |= pthread_mutex_destroy(&s->m);
r |= pthread_cond_destroy(&s->c);
if (!r) free(s);
return r;
} }
#endif #endif
@ -697,7 +709,8 @@ int mzrt_rwlock_destroy(mzrt_rwlock *lock) {
int rc = 1; int rc = 1;
rc &= CloseHandle(lock->readEvent); rc &= CloseHandle(lock->readEvent);
rc &= CloseHandle(lock->writeMutex); rc &= CloseHandle(lock->writeMutex);
return rc; if (rc) free(lock);
return !rc;
} }
struct mzrt_mutex { struct mzrt_mutex {
@ -729,6 +742,7 @@ int mzrt_mutex_unlock(mzrt_mutex *mutex) {
int mzrt_mutex_destroy(mzrt_mutex *mutex) { int mzrt_mutex_destroy(mzrt_mutex *mutex) {
DeleteCriticalSection(&mutex->critical_section); DeleteCriticalSection(&mutex->critical_section);
free(mutex);
return 0; return 0;
} }
@ -791,10 +805,12 @@ int mzrt_sema_post(mzrt_sema *s)
int mzrt_sema_destroy(mzrt_sema *s) int mzrt_sema_destroy(mzrt_sema *s)
{ {
CloseHandle(s->ws); int r;
free(s);
return 0; r = CloseHandle(s->ws);
if (r) free(s);
return !r;
} }
#endif #endif