r10333: add sb-posix dependency
[kmrcl.git] / processes.lisp
1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: modlisp -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          processes.lisp
6 ;;;; Purpose:       Multiprocessing functions
7 ;;;; Programmer:    Kevin M. Rosenberg
8 ;;;; Date Started:  June 2003
9 ;;;;
10 ;;;; $Id$
11 ;;;; *************************************************************************
12
13 (in-package #:kmrcl)
14
15
16 (defun make-process (name func)
17   #+allegro (mp:process-run-function name func)
18   #+cmu (mp:make-process func :name name)
19   #+lispworks (mp:process-run-function name nil func)
20   #+sb-thread (sb-thread:make-thread func)
21   #+openmcl (ccl:process-run-function name func)
22   #-(or allegro cmu lispworks sb-thread openmcl) (funcall func)
23   )
24
25 (defun destroy-process (process)
26   #+cmu (mp:destroy-process process)
27   #+allegro (mp:process-kill process)
28   #+sb-thread (sb-thread:destroy-thread process)
29   #+lispworks (mp:process-kill process)
30   #+openmcl (ccl:process-kill process)
31   )
32
33 (defun make-lock (name)
34   #+allegro (mp:make-process-lock :name name)
35   #+cmu (mp:make-lock name)
36   #+lispworks (mp:make-lock :name name)
37   #+sb-thread (sb-thread:make-mutex :name name)
38   #+openmcl (ccl:make-lock name)
39   )
40
41 (defmacro with-lock-held ((lock) &body body)
42   #+allegro
43   `(mp:with-process-lock (,lock) ,@body)
44   #+cmu
45   `(mp:with-lock-held (,lock) ,@body)
46   #+lispworks
47   `(mp:with-lock (,lock) ,@body)
48   #+sb-thread
49   `(sb-thread:with-mutex (,lock) ,@body)
50   #+openmcl
51   `(ccl:with-lock-grabbed (,lock) ,@body)
52   #-(or allegro cmu lispworks sb-thread openmcl)
53   `(progn ,@body)
54   )
55
56
57 (defmacro with-timeout ((seconds) &body body)
58   #+allegro
59   `(mp:with-timeout (,seconds) ,@body)
60   #+cmu
61   `(mp:with-timeout (,seconds) ,@body)
62   #+sb-thread
63   `(sb-ext:with-timeout ,seconds ,@body)
64   #+openmcl
65   `(ccl:process-wait-with-timeout "waiting"
66                                  (* ,seconds ccl:*ticks-per-second*)
67                                  #'(lambda ()
68                                      ,@body) nil)
69   #-(or allegro cmu sb-thread openmcl)
70   `(progn ,@body)
71   )
72   
73 (defun process-sleep (n)
74   #+allegro (mp:process-sleep n)
75   #-allegro (sleep n))
76