On 4/11/14 20:30, Alain Rastoul wrote:
Stef,
As I said to Igor, the main problem about NativeBoost was between
the chair and the keyboard... :)
It is my first use of NativeBoost, I simply overlooked the very good
existing chapter of EnterprisePharo on NativeBoost
(NativeBoost recipes, the X11 journey) and misused the
NativeBoost marshalling of data types.
NAtiveBoost is great.

If I achieve my experiments with zeromq and ends up with
something clean (not the case actually, and not my first goal),
I will be glad to add  a chapter about that.

ok je le note ;)


My current problem is about a different socket behaviour between
windows and linux.
I think this is not a problem with ZeroMQ, the C program works as expected,
I have to look for an explanation.
No stress about that


Alain


Le 04/11/2014 10:39, stepharo a écrit :
Alain

which nativeboost chapter :)?
Could you propose a paragraph so that we cover the problem you faced?

Stef

On 4/11/14 00:44, Alain Rastoul 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 ?

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
<alf.mmm....@gmail.com
<mailto:alf.mmm....@gmail.com>> 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.













Reply via email to