[Openmp-commits] [openmp] r217026 - Fix a bug where the library slept for up to KMP_BLOCKTIME before exiting
Jim Cownie
james.h.cownie at intel.com
Wed Sep 3 04:10:54 PDT 2014
Author: jimcownie
Date: Wed Sep 3 06:10:54 2014
New Revision: 217026
URL: http://llvm.org/viewvc/llvm-project?rev=217026&view=rev
Log:
Fix a bug where the library slept for up to KMP_BLOCKTIME before exiting
Modified:
openmp/trunk/runtime/src/z_Linux_util.c
Modified: openmp/trunk/runtime/src/z_Linux_util.c
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/z_Linux_util.c?rev=217026&r1=217025&r2=217026&view=diff
==============================================================================
--- openmp/trunk/runtime/src/z_Linux_util.c (original)
+++ openmp/trunk/runtime/src/z_Linux_util.c Wed Sep 3 06:10:54 2014
@@ -859,14 +859,15 @@ __kmp_launch_monitor( void *thr )
status = pthread_mutex_lock( & __kmp_wait_mx.m_mutex );
KMP_CHECK_SYSFAIL( "pthread_mutex_lock", status );
- status = pthread_cond_timedwait( & __kmp_wait_cv.c_cond, & __kmp_wait_mx.m_mutex,
- & now );
- if ( status != 0 ) {
- if ( status != ETIMEDOUT && status != EINTR ) {
- KMP_SYSFAIL( "pthread_cond_timedwait", status );
+ // AC: the monitor should not fall asleep if g_done has been set
+ if ( !TCR_4(__kmp_global.g.g_done) ) { // check once more under mutex
+ status = pthread_cond_timedwait( &__kmp_wait_cv.c_cond, &__kmp_wait_mx.m_mutex, &now );
+ if ( status != 0 ) {
+ if ( status != ETIMEDOUT && status != EINTR ) {
+ KMP_SYSFAIL( "pthread_cond_timedwait", status );
+ };
};
};
-
status = pthread_mutex_unlock( & __kmp_wait_mx.m_mutex );
KMP_CHECK_SYSFAIL( "pthread_mutex_unlock", status );
@@ -1231,6 +1232,8 @@ __kmp_exit_thread(
pthread_exit( (void *) exit_status );
} // __kmp_exit_thread
+void __kmp_resume_monitor();
+
void
__kmp_reap_monitor( kmp_info_t *th )
{
@@ -1262,6 +1265,7 @@ __kmp_reap_monitor( kmp_info_t *th )
} else
{
+ __kmp_resume_monitor(); // Wake up the monitor thread
status = pthread_join( th->th.th_info.ds.ds_thread, & exit_val);
if (exit_val != th) {
__kmp_msg(
@@ -1540,7 +1544,7 @@ __kmp_atfork_child (void)
__kmp_init_common = FALSE;
TCW_4(__kmp_init_user_locks, FALSE);
- __kmp_user_lock_table.used = 0;
+ __kmp_user_lock_table.used = 1;
__kmp_user_lock_table.allocated = 0;
__kmp_user_lock_table.table = NULL;
__kmp_lock_blocks = NULL;
@@ -1849,6 +1853,32 @@ __kmp_resume( int target_gtid, volatile
gtid, target_gtid ) );
}
+void
+__kmp_resume_monitor()
+{
+ int status;
+#ifdef KMP_DEBUG
+ int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
+ KF_TRACE( 30, ( "__kmp_resume_monitor: T#%d wants to wakeup T#%d enter\n",
+ gtid, KMP_GTID_MONITOR ) );
+ KMP_DEBUG_ASSERT( gtid != KMP_GTID_MONITOR );
+#endif
+ status = pthread_mutex_lock( &__kmp_wait_mx.m_mutex );
+ KMP_CHECK_SYSFAIL( "pthread_mutex_lock", status );
+#ifdef DEBUG_SUSPEND
+ {
+ char buffer[128];
+ __kmp_print_cond( buffer, &__kmp_wait_cv.c_cond );
+ __kmp_printf( "__kmp_resume_monitor: T#%d resuming T#%d: %s\n", gtid, KMP_GTID_MONITOR, buffer );
+ }
+#endif
+ status = pthread_cond_signal( &__kmp_wait_cv.c_cond );
+ KMP_CHECK_SYSFAIL( "pthread_cond_signal", status );
+ status = pthread_mutex_unlock( &__kmp_wait_mx.m_mutex );
+ KMP_CHECK_SYSFAIL( "pthread_mutex_unlock", status );
+ KF_TRACE( 30, ( "__kmp_resume_monitor: T#%d exiting after signaling wake up for T#%d\n",
+ gtid, KMP_GTID_MONITOR ) );
+}
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
More information about the Openmp-commits
mailing list