Thanks Gary for the explanation.<div><br></div><div>As for using EVAL, right now I'm just mimicking what Digitool's MCL provided.</div><div>Looking at their source yesterday taught me something new - that one could pass</div><div>a function to be funcall-ed instead of a form to be eval-ed. Your advice will be followed!</div><div><br></div><div>Arthur<br><br>----- Original Message -----<br>From: Gary Byers <gb@clozure.com><br>Date: Thursday, February 5, 2009 1:31 pm<br>Subject: Re: [Openmcl-devel] (process-suspend *current-process*) ?<br>To: Arthur W Cater <arthur.cater@ucd.ie><br>Cc: Openmcl-devel <Openmcl-devel@clozure.com><br><br>> The documentation's wrong; the function's right in claiming that <br>> it can't<br>> possibly work.<br>> <br>> (At one point it may have worked: a process could suspend itself <br>> and hope<br>> that something would later resume it.  It then became clear <br>> that - to the<br>> extent that PROCESS-SUSPEND is even a good idea - that PROCESS-SUSPEND<br>> and PROCESS-RESUME needed to own a lock.  (PROCESS-SUSPEND <br>> *CURRENT-PROCESS*)<br>> would disable the current process while owning that lock; any <br>> other thread<br>> that tried to resume it would wait for that lock.)<br>> <br>> There are all kinds of other ways to deadlock via PROCESS-<br>> SUSPEND; if the<br>> documentation doesn't scare you out of trying to use it (unless you're<br>> very, very careful), it should.<br>> <br>> Once in a blue moon, suspending a thread is the right way (or <br>> the only<br>> way) to do things.  That's also true of calling EVAL, but <br>> it's generally<br>> good advice that if you find yourself calling EVAL, you should pause<br>> and ask yourself if you're doing things the right way.  (In <br>> the case of<br>> EVAL, well ... sure, sometimes it's the only way to do <br>> something.  If<br>> it isn't the only way, other ways are almost better.)<br>> <br>> Sometimes - mostly for debugging - it's necessary to find the <br>> value of<br>> the binding of a special variable in another process<br>> (e.g. SYMBOL-VALUE-IN-PROCESS).  It's very difficult to <br>> look at another<br>> thread's stack while that thread is running (and its stack <br>> pointer and<br>> stack contents are changing.)  Suspending the other thread <br>> (or otherwise<br>> trying to ensure that it's in some static, quiescent state) is <br>> probablya necessary part of the implementation of SYMBOL-VALUE-<br>> IN-PROCESS and<br>> things like that; in SYMBOL-VALUE-IN-PROCESS, two threads (the caller<br>> and the target process) are contending for a resource (the target<br>> process's stack), and there isn't a particularly good way to get the<br>> target thread to stop using that resource (its stack) without putting<br>> it to sleep.)  Most other resource-contention problems have less<br>> drastic (and less risky) solutions.<br>> <br>> PROCESS-SUSPEND is generally the wrong thing, and there are <br>> implementationreasons that make suspending the current process <br>> impossible.  If those<br>> reasons didn't exist, why would you want a process to suspend <br>> itself ?<br>> The only way that it could wake up is if some other thread <br>> resumed it,<br>> presumably in response to some external event.  Associating <br>> a semaphore<br>> with that event is often a straightforward way of waiting for <br>> the event<br>> to occur.<br>> <br>> <br>> <br>> On Thu, 5 Feb 2009, Arthur W Cater wrote:<br>> <br>> > Hi,<br>> ><br>> > I'm running�Clozure Common Lisp Version 1.2-r11687M <br>> �(DarwinPPC32) Mac OS 10.5.6.<br>> > I've just done svn update, (rebuild-ccl :force t), (require <br>> :cocoa-application).<br>> ><br>> > I'm trying to implement something similar to MCL's Eval-<br>> Enqueue, using a new process with a<br>> > queue of forms, which when the queue gets empty does�(process-<br>> suspend *current-process*)<br>> > The following pops up in the console window:<br>> ><br>> >> Error: Suspending the current process can't work.��<br>> >> � � � ��(If the documentation claims otherwise, it's incorrect.)<br>> >> While executing: PROCESS-SUSPEND, in process Eval-Queue(6).<br>> ><br>> > The documentation does claim otherwise:<br>> > "A process can suspend itself; it it's successful in doing so, <br>> then it can obviously only be resumed by some other process."<br>> ><br>> > I cannot find any tickets which mention process-suspend.<br>> ><br>> > (I guess I should use a wait-on-semaphore instead of process-<br>> suspend, process-resume.)<br>> ><br>> > Arthur<br>> ><br>> ><br>> ></div>