X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-linux-os.c;h=d68e964745072ba60b5e35cf080c7b9607037048;hb=673234cb910923d41badca51b383e3188f375691;hp=5b55fdc3792c1e779d1aace0adf5878716635bac;hpb=13adeede88d026548e4d2da497f93d8024706a2b;p=sbcl.git diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index 5b55fdc..d68e964 100644 --- a/src/runtime/x86-linux-os.c +++ b/src/runtime/x86-linux-os.c @@ -69,20 +69,19 @@ void debug_get_ldt() printf("%d bytes in ldt: print/x local_ldt_copy\n", n); } -volatile lispobj modify_ldt_lock; /* protect all calls to modify_ldt */ +#ifdef LISP_FEATURE_SB_THREAD +pthread_mutex_t modify_ldt_lock = PTHREAD_MUTEX_INITIALIZER; +#endif int arch_os_thread_init(struct thread *thread) { stack_t sigstack; #ifdef LISP_FEATURE_SB_THREAD - /* FIXME Lock ordering rules: all_threads_lock must usually be - * held when getting modify_ldt_lock - */ struct user_desc ldt_entry = { 1, 0, 0, /* index, address, length filled in later */ 1, MODIFY_LDT_CONTENTS_DATA, 0, 0, 0, 1 }; int n; - get_spinlock(&modify_ldt_lock,(long)thread); + thread_mutex_lock(&modify_ldt_lock); n=modify_ldt(0,local_ldt_copy,sizeof local_ldt_copy); /* get next free ldt entry */ @@ -96,7 +95,7 @@ int arch_os_thread_init(struct thread *thread) { ldt_entry.limit=dynamic_values_bytes; ldt_entry.limit_in_pages=0; if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) { - modify_ldt_lock=0; + thread_mutex_unlock(&modify_ldt_lock); /* modify_ldt call failed: something magical is not happening */ return 0; } @@ -105,7 +104,7 @@ int arch_os_thread_init(struct thread *thread) { + (1 << 2) /* TI set = LDT */ + 3)); /* privilege level */ thread->tls_cookie=n; - modify_ldt_lock=0; + pthread_mutex_unlock(&modify_ldt_lock); if(n<0) return 0; pthread_setspecific(specials,thread); @@ -138,16 +137,13 @@ int arch_os_thread_cleanup(struct thread *thread) { 0, 0, 0, 0, MODIFY_LDT_CONTENTS_DATA, 0, 0, 0, 0 }; + int result; ldt_entry.entry_number=thread->tls_cookie; - get_spinlock(&modify_ldt_lock,(long)thread); - if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) { - modify_ldt_lock=0; - /* modify_ldt call failed: something magical is not happening */ - return 0; - } - modify_ldt_lock=0; - return 1; + thread_mutex_lock(&modify_ldt_lock); + result = modify_ldt(1, &ldt_entry, sizeof (ldt_entry)); + thread_mutex_unlock(&modify_ldt_lock); + return result; }