61 static ibool os_sync_mutex_inited = FALSE;
63 static ibool os_sync_free_called = FALSE;
75 UNIV_INTERN ulint os_event_count = 0;
76 UNIV_INTERN ulint os_mutex_count = 0;
77 UNIV_INTERN ulint os_fast_mutex_count = 0;
80 static const ulint MICROSECS_IN_A_SECOND = 1000000;
90 static
void os_cond_module_init(
void);
94 typedef VOID (WINAPI* InitializeConditionVariableProc)
95 (PCONDITION_VARIABLE ConditionVariable);
96 static InitializeConditionVariableProc initialize_condition_variable;
98 typedef BOOL (WINAPI* SleepConditionVariableCSProc)
99 (PCONDITION_VARIABLE ConditionVariable,
100 PCRITICAL_SECTION CriticalSection,
101 DWORD dwMilliseconds);
102 static SleepConditionVariableCSProc sleep_condition_variable;
104 typedef VOID (WINAPI* WakeAllConditionVariableProc)
105 (PCONDITION_VARIABLE ConditionVariable);
106 static WakeAllConditionVariableProc wake_all_condition_variable;
108 typedef VOID (WINAPI* WakeConditionVariableProc)
109 (PCONDITION_VARIABLE ConditionVariable);
110 static WakeConditionVariableProc wake_condition_variable;
124 ut_a(initialize_condition_variable != NULL);
125 initialize_condition_variable(cond);
127 ut_a(pthread_cond_init(cond, NULL) == 0);
141 const struct timespec* abstime
152 ut_a(sleep_condition_variable != NULL);
154 ret = sleep_condition_variable(cond, mutex, time_in_ms);
157 err = GetLastError();
164 if ((err == WAIT_TIMEOUT) || (err == ERROR_TIMEOUT)) {
175 ret = pthread_cond_timedwait(cond, mutex, abstime);
186 fprintf(stderr,
" InnoDB: pthread_cond_timedwait() returned: "
187 "%d: abstime={%lu,%lu}\n",
188 ret, (ulong) abstime->tv_sec, (ulong) abstime->tv_nsec);
192 return(ret == ETIMEDOUT);
208 ut_a(sleep_condition_variable != NULL);
209 ut_a(sleep_condition_variable(cond, mutex, INFINITE));
211 ut_a(pthread_cond_wait(cond, mutex) == 0);
226 ut_a(wake_all_condition_variable != NULL);
227 wake_all_condition_variable(cond);
229 ut_a(pthread_cond_broadcast(cond) == 0);
244 ut_a(wake_condition_variable != NULL);
245 wake_condition_variable(cond);
247 ut_a(pthread_cond_signal(cond) == 0);
262 ut_a(pthread_cond_destroy(cond) == 0);
272 os_cond_module_init(
void)
278 if (!srv_use_native_conditions)
281 h_dll = GetModuleHandle(
"kernel32");
283 initialize_condition_variable = (InitializeConditionVariableProc)
284 GetProcAddress(h_dll,
"InitializeConditionVariable");
285 sleep_condition_variable = (SleepConditionVariableCSProc)
286 GetProcAddress(h_dll,
"SleepConditionVariableCS");
287 wake_all_condition_variable = (WakeAllConditionVariableProc)
288 GetProcAddress(h_dll,
"WakeAllConditionVariable");
289 wake_condition_variable = (WakeConditionVariableProc)
290 GetProcAddress(h_dll,
"WakeConditionVariable");
293 ut_a(initialize_condition_variable);
294 ut_a(sleep_condition_variable);
295 ut_a(wake_all_condition_variable);
296 ut_a(wake_condition_variable);
310 os_sync_mutex = NULL;
311 os_sync_mutex_inited = FALSE;
314 os_cond_module_init();
318 os_sync_mutex_inited = TRUE;
331 os_sync_free_called = TRUE;
344 if (mutex == os_sync_mutex) {
348 os_sync_mutex_inited = FALSE;
355 os_sync_free_called = FALSE;
373 if(!srv_use_native_conditions) {
377 event->handle = CreateEvent(NULL,
381 if (!event->handle) {
383 "InnoDB: Could not create a Windows event"
384 " semaphore; Windows error %lu\n",
385 (ulong) GetLastError());
399 event->is_set = FALSE;
407 event->signal_count = 1;
413 if (os_sync_mutex != NULL) {
422 if (os_sync_mutex != NULL) {
441 if (!srv_use_native_conditions) {
442 ut_a(SetEvent(event->handle));
454 event->is_set = TRUE;
455 event->signal_count += 1;
456 os_cond_broadcast(&(event->
cond_var));
481 if(!srv_use_native_conditions) {
482 ut_a(ResetEvent(event->handle));
492 event->is_set = FALSE;
494 ret =
event->signal_count;
504 os_event_free_internal(
509 if(!srv_use_native_conditions) {
511 ut_a(CloseHandle(event->handle));
520 os_cond_destroy(&(event->
cond_var));
542 if(!srv_use_native_conditions){
543 ut_a(CloseHandle(event->handle));
549 os_cond_destroy(&(event->
cond_var));
589 ib_int64_t reset_sig_count)
593 ib_int64_t old_signal_count;
596 if(!srv_use_native_conditions) {
604 err = WaitForSingleObject(event->handle, INFINITE);
606 ut_a(err == WAIT_OBJECT_0);
617 if (reset_sig_count) {
618 old_signal_count = reset_sig_count;
620 old_signal_count =
event->signal_count;
658 ib_int64_t reset_sig_count)
663 ibool timed_out = FALSE;
664 ib_int64_t old_signal_count;
669 if (!srv_use_native_conditions) {
675 time_in_ms = time_in_usec / 1000;
676 err = WaitForSingleObject(event->handle, time_in_ms);
678 err = WaitForSingleObject(event->handle, INFINITE);
681 if (err == WAIT_OBJECT_0) {
683 }
else if ((err == WAIT_TIMEOUT) || (err == ERROR_TIMEOUT)) {
691 ut_a(sleep_condition_variable != NULL);
694 time_in_ms = time_in_usec / 1000;
696 time_in_ms = INFINITE;
700 struct timespec abstime;
714 tv.tv_usec += time_in_usec;
716 if ((ulint) tv.tv_usec >= MICROSECS_IN_A_SECOND) {
717 tv.tv_sec += time_in_usec / MICROSECS_IN_A_SECOND;
718 tv.tv_usec %= MICROSECS_IN_A_SECOND;
721 abstime.tv_sec = tv.tv_sec;
722 abstime.tv_nsec = tv.tv_usec * 1000;
724 abstime.tv_nsec = 999999999;
725 abstime.tv_sec = (time_t) ULINT_MAX;
728 ut_a(abstime.tv_nsec <= 999999999);
734 if (reset_sig_count) {
735 old_signal_count = reset_sig_count;
737 old_signal_count =
event->signal_count;
747 timed_out = os_cond_wait_timed(
756 }
while (!timed_out);
785 mutex_str->
handle = mutex;
786 mutex_str->
count = 0;
789 if (UNIV_LIKELY(os_sync_mutex_inited)) {
798 if (UNIV_LIKELY(os_sync_mutex_inited)) {
846 if (UNIV_LIKELY(!os_sync_free_called)) {
847 os_event_free_internal(mutex->
event);
850 if (UNIV_LIKELY(os_sync_mutex_inited)) {
858 if (UNIV_LIKELY(os_sync_mutex_inited)) {
878 InitializeCriticalSection((LPCRITICAL_SECTION) fast_mutex);
880 ut_a(0 == pthread_mutex_init(fast_mutex, NULL));
882 if (UNIV_LIKELY(os_sync_mutex_inited)) {
889 os_fast_mutex_count++;
891 if (UNIV_LIKELY(os_sync_mutex_inited)) {
905 EnterCriticalSection((LPCRITICAL_SECTION) fast_mutex);
907 pthread_mutex_lock(fast_mutex);
920 LeaveCriticalSection(fast_mutex);
922 pthread_mutex_unlock(fast_mutex);
937 DeleteCriticalSection((LPCRITICAL_SECTION) fast_mutex);
941 ret = pthread_mutex_destroy(fast_mutex);
943 if (UNIV_UNLIKELY(ret != 0)) {
946 " InnoDB: error: return value %lu when calling\n"
947 "InnoDB: pthread_mutex_destroy().\n", (ulint)ret);
949 "InnoDB: Byte contents of the pthread mutex at %p:\n",
955 if (UNIV_LIKELY(os_sync_mutex_inited)) {
962 ut_ad(os_fast_mutex_count > 0);
963 os_fast_mutex_count--;
965 if (UNIV_LIKELY(os_sync_mutex_inited)) {
UNIV_INTERN void os_fast_mutex_unlock(os_fast_mutex_t *fast_mutex)
UNIV_INTERN void os_mutex_free(os_mutex_t mutex)
pthread_mutex_t os_fast_mutex_t
UNIV_INTERN void os_fast_mutex_free(os_fast_mutex_t *fast_mutex)
UNIV_INTERN void ut_print_buf(FILE *file, const void *buf, ulint len)
UNIV_INTERN os_event_t os_event_create(const char *name)
UNIV_INTERN void * ut_malloc(ulint n)
UNIV_INTERN void os_fast_mutex_init(os_fast_mutex_t *fast_mutex)
UNIV_INTERN void os_mutex_enter(os_mutex_t mutex)
#define OS_SYNC_INFINITE_TIME
typedef UT_LIST_BASE_NODE_T(mutex_t) ut_list_base_node_t
#define UT_LIST_REMOVE(NAME, BASE, N)
UNIV_INTERN void os_sync_init(void)
UNIV_INTERN void os_mutex_exit(os_mutex_t mutex)
UNIV_INTERN void os_event_set(os_event_t event)
UNIV_INTERN ib_int64_t os_event_reset(os_event_t event)
#define UT_LIST_GET_FIRST(BASE)
UNIV_INTERN ulint os_event_wait_time_low(os_event_t event, ulint time_in_usec, ib_int64_t reset_sig_count)
UNIV_INTERN os_mutex_t os_mutex_create(void)
UNIV_INTERN void ut_free(void *ptr)
#define UT_LIST_INIT(BASE)
UNIV_INTERN void os_event_free(os_event_t event)
#define UT_LIST_ADD_FIRST(NAME, BASE, N)
UNIV_INTERN int ut_usectime(ulint *sec, ulint *ms)
UNIV_INTERN void ut_print_timestamp(FILE *file)
UNIV_INTERN void os_thread_exit(void *exit_value)
UNIV_INTERN void os_sync_free(void)
UNIV_INTERN void os_fast_mutex_lock(os_fast_mutex_t *fast_mutex)
UNIV_INTERN void os_event_wait_low(os_event_t event, ib_int64_t reset_sig_count)
#define OS_SYNC_TIME_EXCEEDED