Andreas,

I *think* I already took your second option.  I created functions that do 
nothing but return the structure pointer, call them and pass the result onward 
- it seems to work.

Bill 




-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Andreas Raab
Sent: Saturday, April 03, 2010 1:16 PM
To: The general-purpose Squeak developers list
Cc: [email protected]
Subject: Re: [Pharo-project] FFI - structure pointer

On 4/3/2010 10:10 AM, Schwab,Wilhelm K wrote:
> Andreas,
>
> #getProcAddress: is a Smalltalk message, so it does not have a return 
> type.  It does return an ExternalData because it it ultimately calls
>
>   <cdecl: void* 'FindSymbol' ( long char* )>
>
> I had to create FindSymbol as a simply wrapper around dlsym() because the vm 
> dies a quick death over (what I believe to be) linking hassles similar to 
> recent problems in skype.  Of course, I am referring the Linux vm or I would 
> be calling GetProcAddress().
>
> One thing that I considered is that the aspects of the ExternalData might be 
> incorrect.  The handle is an external address and type is an ExternalType 
> that prints itself as void*.  With many variations, if the call was made, the 
> vm crashed.

Can you verify the correctness of both pointer as well as function signature? 
Depending on platform and/or entity in question you just
*might* get an extra indirection.

If you can't get the code to work as-is I would recommend compiling your own 
library that exports a symbol in the form you're using and then verify 
correctness of the bridge that way.

Cheers,
   - Andreas

> -----Original Message-----
> From: [email protected] 
> [mailto:[email protected]] On Behalf Of 
> Andreas Raab
> Sent: Saturday, April 03, 2010 11:54 AM
> To: The general-purpose Squeak developers list
> Cc: [email protected]
> Subject: Re: [Pharo-project] FFI - structure pointer
>
> On 4/3/2010 6:36 AM, Schwab,Wilhelm K wrote:
>> Andreas, John, anybody,
>>
>> I need to find the address of a "function" (it is in fact a global structure 
>> pointer somewhere in memory) and pass it to another function.
>>
>> Suppose the structure is called Type and the function allocate_one().
>> I call the function something like
>>
>> allocateOne:type size:anInt
>>     <cdecl: SomeOtherStruct* 'allocate_one' ( Type* long )>
>>
>>
>> but I am having an awful time getting the pointer to Type.  Given 
>> that
>> dlsym() will return a pointer to it, how can I represent that in 
>> Smalltalk?  I have tried variations on
>>
>>     "Indirectly call dlsym()"
>>     address := Library default getProcAddress:'name_of_global_struct'.
>>
>>     "try to create Type* from the resulting address"
>>     type := Type fromHandle:address.
>>     type := Type fromHandle:address getHandle.
>>     type := ExternalData fromHandle:address type:Type externalType 
>> asPointerType.
>>
>>     Something := Library default allocateOne:type size:2.
>>
>> and it either complains about bad arguments during the call or segment 
>> faults.  Any ideas or similar examples?
>
> The return type of getProcAddress: is likely wrong. It should be declared to 
> return void* which will cause it to return an ExternalData.
> With an ExternalData your second variant "Type fromHandle: data getHandle" 
> will work.
>
> Cheers,
>     - Andreas


_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to