From: <me...@ho...> - 2006-01-05 21:07:46
|
On Thursday 05 January 2006 15:41, Rick Taube wrote: > (condition-wait *buffer-queue* *buffer-lock* [timeout]) Please test this: Index: src/code/target-thread.lisp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/sbcl/sbcl/src/code/target-thread.lisp,v retrieving revision 1.55 diff -u -p -r1.55 target-thread.lisp =2D-- src/code/target-thread.lisp 18 Nov 2005 12:28:40 -0000 1.55 +++ src/code/target-thread.lisp 5 Jan 2006 20:12:17 -0000 @@ -237,7 +237,7 @@ this mutex." (+ (sb!kernel:get-lisp-obj-address waitqueue) (- (* 3 sb!vm:n-word-bytes) sb!vm:instance-pointer-lowtag)))) =20 =2D(defun condition-wait (queue mutex) +(defun condition-wait (queue mutex &key timeout) #!+sb-doc "Atomically release MUTEX and enqueue ourselves on QUEUE. Another thread may subsequently notify us using CONDITION-NOTIFY, at which @@ -258,9 +258,12 @@ time we reacquire MUTEX and return to th ;; this comment, it will change queue->data, and so ;; futex-wait returns immediately instead of sleeping. ;; Ergo, no lost wakeup =2D (with-pinned-objects (queue me) =2D (futex-wait (waitqueue-data-address queue) =2D (sb!kernel:get-lisp-obj-address me)))) + (handler-case + (sb-ext:with-timeout timeout + (with-pinned-objects (queue me) + (futex-wait (waitqueue-data-address queue) + (sb!kernel:get-lisp-obj-address me)))) + (sb-ext:timeout () nil))) ;; 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 You could do almost the same by wrapping the condition-wait in a with-timeout, but that's unsafe since it might interrupt the unwind-protect cleanup form. > > > Not officially. You may call pthread_{s,g}etschedparam via alien. > > You'll need the pthread_t id for the thread: > > ok thats good to know, ill see if i can tweek priority that way my > making [...] > so im stuck: i cant seems to launch pthreads from the lib directly > and i cant see how to use the existing thread api to to this, which > is why im asking for advice or pointers on how to proceed. If you are calling lisp from a pthread that was not created by MAKE-THREAD, well that's going to lose, no way around it. If you are not then I need more info, preferrably a small test program. Cheers, G=E1bor |