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

