/* Free a mutex */ TSRM_API void tsrm_mutex_free(MUTEX_T mutexp) { if (mutexp) { #ifdef TSRM_WIN32 DeleteCriticalSection(mutexp); free(mutexp); #elif defined(GNUPTH) free(mutexp); #elif defined(PTHREADS) pthread_mutex_destroy(mutexp); free(mutexp); #elif defined(NSAPI) crit_terminate(mutexp); #elif defined(PI3WEB) PISync_delete(mutexp); #elif defined(TSRM_ST) st_mutex_destroy(mutexp); #elif defined(BETHREADS) delete_sem(mutexp->sem); free(mutexp); #endif } #ifdef THR_DEBUG printf("Mutex freed thread: %d\n",mythreadid()); #endif }
static void caml_thread_reinitialize(void) { caml_thread_t thr, next; struct channel * chan; /* Remove all other threads (now nonexistent) from the doubly-linked list of threads */ thr = curr_thread->next; while (thr != curr_thread) { next = thr->next; stat_free(thr); thr = next; } curr_thread->next = curr_thread; curr_thread->prev = curr_thread; all_threads = curr_thread; /* Reinitialize the master lock machinery, just in case the fork happened while other threads were doing leave_blocking_section */ st_masterlock_init(&caml_master_lock); /* Tick thread is not currently running in child process, will be re-created at next Thread.create */ caml_tick_thread_running = 0; /* Destroy all IO mutexes; will be reinitialized on demand */ for (chan = caml_all_opened_channels; chan != NULL; chan = chan->next) { if (chan->mutex != NULL) { st_mutex_destroy(chan->mutex); chan->mutex = NULL; } } }
/* Free a mutex */ TSRM_API void tsrm_mutex_free(MUTEX_T mutexp) {/*{{{*/ if (mutexp) { #ifdef TSRM_WIN32 DeleteCriticalSection(mutexp); free(mutexp); #elif defined(GNUPTH) free(mutexp); #elif defined(PTHREADS) pthread_mutex_destroy(mutexp); free(mutexp); #elif defined(TSRM_ST) st_mutex_destroy(mutexp); #endif } #ifdef THR_DEBUG printf("Mutex freed thread: %d\n",mythreadid()); #endif }/*}}}*/
static void caml_mutex_finalize(value wrapper) { st_mutex_destroy(Mutex_val(wrapper)); }
static void caml_io_mutex_free(struct channel *chan) { st_mutex mutex = chan->mutex; if (mutex != NULL) st_mutex_destroy(mutex); }