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.

Reply via email to