void _d_criticalenter(D_CRITICAL_SECTION *dcs) { if (!dcs_list) { _STI_critical_init(); atexit(_STD_critical_term); } //printf("_d_criticalenter(dcs = x%x)\n", dcs); if (!dcs->next) { pthread_mutex_lock(&critical_section.cs); if (!dcs->next) // if, in the meantime, another thread didn't set it { dcs->next = dcs_list; dcs_list = dcs; pthread_mutex_init(&dcs->cs, &_criticals_attr); } pthread_mutex_unlock(&critical_section.cs); } pthread_mutex_lock(&dcs->cs); }
void _d_criticalenter(D_CRITICAL_SECTION *dcs) { if (!dcs_list) { _STI_critical_init(); atexit(_STD_critical_term); } //printf("_d_criticalenter(dcs = x%x)\n", dcs); if (!dcs->next) { pthread_mutex_lock(&critical_section.cs); if (!dcs->next) // if, in the meantime, another thread didn't set it { dcs->next = dcs_list; dcs_list = dcs; #ifndef PTHREAD_MUTEX_ALREADY_RECURSIVE pthread_mutex_init(&dcs->cs, &_criticals_attr); #else pthread_mutex_init(&dcs->cs, NULL); #endif } pthread_mutex_unlock(&critical_section.cs); } pthread_mutex_lock(&dcs->cs); }