diff --git a/src/sharedspice.c b/src/sharedspice.c index 03a0cc48a..6268cfaf8 100644 --- a/src/sharedspice.c +++ b/src/sharedspice.c @@ -94,6 +94,8 @@ typedef HANDLE threadId_t; typedef pthread_mutex_t mutexType; typedef pthread_t threadId_t; #define THREADS +static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +static bool cont_condition; #endif @@ -310,9 +312,19 @@ static void * EXPORT_FLAVOR _cthread_run(void *controls) { wordlist *wl; +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&triggerMutex); + while (!cont_condition) + pthread_cond_wait(&cond, &triggerMutex); + pthread_mutex_unlock(&triggerMutex); +#endif + for (wl = controls; wl; wl = wl->wl_next) cp_evloop(wl->wl_word); wl_free(controls); +#ifdef HAVE_LIBPTHREAD + cont_condition = FALSE; +#endif return NULL; } @@ -339,7 +351,8 @@ _thread_run(void *string) if (!nobgtrwanted) bgtr(fl_exited, ng_ident, userptr); #ifdef HAVE_LIBPTHREAD - + cont_condition = TRUE; + pthread_cond_signal(&cond); #elif defined _MSC_VER || defined __MINGW32__ ResumeThread(tid2); #else @@ -376,9 +389,7 @@ _thread_stop(void) } else fprintf(stdout, "Background thread stopped with timeout = %d\n", timeout); -#ifdef HAVE_LIBPTHREAD - pthread_join(tid, NULL); -#endif + fl_running = FALSE; ft_intrpt = FALSE; return EXIT_NORMAL; @@ -406,7 +417,6 @@ exec_controls(wordlist *controls) #ifdef THREADS #ifdef HAVE_LIBPTHREAD usleep(20000); /* wait a little */ - pthread_join(tid, NULL); /* wait wait for background thread to return */ pthread_create(&tid2, NULL, (void * (*)(void *))_cthread_run, (void *)controls); #elif defined _MSC_VER || defined __MINGW32__ tid2 = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(__stdcall *)(void *))_cthread_run, @@ -664,6 +674,7 @@ ngSpice_Init(SendChar* printfcn, SendStat* statusfcn, ControlledExit* ngspiceexi pthread_mutex_init(&triggerMutex, NULL); pthread_mutex_init(&allocMutex, NULL); pthread_mutex_init(&fputsMutex, NULL); + cont_condition = FALSE; #else #ifdef SRW InitializeSRWLock(&triggerMutex); @@ -855,7 +866,6 @@ int ngSpice_Command(char* comexec) fprintf(stderr, no_init); return 1; } - runc(comexec); /* main thread prepares immediate detaching of dll */ immediate = TRUE;