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
