Yendo un poco mas a fondo... en general el tema con esos pragmas es
que no cubren todas las funciones habidas y por haber.  Por ejemplo,
en Windows cuando usas sockets tenes que llamar a WSAGetLastError() en
vez de GetLastError()... se imaginan que no se puede andar agregando
_wsawincall, _pirulocall, _mongocall etc todo el tiempo para
contemplar todos los casos posibles.  Por eso es que, si la cosa se
pone peliaguda, lo mejor es ni usar un FFI y escribir primitivas
directamente.  Es mas, con primitivas podes asumir la estructura del
objeto que recibe el metodo que invoca la primitiva, y entonces el
marshalling lo optimiza el compilador de C para esa llamada
particular.  Con un poco de cuidado, hasta te podrias guardar las
cosas en un byte array y entonces ni marshalling hay...

2010/8/27 Andres Valloud <[email protected]>:
> Por eso en DLLCC hay un pragma para llamar a una funcion de Windows
> devolviendo el GetLastError() si la funcion falla... el pragma es
> _wincall.  Para *nix, tambien hay _syscall para poder obtener el valor
> de errno asociado a la funcion que acabas de llamar via el FFI.
>
> Lamentablemente, en VisualWorks hay un metodo para llamar a
> GetLastError() directamente en la clase Win32SystemSupport.  Eso es un
> error y me gustaria que para la version nueva eso no este mas :)...
>
> 2010/8/27 Gerardo Richarte <[email protected]>:
>> On 08/26/2010 06:06 PM, Andres Valloud wrote:
>>> En el caso general, como harias para detectar que otro proceso
>>> interrumpio al proceso que esta por llamar a GetLastError(),
>> si, no se puede me parece en el caso general. Por otro lado, no
>> es solo si llamaron a GetLastError(). Si llamaron a cualquier otra
>> función de Windows, que resetea el GetLastError() también.
>>
>> El GetLastError() es único por cada thread de Windows, si dos
>> procesos nativos se interrumpen mutuamente, igual el GetLastError()
>> de cada uno está a salvo. El tema es que en Smalltalk pasan dos cosas:
>>
>> . green threads, donde un solo thread nativo aloja más de un hilo de
>> ejecución, y entonces se puede corromper el last error.
>> . La VM también hace cosas entre bytecode y bytecode, método y
>> método, etc. Si entre que llamas a la API y llamas a GetLastError(),
>> por ejemplo, caé un GC, y el GC le devuelve memoria al OS (VirtualProtect(),
>> mmap(), etc). eso va a cambiar el GetLastError().
>>
>> como dijo Andres de entrada, no es seguro llamar a GetLastError()
>> via FFI o algún otro tipo de API call. Y la VM tendría que proveer un
>> mecanismo seguro de hacerlo (básicamente, llamar a GetLastError()
>> después de cada API call, y guardarlo para uso futuro)
>>
>>    saludos,
>>    gera
>>
>> --
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to 
>> [email protected]
>>
>> http://www.clubSmalltalk.org
>

-- 
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