From 5813c792f8a5d69dd796d2b545b8f7867ddef389 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Fri, 18 Apr 2003 01:29:40 +0000 Subject: [PATCH] 0.pre8.69 SMP safety: prefix thread synchronosation insns with LOCK Delete "waitpid pid -1" message on GC --- src/code/sysmacs.lisp | 3 +-- src/compiler/x86/cell.lisp | 22 +++++++++++++++++----- src/runtime/runtime.c | 1 - src/runtime/x86-arch.c | 2 +- version.lisp-expr | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/code/sysmacs.lisp b/src/code/sysmacs.lisp index 1f9b8c88b..fae42e219 100644 --- a/src/code/sysmacs.lisp +++ b/src/code/sysmacs.lisp @@ -23,8 +23,7 @@ #!+sb-thread `(locally (declare (optimize (safety 0) (speed 3))) - (sb!vm::fast-symbol-global-value-xadd ',symbol-name ,delta) - ,symbol-name)) + (sb!vm::locked-symbol-global-value-add ',symbol-name ,delta))) (defmacro without-gcing (&rest body) #!+sb-doc diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index 19587781e..332432f26 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -145,13 +145,24 @@ (:policy :fast) (:translate symbol-value)) -(defknown fast-symbol-global-value-xadd (symbol fixnum) fixnum ()) +(defknown locked-symbol-global-value-add (symbol fixnum) fixnum ()) -(define-vop (fast-symbol-global-value-xadd cell-xadd) - (:variant symbol-value-slot other-pointer-lowtag) +(define-vop (locked-symbol-global-value-add) + (:args (object :scs (descriptor-reg) :to :result) + (value :scs (any-reg) :target result)) + (:arg-types * tagged-num) + (:results (result :scs (any-reg) :from (:argument 1))) (:policy :fast) - (:translate fast-symbol-global-value-xadd) - (:arg-types * tagged-num)) + (:translate locked-symbol-global-value-add) + (:result-types tagged-num) + (:policy :fast-safe) + (:generator 4 + (move result value) + (inst lock) + (inst add (make-ea :dword :base object + :disp (- (* symbol-value-slot n-word-bytes) + other-pointer-lowtag)) + value))) #!+sb-thread (define-vop (boundp) @@ -449,6 +460,7 @@ (:policy :fast-safe) (:generator 5 (move eax old-value) + (inst lock) (inst cmpxchg (make-ea :dword :base object :index slot :scale 1 :disp (- (* instance-slots-offset n-word-bytes) instance-pointer-lowtag)) diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 31c03deec..7b070c96a 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -469,7 +469,6 @@ static void /* noreturn */ parent_loop(void) pid_t pid=0; while(pid=waitpid(-1,&status,__WALL|WUNTRACED)) { struct thread *th; - fprintf(stderr,"waitpid pid %d\n",pid); if(pid==-1) { if(errno == EINTR) { if(maybe_gc_pending) parent_do_garbage_collect(); diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 2b03d7af2..e08061558 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -146,7 +146,7 @@ get_spinlock(lispobj *word,int value) { u32 eax=0; do { - asm ("xor %0,%0;cmpxchg %1,%2" + asm ("xor %0,%0;lock cmpxchg %1,%2" : "=a" (eax) : "r" (value), "m" (*word) : "memory", "cc"); diff --git a/version.lisp-expr b/version.lisp-expr index bdcee79e8..d707ad9e8 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -18,4 +18,4 @@ ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.pre8.68" +"0.pre8.69" -- 2.11.4.GIT