Hola gente,

estoy atras de un problema un tanto inusual por decir algo.
Mi objetivo es usar Seaside en dolphin workers y que la sesión wrapee
con una transacción la respuesta del request (los porqués de esto son
un poquillo off-topic pero el que quiera ver una referencia puede ver
OmniSupport en squeaksource.com). Quedaría (simplificando el exception
handling) algo así:

BlahSession>>withEscapeContinuation: aBlock
        | response |

        ^ self database commit:
                [response := super withEscapeContinuation: aBlock.
                response ifNil: [ODBCannotLockObject signal: 'Re-signalled from
ODBSession'].
                response status = '500' ifTrue: [ODBSInternalError signal].
                response]

Entonces todo lo que la app seaside requiere para resolver ese request
se hace dentro de esa transacción (sacada de un pool para aumentar
availability).

El problema todavía no lo conozco bien pero detallo lo que vi:
se ve de dos formas, 1 a veces se retornan conexiones al pool que ya
habían sido retornadas (notar que el getClient y el returnClient: del
pool están protegidos con un mutex) y 2 a veces se hace un commit a
una transacción que ya le hicieron commit.

Lo que parece estar pasando es que alguien no respeta un #critical:
cosa que sería totalmente chiflada a menos que continuations
estuvieran en el medio (son lo más loco que vi en ST hasta hoy).

Destaco que Esteban para portar el Seaside a Dolphin tuvo que cambiar
WAProcessMonitor>>critical:ifError:

        | value |
        #eamChanged.
        mutex critical:
                [process := Processor activeProcess.
                [value := aBlock on: Error do: anErrorBlock] ensure: [process :=
nil]
        ].
        ^ value


en lugar del original de squeak que, como referencia, es:

        | value |
        mutex critical: [
                semaphore := SeasidePlatformSupport semaphoreClass new.
                process := [
                        [ value := aBlock on: Error do: anErrorBlock ]
                                ensure: [ semaphore signal ] ] fork.
                semaphore wait ].
        process := nil.
        ^ value

Si bien la versión Esteban anda, no termino de convencerme que estén
haciendo lo mismo con los procesos. Todavía no veo como pero ni pude
probarlo pero parecería posible que este habiendo algo que confunde
incluso al critical.

Si alguien tiene una idea de como probar en el workspace que dos
procesos provenientes de continuations respetan normalmente el
critical me sería de gran ayuda. Hace dos días que empecé a
incursionar en las profundidades de las Continuations y todavía no
termino entenderlas.

Algun paper que ayude para recomendar?

gracias,

Sebastian
--~--~---------~--~----~------------~-------~--~----~

To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]

http://www.clubSmalltalk.org
-~----------~----~----~----~------~----~------~--~---

Responder a