[Seaside] Re: Render loop... not looping
Esteban A. Maringolo
eMaringolo at smalltalking.net
Thu Nov 10 13:55:54 CET 2005
Hi,
I've found something, I paste the text posted to the c.l.s.dolphin
newsgroup below.
Julian Fitzell escribió:
> Esteban A. Maringolo wrote:
>> 2005/11/8, Julian Fitzell <julian at beta4.com>:
>>> Esteban A. Maringolo wrote:
>>>> Julian Fitzell escribió:
>>>> And what is the purpose of the critical:ifError: method?
>>>> Why it uses a mutex and forks the evaluation of the block?
>>> It's designed to ensure that only one request is evaluating within a
>>> session at a time. This is desirable because otherwise everything would
>>> need to be written to support concurrency. In fact, given that we are
>>> reverting object instvars back and forth to handle continuations this is
>>> pretty important even at the system level. As it stands, that semaphore
>>> ensures you only need to worry about concurrent access of resources that
>>> are accessed by more than one session (db, etc).
>> Thanks. I've imagined it to be that. What I didn't see is the side
>> effect of not having to deal with concurrency everywhere.
>> By now I'm using it without mutex nor semaphore until I find a
>> solution to make it work on Dolphin.
>> Any clues about why it doesn't render again?
> Erm, not totally obvious to me... though it sounds like it could be a
> problem with the state being rolled back and since that is probably
> affected by the semaphore, perhaps there is some interaction going on
> there.
I've found that the ensured block was executed twice, it is the
semaphore signaled twice too. Removing the ensuring everything works
ok. What is the relation of this to continuations... I can't tell,
but my guess is that has something with ProcessCopier.
So... replacing:
WAProcessMonitor>>critical: aBlock ifError: errorBlock
| value |
value := nil.
mutex critical: [ "mutex is a mutually exclusive semaphore"
responseSem := Semaphore new.
process := [
[value := aBlock on: Error do: errorBlock]
ensure: [responseSem signal]
] fork.
responseSem wait.
].
process := nil.
^value
By:
WAProcessMonitor>>critical: aBlock ifError: errorBlock
| value |
value := nil.
mutex critical: [
responseSem := Semaphore new.
process := [
value := aBlock on: Error do: errorBlock.
responseSem signal
] fork.
responseSem wait.
].
process := nil.
^value
Everything starts working magically. Of course, no ensuring is done,
but by now it wasn't necessary, in the future this has to be solved.
> I'd look into it more for you but I'm trying to get ready to go
> to india tomorrow morning so I'm a bit swamped.
Happy traveling.
> I'm sure someone else
> can give you another pointer...
A breeze sound by now :-/
Best regards,
--
Esteban.
More information about the Seaside
mailing list