From 484889ea5a57bc0e289bf7cbb1e4624c7bf05566 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 11 Jul 2018 11:59:05 -0700 Subject: [PATCH] TIMER: Changed sim_idle_ms_sleep() to use a mutex which is unique to idling It seems that the prior use of sim_asynch_lock RECURSIVE mutex could cause a pthread_cond_timedwait() failure with EINVAL returned. As discussed in #595 --- scp.c | 1 + sim_defs.h | 3 +++ sim_timer.c | 6 +++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/scp.c b/scp.c index 094a544d..78adc58a 100644 --- a/scp.c +++ b/scp.c @@ -326,6 +326,7 @@ #if defined (SIM_ASYNCH_IO) pthread_mutex_t sim_asynch_lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t sim_asynch_wake = PTHREAD_COND_INITIALIZER; +pthread_mutex_t sim_idle_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t sim_timer_lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t sim_timer_wake = PTHREAD_COND_INITIALIZER; diff --git a/sim_defs.h b/sim_defs.h index aeab12fb..af1f09ed 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -1062,6 +1062,7 @@ struct MEMFILE { extern pthread_mutex_t sim_asynch_lock; extern pthread_cond_t sim_asynch_wake; +extern pthread_mutex_t sim_idle_lock; extern pthread_mutex_t sim_timer_lock; extern pthread_cond_t sim_timer_wake; extern t_bool sim_timer_event_canceled; @@ -1174,6 +1175,7 @@ extern int32 sim_asynch_inst_latency; do { \ pthread_mutex_destroy(&sim_asynch_lock); \ pthread_cond_destroy(&sim_asynch_wake); \ + pthread_mutex_destroy(&sim_idle_lock); \ pthread_mutex_destroy(&sim_timer_lock); \ pthread_cond_destroy(&sim_timer_wake); \ pthread_mutex_destroy(&sim_tmxr_poll_lock); \ @@ -1223,6 +1225,7 @@ extern int32 sim_asynch_inst_latency; do { \ pthread_mutex_destroy(&sim_asynch_lock); \ pthread_cond_destroy(&sim_asynch_wake); \ + pthread_mutex_destroy(&sim_idle_lock); \ pthread_mutex_destroy(&sim_timer_lock); \ pthread_cond_destroy(&sim_timer_wake); \ pthread_mutex_destroy(&sim_tmxr_poll_lock); \ diff --git a/sim_timer.c b/sim_timer.c index 5209338b..2094499d 100644 --- a/sim_timer.c +++ b/sim_timer.c @@ -248,9 +248,9 @@ if (done_time.tv_nsec > 1000000000) { done_time.tv_sec += done_time.tv_nsec/1000000000; done_time.tv_nsec = done_time.tv_nsec%1000000000; } -pthread_mutex_lock (&sim_asynch_lock); +pthread_mutex_lock (&sim_idle_lock); sim_idle_wait = TRUE; -stat = pthread_cond_timedwait (&sim_asynch_wake, &sim_asynch_lock, &done_time); +stat = pthread_cond_timedwait (&sim_asynch_wake, &sim_idle_lock, &done_time); if (stat == 0) sim_asynch_check = 0; /* force check of asynch queue now */ else @@ -264,7 +264,7 @@ else abort (); } sim_idle_wait = FALSE; -pthread_mutex_unlock (&sim_asynch_lock); +pthread_mutex_unlock (&sim_idle_lock); if (!timedout) { AIO_UPDATE_QUEUE; }