diff -ur mysql-5.0.24a/innobase/include/sync0rw.h mysql-5.0.24a-inno1/innobase/include/sync0rw.h --- mysql-5.0.24a/innobase/include/sync0rw.h 2006-08-26 00:11:49.000000000 +0300 +++ mysql-5.0.24a-inno1/innobase/include/sync0rw.h 2006-09-07 12:33:18.000000000 +0300 @@ -424,6 +424,7 @@ recursively locked the lock in the exclusive mode */ mutex_t mutex; /* The mutex protecting rw_lock_struct */ + os_event_t os_event; ulint pass; /* Default value 0. This is set to some value != 0 given by the caller of an x-lock operation, if the x-lock is to be passed to diff -ur mysql-5.0.24a/innobase/include/sync0rw.ic mysql-5.0.24a-inno1/innobase/include/sync0rw.ic --- mysql-5.0.24a/innobase/include/sync0rw.ic 2006-08-26 00:12:11.000000000 +0300 +++ mysql-5.0.24a-inno1/innobase/include/sync0rw.ic 2006-09-07 12:33:18.000000000 +0300 @@ -382,7 +382,9 @@ mutex_exit(mutex); if (UNIV_UNLIKELY(sg)) { - sync_array_signal_object(sync_primary_wait_array, lock); +/* sync_array_signal_object(sync_primary_wait_array, lock); */ + os_event_set(lock->os_event); + } ut_ad(rw_lock_validate(lock)); @@ -462,7 +464,8 @@ mutex_exit(&(lock->mutex)); if (UNIV_UNLIKELY(sg)) { - sync_array_signal_object(sync_primary_wait_array, lock); +/* sync_array_signal_object(sync_primary_wait_array, lock); */ + os_event_set(lock->os_event); } ut_ad(rw_lock_validate(lock)); diff -ur mysql-5.0.24a/innobase/sync/sync0rw.c mysql-5.0.24a-inno1/innobase/sync/sync0rw.c --- mysql-5.0.24a/innobase/sync/sync0rw.c 2006-08-26 00:12:13.000000000 +0300 +++ mysql-5.0.24a-inno1/innobase/sync/sync0rw.c 2006-09-07 12:33:18.000000000 +0300 @@ -100,6 +100,8 @@ mutex_create(rw_lock_get_mutex(lock)); mutex_set_level(rw_lock_get_mutex(lock), SYNC_NO_ORDER_CHECK); + lock->os_event= os_event_create(NULL); + lock->mutex.cfile_name = cfile_name; lock->mutex.cline = cline; #ifndef UNIV_HOTBACKUP @@ -160,6 +162,8 @@ lock->magic_n = 0; + os_event_free(lock->os_event); + mutex_free(rw_lock_get_mutex(lock)); mutex_enter(&rw_lock_list_mutex); @@ -264,11 +268,11 @@ rw_s_system_call_count++; - sync_array_reserve_cell(sync_primary_wait_array, +/* sync_array_reserve_cell(sync_primary_wait_array, lock, RW_LOCK_SHARED, file_name, line, &index); - +*/ rw_lock_set_waiters(lock, 1); mutex_exit(rw_lock_get_mutex(lock)); @@ -283,8 +287,9 @@ rw_s_system_call_count++; rw_s_os_wait_count++; - sync_array_wait_event(sync_primary_wait_array, index); - +/* sync_array_wait_event(sync_primary_wait_array, index); +*/ + os_event_wait(lock->os_event); goto lock_loop; } } @@ -516,11 +521,11 @@ rw_x_system_call_count++; - sync_array_reserve_cell(sync_primary_wait_array, +/* sync_array_reserve_cell(sync_primary_wait_array, lock, RW_LOCK_EX, file_name, line, &index); - +*/ rw_lock_set_waiters(lock, 1); mutex_exit(rw_lock_get_mutex(lock)); @@ -535,8 +540,9 @@ rw_x_system_call_count++; rw_x_os_wait_count++; - sync_array_wait_event(sync_primary_wait_array, index); - + os_event_wait(lock->os_event); +/* sync_array_wait_event(sync_primary_wait_array, index); +*/ goto lock_loop; } diff -ur mysql-5.0.24a/innobase/sync/sync0sync.c mysql-5.0.24a-inno1/innobase/sync/sync0sync.c --- mysql-5.0.24a/innobase/sync/sync0sync.c 2006-08-26 00:11:40.000000000 +0300 +++ mysql-5.0.24a-inno1/innobase/sync/sync0sync.c 2006-09-07 12:33:12.000000000 +0300 @@ -462,8 +462,8 @@ goto spin_loop; } - sync_array_reserve_cell(sync_primary_wait_array, mutex, - SYNC_MUTEX, file_name, line, &index); + //sync_array_reserve_cell(sync_primary_wait_array, mutex, + // SYNC_MUTEX, file_name, line, &index); mutex_system_call_count++; @@ -482,7 +482,7 @@ { /* Succeeded! Free the reserved wait cell */ - sync_array_free_cell(sync_primary_wait_array, index); + //sync_array_free_cell(sync_primary_wait_array, index); #ifdef UNIV_SYNC_DEBUG mutex_set_debug_info(mutex, file_name, line); @@ -531,8 +531,10 @@ } #endif /* !UNIV_HOTBACKUP */ - sync_array_wait_event(sync_primary_wait_array, index); - goto mutex_loop; + //sync_array_wait_event(sync_primary_wait_array, index); + os_fast_mutex_lock(&(mutex->os_fast_mutex)); + mutex->lock_word = 1; + //goto mutex_loop; finish_timing: #ifndef UNIV_HOTBACKUP @@ -565,7 +567,7 @@ /* The memory order of resetting the waiters field and signaling the object is important. See LEMMA 1 above. */ - sync_array_signal_object(sync_primary_wait_array, mutex); + //sync_array_signal_object(sync_primary_wait_array, mutex); } #ifdef UNIV_SYNC_DEBUG