static RETSIGTYPE signal_cleanup(int signum) {
CtdlLogPrintf(CTDL_DEBUG, "Caught signal %d; shutting down.\n", signum);
- exit_signal = signum;
+#ifdef THREADS_USESIGNALS
+ if (CT)
+ {
+ CtdlLogPrintf(CTDL_DEBUG, "Thread \"%s\" caught signal %d.\n", CT->name, signum);
+ CT->signal = signum;
+ }
+ else
+#endif
+ exit_signal = signum;
}
this_thread = CtdlThreadList;
while(this_thread)
{
+#ifdef THREADS_USESIGNALS
+ pthread_kill(this_thread->tid, SIGHUP);
+#endif
ctdl_thread_internal_change_state (this_thread, CTDL_THREAD_STOP_REQ);
pthread_cond_signal(&this_thread->ThreadCond);
pthread_cond_signal(&this_thread->SleepCond);
*/
int CtdlThreadGetCount(void)
{
- int ret;
-
- begin_critical_section(S_THREAD_LIST);
- ret = num_threads;
- end_critical_section(S_THREAD_LIST);
- return ret;
+ return num_threads;
}
int CtdlThreadGetWorkers(void)
{
- int ret;
-
- begin_critical_section(S_THREAD_LIST);
- ret = num_workers;
- end_critical_section(S_THREAD_LIST);
- return ret;
+ return num_workers;
}
double CtdlThreadGetWorkerAvg(void)
CtdlLogPrintf(CTDL_WARNING, "Thread system WARNING. Attempt to CtdlThreadRename() a non thread. %s\n", name);
return NULL;
}
+// FIXME: do we need this lock? I think not since the pointer asignmaent should be atomic
pthread_mutex_lock(&CT->ThreadMutex);
old_name = CT->name;
if (name)
*/
int CtdlThreadCheckStop(void)
{
+ int state;
+
if (!CT)
{
CtdlLogPrintf(CTDL_EMERG, "Thread system PANIC, CtdlThreadCheckStop() called by a non thread.\n");
CtdlThreadStopAll();
return -1;
}
+
+ state = CT->state;
+
+#ifdef THREADS_USERSIGNALS
+ if (CT->signal)
+ CtdlLogPrintf(CTDL_DEBUG, "Thread \"%s\" caught signal %d.\n", CT->name, CT->signal);
+#endif
pthread_mutex_lock(&CT->ThreadMutex);
- if(CT->state == CTDL_THREAD_STOP_REQ)
+ if(state == CTDL_THREAD_STOP_REQ)
{
CT->state = CTDL_THREAD_STOPPING;
pthread_mutex_unlock(&CT->ThreadMutex);
return -1;
}
- else if((CT->state < CTDL_THREAD_STOP_REQ) && (CT->state > CTDL_THREAD_CREATE))
+ else if((state < CTDL_THREAD_STOP_REQ) && (state > CTDL_THREAD_CREATE))
{
pthread_mutex_unlock(&CT->ThreadMutex);
return -1;
return;
if (!(this_thread->thread_func))
return; // Don't stop garbage collector
-
+#ifdef THREADS_USESIGNALS
+ pthread_kill(this_thread->tid, SIGHUP);
+#endif
ctdl_thread_internal_change_state (this_thread, CTDL_THREAD_STOP_REQ);
pthread_cond_signal(&this_thread->ThreadCond);
pthread_cond_signal(&this_thread->SleepCond);
*/
if (flags & CTDLTHREAD_BIGSTACK)
{
+#ifdef WITH_THREADLOG
CtdlLogPrintf(CTDL_INFO, "Thread system. Creating BIG STACK thread.\n");
+#endif
if ((ret = pthread_attr_setstacksize(&this_thread->attr, THREADSTACKSIZE))) {
pthread_mutex_unlock(&this_thread->ThreadMutex);
pthread_mutex_destroy(&(this_thread->ThreadMutex));