Index: sid/include/sidblockingutil.h =================================================================== RCS file: /cvs/src/src/sid/include/sidblockingutil.h,v retrieving revision 1.3 diff -c -p -r1.3 sidblockingutil.h *** sid/include/sidblockingutil.h 5 Feb 2007 20:28:42 -0000 1.3 --- sid/include/sidblockingutil.h 19 Feb 2007 16:26:33 -0000 *************** namespace sidutil *** 49,57 **** { log (10, "%s: child_init\n", name.c_str ()); assert (child_created); ! // Lock both mutexes ! pthread_mutex_lock (& child_resume_mutex); ! pthread_mutex_lock (& child_stopped_mutex); } protected: --- 49,56 ---- { log (10, "%s: child_init\n", name.c_str ()); assert (child_created); ! // Lock the syncronization mutex ! pthread_mutex_lock (& child_sync_mutex); } protected: *************** namespace sidutil *** 59,73 **** { log (10, "%s: parent_init\n", name.c_str ()); ! // Create mutexes for synchronizing the parent and child threads ! pthread_mutex_init (& child_resume_mutex, NULL); ! pthread_cond_init (& child_resume_condition, NULL); ! pthread_mutex_init (& child_stopped_mutex, NULL); ! pthread_cond_init (& child_stopped_condition, NULL); ! ! // Lock both mutexes ! pthread_mutex_lock (& child_resume_mutex); ! pthread_mutex_lock (& child_stopped_mutex); control_status = ctl_parent; } --- 58,69 ---- { log (10, "%s: parent_init\n", name.c_str ()); ! // Create a mutex for synchronizing the parent and child threads ! pthread_mutex_init (& child_sync_mutex, NULL); ! pthread_cond_init (& child_sync_condition, NULL); ! ! // Lock the mutex ! pthread_mutex_lock (& child_sync_mutex); control_status = ctl_parent; } *************** namespace sidutil *** 121,139 **** // Signal the child to resume assert (control_status != ctl_child_start); control_status = ctl_child_start; ! pthread_cond_signal (& child_resume_condition); ! ! // Unlock the mutex so that the child can gain control ! pthread_mutex_unlock (& child_resume_mutex); // Wait for the return signal from the child ! pthread_cond_wait (& child_stopped_condition, & child_stopped_mutex); ! ! // Reacquire the mutex so that the child can gain control ! pthread_mutex_lock (& child_resume_mutex); - // Check the value of control_status - assert (control_status != ctl_child_start); return control_status; } --- 117,132 ---- // Signal the child to resume assert (control_status != ctl_child_start); control_status = ctl_child_start; ! log (11, "%s: parent signalling the child thread\n", name.c_str ()); ! pthread_cond_signal (& child_sync_condition); // Wait for the return signal from the child ! do { ! log (11, "%s: parent waiting for child thread\n", name.c_str ()); ! pthread_cond_wait (& child_sync_condition, & child_sync_mutex); ! } while (control_status == ctl_child_start); ! log (11, "%s: parent regains control\n", name.c_str ()); return control_status; } *************** namespace sidutil *** 168,185 **** // Signal the parent that we're stopped log (11, "%s: child signalling the parent thread\n", name.c_str ()); ! pthread_cond_signal (& child_stopped_condition); ! ! // Unlock the mutex so that the parent can gain control ! pthread_mutex_unlock (& child_stopped_mutex); // Wait for a signal to resume ! log (11, "%s: child waiting for parent thread\n", name.c_str ()); ! pthread_cond_wait (& child_resume_condition, & child_resume_mutex); ! ! // Reacquire the stopped mutex ! pthread_mutex_lock (& child_stopped_mutex); ! assert (control_status == ctl_child_start); } void set_blockable () --- 161,174 ---- // Signal the parent that we're stopped log (11, "%s: child signalling the parent thread\n", name.c_str ()); ! pthread_cond_signal (& child_sync_condition); // Wait for a signal to resume ! do { ! log (11, "%s: child waiting for parent thread\n", name.c_str ()); ! pthread_cond_wait (& child_sync_condition, & child_sync_mutex); ! } while (control_status != ctl_child_start); ! log (11, "%s: child regains control\n", name.c_str ()); } void set_blockable () *************** namespace sidutil *** 198,208 **** bool child_created; pthread_t child_thread; void *(*child_thread_function)(void *); ! pthread_mutex_t child_resume_mutex; ! pthread_cond_t child_resume_condition; ! pthread_mutex_t child_stopped_mutex; ! pthread_cond_t child_stopped_condition; ! enum { ctl_parent, ctl_child_start, ctl_child_blocked, ctl_child_complete } control_status; --- 187,195 ---- bool child_created; pthread_t child_thread; void *(*child_thread_function)(void *); ! pthread_mutex_t child_sync_mutex; ! pthread_cond_t child_sync_condition; ! volatile enum { ctl_parent, ctl_child_start, ctl_child_blocked, ctl_child_complete } control_status;