Hi Eliot, all,
I'm baffled by this example:
p := [Semaphore new wait] fork.
Processor yield.
p resume explore
I expected to get an error but the process just gets out of the semaphore and finishes happily.
#resume comment says:
Primitive. Allow the process that the receiver represents to continue. Put
the receiver in line to become the activeProcess. *Fail if the receiver is
already waiting in a queue (in a Semaphore or ProcessScheduler)*. Fail if
the receiver's suspendedContext is not a context.
The following works as expected - p sits at the semaphore:
p := [Semaphore new wait] fork.
Processor yield.
p explore
This works as well (with the new VM) - p backs up and sits before the wait:
p := [Semaphore new wait] fork.
Processor yield.
p suspend.
p explore
And this works too indeed - p sits at the semaphore again after suspend.
p := [Semaphore new wait] fork.
Processor yield.
p suspend.
p resume explore
Is this a bug? Or is the comment just outdated?
I've been trying to figure out possible ways how to prevent resuming a process being terminated (other than setting its suspendedContext to nil) and this unexpected behavior gave me a real hard time :)
Many thanks for your help.
Best regards,
Jaromir