+;;;; unithread stub support for threads in the target machine
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+
(in-package "SB!THREAD")
;;; used bu debug-int.lisp to access interrupt contexts
(sb!sys:sap-ref-32 (alien-sap (extern-alien "all_threads" (* t)))
(* sb!vm::thread-pid-slot 4)))
+(defun reap-dead-threads ())
+
;;;; queues, locks
;; spinlocks use 0 as "free" value: higher-level locks use NIL
-(defun get-spinlock (lock offset new-value) )
+(defun get-spinlock (lock offset new-value)
+ (declare (ignore lock offset new-value)))
(defmacro with-spinlock ((queue) &body body)
+ (declare (ignore queue))
`(progn ,@body))
;;;; 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))
(let ((h (car (waitqueue-data queue))))
(setf (waitqueue-lock queue) 0)
(when h
- (sb!unix:unix-kill h :sigcont)))))
+ (sb!unix:unix-kill h sb!unix:sigcont)))))
;;;; mutex
(return t))
(setf old-value t1))))
-(defmacro with-mutex ((mutex &key value (wait-p t)) &body body)
- (cond ((not wait-p)
- `(unless (mutex-value ,mutex)
- (unwind-protect
- (progn
- (setf (mutex-value ,mutex) (or ,value t))
- ,@body)
- (setf (mutex-value ,mutex) nil))))
- (t
- `(progn ,@body))))
-
-;;; what's the best thing to do with these on unithread?
-#+NIl
+(defun get-mutex (lock &optional new-value (wait-p t))
+ (declare (type mutex lock))
+ (let ((old-value (mutex-value lock)))
+ (when (and old-value wait-p)
+ (error "In unithread mode, mutex ~S was requested with WAIT-P ~S and ~
+ new-value ~S, but has already been acquired (with value ~S)."
+ lock wait-p new-value old-value))
+ (setf (mutex-value lock) new-value)
+ t))
+
+(defun release-mutex (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
"Notify one of the processes waiting on QUEUE"
(signal-queue-head queue))
-
-;;;; multiple independent listeners
-
-(defvar *session-lock* nil)
+(defun maybe-install-futex-functions () nil)
;;;; job control
-(defun debugger-wait-until-foreground-thread (stream) t)
+(defun init-job-control () t)
+(defun debugger-wait-until-foreground-thread (stream)
+ (declare (ignore stream))
+ t)
+(defun get-foreground () t)
+(defun release-foreground (&optional next)
+ (declare (ignore next))
+ t)
+(defun terminate-session ())