/[slime]/slime/swank-backend.lisp
ViewVC logotype

Contents of /slime/swank-backend.lisp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.52 - (hide annotations)
Wed Jun 16 20:25:09 2004 UTC (9 years, 10 months ago) by heller
Branch: MAIN
Changes since 1.51: +9 -1 lines
(sldb-step, default-readtable-alist): New backend functions.
1 lgorrie 1.1 ;;;; -*- Mode: lisp; indent-tabs-mode: nil; outline-regexp: ";;;;;*" -*-
2     ;;;
3 lgorrie 1.13 ;;; slime-backend.lisp --- SLIME backend interface.
4 lgorrie 1.1 ;;;
5 lgorrie 1.13 ;;; Created by James Bielman in 2003. Released into the public domain.
6 lgorrie 1.1 ;;;
7 lgorrie 1.13 ;;; This file defines the functions that must be implemented
8     ;;; separately for each Lisp. Each is declared as a generic function
9     ;;; for which swank-<implementation>.lisp provides methods.
10 lgorrie 1.1
11 heller 1.36 (defpackage :swank-backend
12 lgorrie 1.1 (:use :common-lisp)
13 heller 1.36 (:export #:sldb-condition
14     #:original-condition
15     #:compiler-condition
16     #:message
17     #:short-message
18     #:condition
19     #:severity
20     #:location
21     #:location-p
22     #:location-buffer
23     #:location-position
24     #:position-p
25     #:position-pos
26     #:print-output-to-string
27 mbaringer 1.42 #:quit-lisp
28 heller 1.5 ))
29 lgorrie 1.1
30 heller 1.36 (in-package :swank-backend)
31 lgorrie 1.1
32    
33 lgorrie 1.21 ;;;; Metacode
34    
35     (defparameter *interface-functions* '()
36     "The names of all interface functions.")
37    
38     (defparameter *unimplemented-interfaces* '()
39     "List of interface functions that are not implemented.
40     DEFINTERFACE adds to this list and DEFIMPLEMENTATION removes.")
41    
42 heller 1.52 (defmacro definterface (name args documentation &rest default-body)
43 lgorrie 1.21 "Define an interface function for the backend to implement.
44     A generic function is defined with NAME, ARGS, and DOCUMENTATION.
45    
46     If a DEFAULT-BODY is supplied then NO-APPLICABLE-METHOD is specialized
47     to execute the body if the backend doesn't provide a specific
48     implementation.
49    
50     Backends implement these functions using DEFIMPLEMENTATION."
51 lgorrie 1.43 (check-type documentation string "a documentation string")
52 lgorrie 1.21 (flet ((gen-default-impl ()
53     (let ((received-args (gensym "ARGS-")))
54     `(defmethod no-applicable-method ((#:method
55     (eql (function ,name)))
56     &rest ,received-args)
57     (destructuring-bind ,args ,received-args
58     ,@default-body)))))
59 lgorrie 1.48 `(progn (defgeneric ,name ,args (:documentation ,documentation))
60     (pushnew ',name *interface-functions*)
61     ,(if (null default-body)
62     `(pushnew ',name *unimplemented-interfaces*)
63     (gen-default-impl))
64     ;; see <http://www.franz.com/support/documentation/6.2/doc/pages/variables/compiler/s_cltl1-compile-file-toplevel-compatibility-p_s.htm>
65     (eval-when (:compile-toplevel :load-toplevel :execute)
66     (export ',name :swank-backend))
67     ',name)))
68 lgorrie 1.21
69     (defmacro defimplementation (name args &body body)
70 heller 1.25 `(progn (defmethod ,name ,args ,@body)
71     (if (member ',name *interface-functions*)
72     (setq *unimplemented-interfaces*
73     (remove ',name *unimplemented-interfaces*))
74     (warn "DEFIMPLEMENTATION of undefined interface (~S)" ',name))
75     ',name))
76 lgorrie 1.21
77     (defun warn-unimplemented-interfaces ()
78     "Warn the user about unimplemented backend features.
79     The portable code calls this function at startup."
80     (warn "These Swank interfaces are unimplemented:~% ~A"
81     (sort (copy-list *unimplemented-interfaces*) #'string<)))
82    
83    
84 heller 1.46 ;;;; Utilities
85    
86     (defmacro with-struct ((conc-name &rest names) obj &body body)
87     "Like with-slots but works only for structs."
88     (flet ((reader (slot) (intern (concatenate 'string
89     (symbol-name conc-name)
90     (symbol-name slot))
91     (symbol-package conc-name))))
92     (let ((tmp (gensym "OO-")))
93     ` (let ((,tmp ,obj))
94     (symbol-macrolet
95     ,(loop for name in names collect
96     (typecase name
97     (symbol `(,name (,(reader name) ,tmp)))
98     (cons `(,(first name) (,(reader (second name)) ,tmp)))
99     (t (error "Malformed syntax in WITH-STRUCT: ~A" name))))
100     ,@body)))))
101    
102 lgorrie 1.13 ;;;; TCP server
103    
104 heller 1.29 (definterface create-socket (host port)
105     "Create a listening TCP socket on interface HOST and port PORT .")
106 lgorrie 1.13
107 lgorrie 1.21 (definterface local-port (socket)
108     "Return the local port number of SOCKET.")
109 lgorrie 1.1
110 lgorrie 1.21 (definterface close-socket (socket)
111     "Close the socket SOCKET.")
112 lgorrie 1.1
113 lgorrie 1.21 (definterface accept-connection (socket)
114 heller 1.16 "Accept a client connection on the listening socket SOCKET. Return
115 lgorrie 1.21 a stream for the new connection.")
116 heller 1.16
117 heller 1.31 (definterface add-sigio-handler (socket fn)
118 lgorrie 1.21 "Call FN whenever SOCKET is readable.")
119 heller 1.16
120 heller 1.31 (definterface remove-sigio-handlers (socket)
121     "Remove all sigio handlers for SOCKET.")
122    
123     (definterface add-fd-handler (socket fn)
124     "Call FN when Lisp is waiting for input and SOCKET is readable.")
125    
126     (definterface remove-fd-handlers (socket)
127     "Remove all fd-handlers for SOCKET.")
128 heller 1.18
129 heller 1.36 (definterface preferred-communication-style ()
130     "Return one of the symbols :spawn, :sigio, :fd-handler, or NIL."
131     nil)
132    
133 lgorrie 1.13 ;;; Base condition for networking errors.
134 msimmons 1.50 (define-condition network-error (simple-error) ())
135 lgorrie 1.13
136 lgorrie 1.21 (definterface emacs-connected ()
137 lgorrie 1.13 "Hook called when the first connection from Emacs is established.
138     Called from the INIT-FN of the socket server that accepts the
139     connection.
140 lgorrie 1.1
141 lgorrie 1.13 This is intended for setting up extra context, e.g. to discover
142 lgorrie 1.21 that the calling thread is the one that interacts with Emacs."
143     nil)
144 lgorrie 1.1
145    
146 heller 1.20 ;;;; Unix signals
147    
148     (defconstant +sigint+ 2)
149    
150 heller 1.36 (definterface call-without-interrupts (fn)
151     "Call FN in a context where interrupts are disabled."
152     (funcall fn))
153 heller 1.20
154 heller 1.32 (definterface getpid ()
155     "Return the (Unix) process ID of this superior Lisp.")
156    
157     (definterface lisp-implementation-type-name ()
158     "Return a short name for the Lisp implementation."
159     (lisp-implementation-type))
160 heller 1.20
161 heller 1.51 (definterface default-directory ()
162     "Return the default directory."
163     (directory-namestring (truename *default-pathname-defaults*)))
164    
165 heller 1.39 (definterface set-default-directory (directory)
166     "Set the default directory.
167     This is used to resolve filenames without directory component."
168     (setf *default-pathname-defaults* (truename (merge-pathnames directory)))
169 heller 1.51 (default-directory))
170    
171     (definterface call-with-syntax-hooks (fn)
172     "Call FN with hooks to handle special syntax."
173     (funcall fn))
174 heller 1.39
175 heller 1.52 (definterface default-readtable-alist ()
176     "Return a suitable initial value for SWANK:*READTABLE-ALIST*."
177     '())
178    
179 heller 1.20
180 lgorrie 1.1 ;;;; Compilation
181 dbarlow 1.8
182 lgorrie 1.21 (definterface call-with-compilation-hooks (func)
183 lgorrie 1.47 "Call FUNC with hooks to record compiler conditions.")
184 lgorrie 1.13
185 vsedach 1.14 (defmacro with-compilation-hooks ((&rest ignore) &body body)
186 lgorrie 1.47 "Execute BODY as in CALL-WITH-COMPILATION-HOOKS."
187 vsedach 1.14 (declare (ignore ignore))
188 dbarlow 1.8 `(call-with-compilation-hooks (lambda () (progn ,@body))))
189 lgorrie 1.1
190 heller 1.36 (definterface swank-compile-string (string &key buffer position)
191 lgorrie 1.47 "Compile source from STRING. During compilation, compiler
192 lgorrie 1.1 conditions must be trapped and resignalled as COMPILER-CONDITIONs.
193    
194     If supplied, BUFFER and POSITION specify the source location in Emacs.
195    
196     Additionally, if POSITION is supplied, it must be added to source
197 lgorrie 1.21 positions reported in compiler conditions.")
198 lgorrie 1.1
199 lgorrie 1.43 (definterface operate-on-system (system-name operation-name &rest keyword-args)
200     "Perform OPERATION-NAME on SYSTEM-NAME using ASDF.
201     The KEYWORD-ARGS are passed on to the operation.
202     Example:
203     \(operate-on-system \"SWANK\" \"COMPILE-OP\" :force t)"
204     (unless (member :asdf *features*)
205     (error "ASDF is not loaded."))
206 heller 1.30 (with-compilation-hooks ()
207 lgorrie 1.43 (let ((operate (find-symbol "OPERATE" :asdf))
208     (operation (find-symbol operation-name :asdf)))
209     (when (null operation)
210     (error "Couldn't find ASDF operation ~S" operation-name))
211     (apply operate operation system-name keyword-args))))
212 mbaringer 1.26
213 heller 1.36 (definterface swank-compile-file (filename load-p)
214 lgorrie 1.1 "Compile FILENAME signalling COMPILE-CONDITIONs.
215 lgorrie 1.21 If LOAD-P is true, load the file after compilation.")
216 lgorrie 1.1
217 lgorrie 1.13 (deftype severity () '(member :error :warning :style-warning :note))
218    
219     ;; Base condition type for compiler errors, warnings and notes.
220     (define-condition compiler-condition (condition)
221     ((original-condition
222     ;; The original condition thrown by the compiler if appropriate.
223     ;; May be NIL if a compiler does not report using conditions.
224     :type (or null condition)
225     :initarg :original-condition
226     :accessor original-condition)
227    
228     (severity :type severity
229     :initarg :severity
230     :accessor severity)
231    
232     (message :initarg :message
233     :accessor message)
234    
235 heller 1.30 (short-message :initarg :short-message
236     :initform nil
237     :accessor short-message)
238    
239 lgorrie 1.13 (location :initarg :location
240     :accessor location)))
241 heller 1.30
242 lgorrie 1.17
243 lgorrie 1.13 ;;;; Streams
244    
245 lgorrie 1.21 (definterface make-fn-streams (input-fn output-fn)
246 lgorrie 1.13 "Return character input and output streams backended by functions.
247     When input is needed, INPUT-FN is called with no arguments to
248     return a string.
249     When output is ready, OUTPUT-FN is called with the output as its
250     argument.
251    
252     Output should be forced to OUTPUT-FN before calling INPUT-FN.
253    
254 lgorrie 1.21 The streams are returned as two values.")
255 lgorrie 1.13
256 lgorrie 1.1
257     ;;;; Documentation
258    
259 heller 1.36 (definterface arglist (name)
260     "Return the lambda list for the symbol NAME.
261    
262 heller 1.44 The result can be a list or the :not-available if the arglist cannot
263     be determined.")
264 lgorrie 1.1
265 lgorrie 1.21 (definterface macroexpand-all (form)
266 lgorrie 1.1 "Recursively expand all macros in FORM.
267 lgorrie 1.21 Return the resulting form.")
268 lgorrie 1.1
269 lgorrie 1.21 (definterface describe-symbol-for-emacs (symbol)
270 lgorrie 1.1 "Return a property list describing SYMBOL.
271    
272     The property list has an entry for each interesting aspect of the
273     symbol. The recognised keys are:
274    
275     :VARIABLE :FUNCTION :SETF :TYPE :CLASS :MACRO :COMPILER-MACRO
276     :ALIEN-TYPE :ALIEN-STRUCT :ALIEN-UNION :ALIEN-ENUM
277    
278     The value of each property is the corresponding documentation string,
279     or :NOT-DOCUMENTED. It is legal to include keys not listed here.
280    
281     Properties should be included if and only if they are applicable to
282     the symbol. For example, only (and all) fbound symbols should include
283     the :FUNCTION property.
284    
285     Example:
286     \(describe-symbol-for-emacs 'vector)
287     => (:CLASS :NOT-DOCUMENTED
288     :TYPE :NOT-DOCUMENTED
289 lgorrie 1.21 :FUNCTION \"Constructs a simple-vector from the given objects.\")")
290    
291     (definterface describe-definition (name type)
292     "Describe the definition NAME of TYPE.
293     TYPE can be any value returned by DESCRIBE-SYMBOL-FOR-EMACS.
294    
295     Return a documentation string, or NIL if none is available.")
296 lgorrie 1.2
297    
298     ;;;; Debugging
299    
300 lgorrie 1.21 (definterface call-with-debugging-environment (debugger-loop-fn)
301 lgorrie 1.2 "Call DEBUGGER-LOOP-FN in a suitable debugging environment.
302    
303     This function is called recursively at each debug level to invoke the
304     debugger loop. The purpose is to setup any necessary environment for
305     other debugger callbacks that will be called within the debugger loop.
306    
307     For example, this is a reasonable place to compute a backtrace, switch
308 lgorrie 1.21 to safe reader/printer settings, and so on.")
309 lgorrie 1.2
310     (define-condition sldb-condition (condition)
311     ((original-condition
312     :initarg :original-condition
313 heller 1.5 :accessor original-condition))
314 lgorrie 1.2 (:documentation
315     "Wrapper for conditions that should not be debugged.
316    
317     When a condition arises from the internals of the debugger, it is not
318     desirable to debug it -- we'd risk entering an endless loop trying to
319     debug the debugger! Instead, such conditions can be reported to the
320     user without (re)entering the debugger by wrapping them as
321     `sldb-condition's."))
322    
323 heller 1.36 (definterface compute-backtrace (start end)
324 lgorrie 1.3 "Return a list containing a backtrace of the condition current
325     being debugged. The results are unspecified if this function is
326 heller 1.36 called outside the dynamic contour CALL-WITH-DEBUGGING-ENVIRONMENT.
327    
328     START and END are zero-based indices constraining the number of frames
329     returned. Frame zero is defined as the frame which invoked the
330     debugger. If END is nil, return the frames from START to the end of
331     the stack.")
332 lgorrie 1.3
333 heller 1.36 (definterface print-frame (frame stream)
334     "Print frame to stream.")
335 lgorrie 1.3
336 lgorrie 1.21 (definterface frame-source-location-for-emacs (frame-number)
337     "Return the source location for FRAME-NUMBER.")
338 lgorrie 1.3
339 lgorrie 1.21 (definterface frame-catch-tags (frame-number)
340 lgorrie 1.3 "Return a list of XXX list of what? catch tags for a debugger
341     stack frame. The results are undefined unless this is called
342     within the dynamic contour of a function defined by
343 lgorrie 1.21 DEFINE-DEBUGGER-HOOK.")
344 lgorrie 1.3
345 lgorrie 1.21 (definterface frame-locals (frame-number)
346 lgorrie 1.3 "Return a list of XXX local variable designators define me
347     for a debugger stack frame. The results are undefined unless
348     this is called within the dynamic contour of a function defined
349 lgorrie 1.21 by DEFINE-DEBUGGER-HOOK.")
350 heller 1.37
351     (definterface disassemble-frame (frame-number)
352     "Disassemble the code for the FRAME-NUMBER.
353     The output should be written to standard output.
354     FRAME-NUMBER is a non-negative interger.")
355    
356 lgorrie 1.21 (definterface eval-in-frame (form frame-number)
357 lgorrie 1.3 "Evaluate a Lisp form in the lexical context of a stack frame
358     in the debugger. The results are undefined unless called in the
359     dynamic contour of a function defined by DEFINE-DEBUGGER-HOOK.
360    
361     FRAME-NUMBER must be a positive integer with 0 indicating the
362     frame which invoked the debugger.
363    
364     The return value is the result of evaulating FORM in the
365 lgorrie 1.21 appropriate context.")
366 heller 1.22
367     (definterface return-from-frame (frame-number form)
368     "Unwind the stack to the frame FRAME-NUMBER and return the value(s)
369     produced by evaluating FORM in the frame context to its caller.
370    
371     Execute any clean-up code from unwind-protect forms above the frame
372     during unwinding.
373    
374     Return a string describing the error if it's not possible to return
375     from the frame.")
376    
377     (definterface restart-frame (frame-number)
378     "Restart execution of the frame FRAME-NUMBER with the same arguments
379     as it was called originally.")
380 lgorrie 1.3
381 lgorrie 1.49 (definterface format-sldb-condition (condition)
382     "Format a condition for display in SLDB."
383     (princ-to-string condition))
384    
385     (definterface condition-references (condition)
386     "Return a list of documentation references for a condition.
387     Each reference is one of:
388     (:ANSI-CL
389     {:FUNCTION | :SPECIAL-OPERATOR | :MACRO | :SECTION | :GLOSSARY }
390     symbol-or-name)
391     (:SBCL :NODE node-name)"
392     '())
393 heller 1.52
394     (definterface sldb-step (frame-number)
395     "Step to the next code location in the frame FRAME-NUMBER.")
396    
397 lgorrie 1.49
398 lgorrie 1.3
399 heller 1.36 ;;;; Definition finding
400    
401     (defstruct (:location (:type list) :named
402 lgorrie 1.45 (:constructor make-location
403     (buffer position &optional hints)))
404     buffer position
405     ;; Hints is a property list optionally containing:
406     ;; :snippet SOURCE-TEXT
407     ;; This is a snippet of the actual source text at the start of
408     ;; the definition, which could be used in a text search.
409     hints)
410 heller 1.36
411     (defstruct (:error (:type list) :named (:constructor)) message)
412     (defstruct (:file (:type list) :named (:constructor)) name)
413     (defstruct (:buffer (:type list) :named (:constructor)) name)
414     (defstruct (:position (:type list) :named (:constructor)) pos)
415    
416     (definterface find-definitions (name)
417     "Return a list ((DSPEC LOCATION) ...) for NAME's definitions.
418    
419 heller 1.38 NAME is a \"definition specifier\".
420 heller 1.36
421 heller 1.38 DSPEC is a \"definition specifier\" describing the
422 heller 1.36 definition, e.g., FOO or (METHOD FOO (STRING NUMBER)) or
423 heller 1.38 \(DEFVAR FOO).
424    
425     LOCATION is the source location for the definition.")
426 heller 1.36
427    
428     ;;;; XREF
429    
430     (definterface who-calls (function-name)
431     "Return the call sites of FUNCTION-NAME (a symbol).
432     The results is a list ((DSPEC LOCATION) ...).")
433    
434     (definterface who-references (variable-name)
435     "Return the locations where VARIABLE-NAME (a symbol) is referenced.
436     See WHO-CALLS for a description of the return value.")
437    
438     (definterface who-binds (variable-name)
439     "Return the locations where VARIABLE-NAME (a symbol) is bound.
440     See WHO-CALLS for a description of the return value.")
441    
442     (definterface who-sets (variable-name)
443     "Return the locations where VARIABLE-NAME (a symbol) is set.
444     See WHO-CALLS for a description of the return value.")
445    
446     (definterface who-macroexpands (macro-name)
447     "Return the locations where MACRO-NAME (a symbol) is expanded.
448     See WHO-CALLS for a description of the return value.")
449    
450     (definterface who-specializes (class-name)
451     "Return the locations where CLASS-NAME (a symbol) is specialized.
452     See WHO-CALLS for a description of the return value.")
453    
454     ;;; Simpler variants.
455    
456     (definterface list-callers (function-name)
457     "List the callers of FUNCTION-NAME.
458     This function is like WHO-CALLS except that it is expected to use
459     lower-level means. Whereas WHO-CALLS is usually implemented with
460     special compiler support, LIST-CALLERS is usually implemented by
461     groveling for constants in function objects throughout the heap.
462    
463     The return value is as for WHO-CALLS.")
464    
465     (definterface list-callees (function-name)
466     "List the functions called by FUNCTION-NAME.
467     See LIST-CALLERS for a description of the return value.")
468    
469    
470 heller 1.23 ;;;; Profiling
471    
472     ;;; The following functions define a minimal profiling interface.
473    
474     (definterface profile (fname)
475     "Marks symbol FNAME for profiling.")
476    
477     (definterface profiled-functions ()
478     "Returns a list of profiled functions.")
479    
480     (definterface unprofile (fname)
481     "Marks symbol FNAME as not profiled.")
482    
483     (definterface unprofile-all ()
484     "Marks all currently profiled functions as not profiled."
485     (dolist (f (profiled-functions))
486     (unprofile f)))
487    
488     (definterface profile-report ()
489     "Prints profile report.")
490    
491     (definterface profile-reset ()
492     "Resets profile counters.")
493    
494     (definterface profile-package (package callers-p methods)
495     "Wrap profiling code around all functions in PACKAGE. If a function
496     is already profiled, then unprofile and reprofile (useful to notice
497     function redefinition.)
498    
499     If CALLERS-P is T names have counts of the most common calling
500     functions recorded.
501    
502     When called with arguments :METHODS T, profile all methods of all
503     generic functions having names in the given package. Generic functions
504     themselves, that is, their dispatch functions, are left alone.")
505    
506    
507 heller 1.19 ;;;; Inspector
508    
509 heller 1.35 (definterface inspected-parts (object)
510     "Return a short description and a list of (LABEL . VALUE) pairs."
511     (values (format nil "~S is an atom." object) '()))
512 heller 1.19
513 heller 1.29 (definterface describe-primitive-type (object)
514 heller 1.35 "Return a string describing the primitive type of object."
515 heller 1.36 (declare (ignore object))
516 heller 1.35 "N/A")
517 heller 1.19
518    
519 heller 1.36 ;;;; Multithreading
520 lgorrie 1.21 ;;;
521     ;;; The default implementations are sufficient for non-multiprocessing
522     ;;; implementations.
523 lgorrie 1.9
524 lgorrie 1.21 (definterface startup-multiprocessing ()
525 lgorrie 1.9 "Initialize multiprocessing, if necessary.
526    
527     This function is called directly through the listener, not in an RPC
528     from Emacs. This is to support interfaces such as CMUCL's
529     MP::STARTUP-IDLE-AND-TOP-LEVEL-LOOPS which does not return like a
530 lgorrie 1.21 normal function."
531     nil)
532 lgorrie 1.9
533 lgorrie 1.21 (definterface spawn (fn &key name)
534     "Create a new thread to call FN.")
535 lgorrie 1.17
536 heller 1.28 (definterface thread-name (thread)
537     "Return the name of THREAD.
538 lgorrie 1.9
539     Thread names are be single-line strings and are meaningful to the
540 lgorrie 1.21 user. They do not have to be unique."
541 heller 1.28 (declare (ignore thread))
542 lgorrie 1.21 "The One True Thread")
543 lgorrie 1.9
544 heller 1.28 (definterface thread-status (thread)
545     "Return a string describing THREAD's state."
546     (declare (ignore thread))
547     "")
548    
549 lgorrie 1.21 (definterface make-lock (&key name)
550 lgorrie 1.17 "Make a lock for thread synchronization.
551 lgorrie 1.21 Only one thread may hold the lock (via CALL-WITH-LOCK-HELD) at a time."
552 heller 1.23 (declare (ignore name))
553 lgorrie 1.21 :null-lock)
554 lgorrie 1.9
555 lgorrie 1.21 (definterface call-with-lock-held (lock function)
556     "Call FUNCTION with LOCK held, queueing if necessary."
557 heller 1.24 (declare (ignore lock)
558     (type function function))
559 lgorrie 1.21 (funcall function))
560 heller 1.25
561     (definterface current-thread ()
562     "Return the currently executing thread."
563     0)
564 heller 1.28
565     (definterface all-threads ()
566     "Return a list of all threads.")
567    
568     (definterface thread-alive-p (thread)
569 heller 1.35 "Test if THREAD is termintated."
570     (member thread (all-threads)))
571 heller 1.25
572     (definterface interrupt-thread (thread fn)
573     "Cause THREAD to execute FN.")
574    
575 mbaringer 1.34 (definterface kill-thread (thread)
576     "Kill THREAD."
577     (declare (ignore thread))
578     nil)
579    
580 heller 1.25 (definterface send (thread object)
581     "Send OBJECT to thread THREAD.")
582    
583     (definterface receive ()
584     "Return the next message from current thread's mailbox.")
585 mbaringer 1.42
586     (definterface quit-lisp ()
587     "Exit the current lisp image.")

  ViewVC Help
Powered by ViewVC 1.1.5