Changeset: 9a508f16f89a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9a508f16f89a
Modified Files:
gdk/gdk_system.c
Branch: default
Log Message:
Merge with Apr2019 branch.
diffs (63 lines):
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -388,17 +388,17 @@ MT_create_thread(MT_Id *t, void (*f) (vo
ATOMIC_INIT(&w->exited, 0);
strncpy(w->threadname, threadname, sizeof(w->threadname));
w->threadname[sizeof(w->threadname) - 1] = 0;
+ THRDDEBUG fprintf(stderr, "#create \"%s\" \"%s\"\n",
MT_thread_getname(), threadname);
EnterCriticalSection(&winthread_cs);
+ w->hdl = CreateThread(NULL, THREAD_STACK_SIZE, thread_starter, w,
+ 0, &w->tid);
+ if (w->hdl == NULL) {
+ LeaveCriticalSection(&winthread_cs);
+ return -1;
+ }
w->next = winthreads;
winthreads = w;
LeaveCriticalSection(&winthread_cs);
- THRDDEBUG fprintf(stderr, "#create \"%s\" \"%s\"\n",
MT_thread_getname(), threadname);
- w->hdl = CreateThread(NULL, THREAD_STACK_SIZE, thread_starter, w,
- 0, &w->tid);
- if (w->hdl == NULL) {
- rm_winthread(w);
- return -1;
- }
/* must not fail after this: the thread has been started */
*t = (MT_Id) w->tid;
return 0;
@@ -746,27 +746,28 @@ MT_create_thread(MT_Id *t, void (*f) (vo
ATOMIC_INIT(&p->exited, 0);
memcpy(p->threadname, threadname, tlen + 1);
- pthread_mutex_lock(&posthread_lock);
- p->next = posthreads;
- posthreads = p;
- *t = p->mtid = ++MT_thread_id;
- pthread_mutex_unlock(&posthread_lock);
#ifdef HAVE_PTHREAD_SIGMASK
sigset_t new_mask, orig_mask;
(void) sigfillset(&new_mask);
MT_thread_sigmask(&new_mask, &orig_mask);
#endif
THRDDEBUG fprintf(stderr, "#create \"%s\" \"%s\"\n",
MT_thread_getname(), threadname);
+ /* protect posthreads during thread creation and only add to
+ * it after the thread was created successfully */
+ pthread_mutex_lock(&posthread_lock);
+ *t = p->mtid = ++MT_thread_id;
ret = pthread_create(&p->tid, &attr, thread_starter, p);
if (ret != 0) {
fprintf(stderr,
"#MT_create_thread: cannot start thread: %s\n",
strerror(ret));
- rm_posthread(p);
ret = -1;
} else {
/* must not fail after this: the thread has been started */
+ p->next = posthreads;
+ posthreads = p;
}
+ pthread_mutex_unlock(&posthread_lock);
#ifdef HAVE_PTHREAD_SIGMASK
MT_thread_sigmask(&orig_mask, NULL);
#endif
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list