From: Thomas F. B. <tfb@OCF.Berkeley.EDU> - 2004-05-11 00:21:28
|
I needed these, so I added them to sb-posix. Unfortunately, you're supposed to use macros to exampine the status code you get back from wait and waitpid. I hacked up the ones I need as lisp functions for Darwin, but didn't include them here. That definately leaves something to be desired, but it's better than no `fork' or `wait' at all. --- contrib/sb-posix/constants.lisp.orig Tue Feb 17 08:50:30 2004 +++ contrib/sb-posix/constants.lisp Mon May 10 17:14:54 2004 @@ -195,6 +195,10 @@ (:integer enomedium "ENOMEDIUM") (:integer emediumtype "EMEDIUMTYPE") + ;; wait + (:integer wnohang "WNOHANG") + (:integer wuntraced "WUNTRACED") + ;; mode_t (:type mode-t "mode_t") (:integer s-isuid "S_ISUID") --- contrib/sb-posix/interface.lisp.orig Tue Feb 17 08:50:30 2004 +++ contrib/sb-posix/interface.lisp Mon May 10 17:14:02 2004 @@ -112,6 +112,7 @@ ;;; processes, signals (define-call "alarm" int never-fails (seconds unsigned)) +(define-call "fork" sb-posix::pid-t minusp) (define-call "getpgid" sb-posix::pid-t minusp (pid sb-posix::pid-t)) (define-call "getpid" sb-posix::pid-t never-fails) (define-call "getppid" sb-posix::pid-t never-fails) @@ -123,6 +124,36 @@ (define-call "setpgid" int minusp (pid sb-posix::pid-t) (pgid sb-posix::pid-t)) (define-call "setpgrp" int minusp) + +;; FIXME: The status code we get from the wait functions is only +;; useful in combination with the macros that let us examine it. + +(export 'sb-posix::wait :sb-posix) +(declaim (inline sb-posix::wait)) +(defun sb-posix::wait (&optional statusptr) + (declare (type (or null (simple-array (signed-byte 32) (1))) statusptr)) + (let* ((ptr (or statusptr (make-array 1 :element-type '(signed-byte 32)))) + (pid (alien-funcall + (extern-alien "wait" (function sb-posix::pid-t (* int))) + (sb-sys:vector-sap ptr)))) + (if (minusp pid) + (syscall-error) + (values pid (aref ptr 0))))) + +(export 'sb-posix::waitpid :sb-posix) +(declaim (inline sb-posix::waitpid)) +(defun sb-posix::waitpid (pid options &optional statusptr) + (declare (type (sb-alien:alien sb-posix::pid-t) pid) + (type (sb-alien:alien int) options) + (type (or null (simple-array (signed-byte 32) (1))) statusptr)) + (let* ((ptr (or statusptr (make-array 1 :element-type '(signed-byte 32)))) + (pid (alien-funcall + (extern-alien "waitpid" (function sb-posix::pid-t + sb-posix::pid-t (* int) int)) + pid (sb-sys:vector-sap ptr) options))) + (if (minusp pid) + (syscall-error) + (values pid (aref ptr 0))))) ;;; mmap, msync (define-call "mmap" sb-sys:system-area-pointer |
From: Christophe R. <cs...@ca...> - 2004-05-11 07:06:24
|
"Thomas F. Burdick" <tfb@OCF.Berkeley.EDU> writes: > I needed these, so I added them to sb-posix. Unfortunately, you're > supposed to use macros to exampine the status code you get back from > wait and waitpid. I hacked up the ones I need as lisp functions for > Darwin, but didn't include them here. That definately leaves > something to be desired, but it's better than no `fork' or `wait' at > all. The right thing to do, I think, is to add C wrapper functions like in contrib/sb-posix/alien/stat-macros.c, and define alien functions for them. (Well, ultimately the right thing to do would be to parse the C macro, and define a lisp function directly, and also to arrange that cores with foreign code work, but I think C wrapper functions is closer to The Right Thing than no wrapper functions). Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Christophe R. <cs...@ca...> - 2004-08-04 10:57:57
|
"Thomas F. Burdick" <tfb@OCF.Berkeley.EDU> writes: > I hacked up the ones I need as lisp functions for Darwin, but didn't > include them here. That definately leaves something to be desired, > but it's better than no `fork' or `wait' at all. I merged this into sbcl-0.8.13.22. The macros have been wrapped with C functions, which has the usual problems with dumping cores, so the version in CVS may not be immediately useful to you (though I'd appreciate it if you could test that the new functions basically work, as I haven't constructed test cases for the suite). However, I hope that this will shortly change: there seems to be a certain amount of progress on porting cmucl's linkage table feature to sbcl, so perhaps we will soon be able to support a more useful waitpid transparently. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Nikodemus S. <tsi...@cc...> - 2004-08-04 11:27:00
|
On Wed, 4 Aug 2004, Christophe Rhodes wrote: > However, I hope that this will shortly change: there seems to be a > certain amount of progress on porting cmucl's linkage table feature to > sbcl, so perhaps we will soon be able to support a more useful > waitpid transparently. Taking the opportunity for a status report: The linkage-table port is essentially done for x86/linux. x86/*BSD should work as soon as memory maps for the linkage-table are figured out (not the dlopen mmaps: sbcl just needs a slice of more memory for it's own linkage-table). Sparc/SunOS is in progress, and sparc/Linux should work with the same code as that. PPC, MIPS, and HPPA I'm not going to do right now, but porting should be easy on dlopen platforms for someone who knows the asm. Cheers, -- Nikodemus Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." |