(defun sb!vm::current-thread-offset-sap (n)
(declare (type (unsigned-byte 27) n))
(sb!sys:sap-ref-sap (alien-sap (extern-alien "all_threads" (* t)))
- (* n 4)))
+ (* n sb!vm:n-word-bytes)))
(defun current-thread-id ()
(sb!sys:sap-ref-32 (alien-sap (extern-alien "all_threads" (* t)))
- (* sb!vm::thread-pid-slot 4)))
+ (* sb!vm::thread-pid-slot sb!vm:n-word-bytes)))
+
+(defun reap-dead-threads ())
;;;; queues, locks
;;;; the higher-level locking operations are based on waitqueues
(defstruct waitqueue
- (name nil :type (or null simple-base-string))
+ (name nil :type (or null simple-string))
(lock 0)
(data nil))
(defstruct (mutex (:include waitqueue))
(value nil))
-#+nil
-(defun wait-on-queue (queue &optional lock)
- (let ((pid (current-thread-id)))
- ;; FIXME what should happen if we get interrupted when we've blocked
- ;; the sigcont? For that matter, can we get interrupted?
- (block-sigcont)
- (when lock (release-mutex lock))
- (get-spinlock queue 2 pid)
- (pushnew pid (waitqueue-data queue))
- (setf (waitqueue-lock queue) 0)
- (unblock-sigcont-and-sleep)))
-
-#+nil
-(defun dequeue (queue)
- (let ((pid (current-thread-id)))
- (get-spinlock queue 2 pid)
- (setf (waitqueue-data queue)
- (delete pid (waitqueue-data queue)))
- (setf (waitqueue-lock queue) 0)))
-
-#+nil
-(defun signal-queue-head (queue)
- (let ((pid (current-thread-id)))
- (get-spinlock queue 2 pid)
- (let ((h (car (waitqueue-data queue))))
- (setf (waitqueue-lock queue) 0)
- (when h
- (sb!unix:unix-kill h sb!unix:sigcont)))))
-
;;;; mutex
-#+nil
-(defun get-mutex (lock &optional new-value (wait-p t))
- (declare (type mutex lock))
- (let ((pid (current-thread-id)))
- (unless new-value (setf new-value pid))
- (assert (not (eql new-value (mutex-value lock))))
- (loop
- (unless
- ;; args are object slot-num old-value new-value
- (sb!vm::%instance-set-conditional lock 4 nil new-value)
- (dequeue lock)
- (return t))
- (unless wait-p (return nil))
- (wait-on-queue lock nil))))
-
-#+nil
-(defun release-mutex (lock &optional (new-value nil))
- (declare (type mutex lock))
- (let ((old-value (mutex-value lock))
- (t1 nil))
- (loop
- (unless
- ;; args are object slot-num old-value new-value
- (eql old-value
- (setf t1
- (sb!vm::%instance-set-conditional lock 4 old-value new-value)))
- (signal-queue-head lock)
- (return t))
- (setf old-value t1))))
-
(defun get-mutex (lock &optional new-value (wait-p t))
(declare (type mutex lock))
(let ((old-value (mutex-value lock)))
(declare (type mutex lock))
(setf (mutex-value lock) nil))
-;;; what's the best thing to do with these on unithread? commented
-;;; functions are the thread versions, just to remind me what they do
-;;; there
-#+nil
-(defun condition-wait (queue lock)
- "Atomically release LOCK and enqueue ourselves on QUEUE. Another
-thread may subsequently notify us using CONDITION-NOTIFY, at which
-time we reacquire LOCK and return to the caller."
- (unwind-protect
- (wait-on-queue queue lock)
- ;; If we are interrupted while waiting, we should do these things
- ;; before returning. Ideally, in the case of an unhandled signal,
- ;; we should do them before entering the debugger, but this is
- ;; better than nothing.
- (dequeue queue)
- (get-mutex lock)))
-
-#+nil
-(defun condition-notify (queue)
- "Notify one of the processes waiting on QUEUE"
- (signal-queue-head queue))
-
-(defun maybe-install-futex-functions () nil)
+
+;; FIXME need suitable stub or ERROR-signaling definitions for
+;; condition-wait (queue lock)
+;; condition-notify (queue)
;;;; job control