On 4 November 2014 00:44, Alain Rastoul <[email protected]> wrote:
> Hi Igor, > > Thank you for your answer, it worked perfectly > Looks like I overlooked the nativeboost chapter > .. 10 timesRepeatAfterMe: [self rtfm ] . > And my suggestion about testing nil was stupid, much better to fail soon. > ... I am an ass on this one... > > However, I am struggling on another point you already answered in the past > in the mailing list to a guy who wanted to use socket.io : > (http://forum.world.st/socket-io-td3891592.html#a3893031) > "Sockets in Pharo are not blocking the whole VM. > What they block is the process which working with concrete socket. But > other processes can still run, while > one waiting data / even from single socket. " > on windows, zmq socket receive is blocking, on linux, not blocking (hence > not working). > As zmq is doing is IO on another thread, I guess there is some side effect > of > socket receive timeout settings somewhere (in the plugin ?) - just a > guess... > Getting socket options shows no difference, but I don't know how it is > done on the vm > side with regards to threads and if the socket is the same (zmq socket is > not the tcp socket)... > And on linux, the equivalent C program of to the smalltalk version blocks > as expected. > > I a mperplexified ... > may be I should look at vm and plugin code (VMMaker package IIRC) ? > Do you have another advice ? > > What is zmq sockets? Some kind of wrapper library? Then best i can advise is to follow its guidelines, since i'm not familiar with it. Btw, using (NBExternalArray ofType: 'xyz') is highly expensive, please read carefully NBExternalArray class comment, which explains all details. > Thanks you > > Alain > Le 03/11/2014 02:12, Igor Stasenko a écrit : > >> NBExternalArray instances cannot be passed directly to functions >> expecting pointers. >> >> use 'myarray address' for arguments. >> >> On 3 November 2014 00:20, Alain Rastoul >> <[email protected] >> <mailto:[email protected]>> wrote: >> >> Hi, >> >> I have a problem with a nativeboost call, but I don't see what I do >> wrong. >> >> library function prototype is: >> int zmq_getsockopt (void *socket, int option_name, void >> *option_value, size_t *option_len); >> >> my calling method in pharo is: >> zmq_getsockopt: socket option_name: option_name option_value: >> option_value option_len: option_len >> <primitive: #primitiveNativeCall module: #NativeBoostPlugin >> error: errorCode> >> ^self nbCall: #(int zmq_getsockopt (void *socket, int >> option_name, void * option_value, size_t* option_len) ) >> >> when I call it with >> ... >> optionValue := (NBExternalArray ofType: 'int') externalNew: 1. >> optionLen := (NBExternalArray ofType: 'size_t' ) externalNew: 1. >> [ optionValue at: 1 put: 0 . >> optionLen at: 1 put: (NBExternalType sizeOf: 'int') . >> rc := self zmq_getsockopt: socket option_name: option_name >> option_value: optionValue >> option_len: optionLen . >> value := optionValue at: 1 . >> ] ensure: [ optionValue free. >> optionLen free ]. >> ... >> I allways get an exception: "error during FFI call : nil" >> >> >> After stepping in NBFFICallout generation, I found something >> strange, the code >> generation seems not to be called because lastError stays at nil ? >> >> handleFailureIn: aContext nativeCode: aBlock >> lastError := self getErrorFrom: aContext lastError: >> NativeBoost lastError. >> >> >>getErrorFrom: aContext lastError: errorCode >> ... checks pragmas etc >> >>getErrorFrom: aContext lastError: errorCode >> ... lastError := aContext tempAt: method >> numTemps. >> => lastError = nil ??? shouldn't be >> ErrNoNativeCodeInMethod ? >> "install native code and retry the send" >> lastError = ErrNoNativeCodeInMethod >> ifTrue: [ ^ self generateCode: aBlock andRetry: >> aContext ]. >> never gets called ... >> >> "ok, we're out of options, signal an error here" >> ^ self signalError: lastError >> >> Could it be because I use this image on windows and unix ? >> Or because I had an exception at prototype parsing the first time >> because I forgot a ; at the end of the prototype ? >> >> Is my prototype correct or is it the origin of the error ? >> Is there a way to reset the lastError (aContext tempAt: method >> numTemps) ? >> I will try to reset it in debugger but may be there is a cleaner way ? >> would it be ok to change the test in handleFailure to >> (lastError = ErrNoNativeCodeInMethod) or:[ lastError isNil ] ? >> (I can open a bug in this case ) >> >> Any idea or comment is welcome >> Thanks in advance >> >> Alain >> >> >> >> >> >> -- >> Best regards, >> Igor Stasenko. >> > > > > -- Best regards, Igor Stasenko.
