Andreas Ronge created JRUBY-6461:
------------------------------------

             Summary: FFI problem on linux 64bit
                 Key: JRUBY-6461
                 URL: https://jira.codehaus.org/browse/JRUBY-6461
             Project: JRuby
          Issue Type: Bug
          Components: C Extensions
    Affects Versions: JRuby 1.6.6, JRuby 1.6.5
         Environment: Java version "1.6.0_29" Java(TM) SE Runtime Environment 
(build 1.6.0_29-b11)
Linux x86/x64 3.0.0-16-generic #28-Ubuntu SMP Fri Jan 27 17:44:39 UTC 2012 
x86_64 x86_64 x86_64 GNU/Linux


            Reporter: Andreas Ronge
            Assignee: Thomas E Enebo
            Priority: Minor
         Attachments: ffi_test.zip

Hi all,

We have a problem with JRuby 1.6.5 and 1.6.6 + FFI + Linux x64, it seems like a 
bug.
We have a library, named xxx_decoder.so, include Linux x86/x64 edition.
The C/C++ declare:
--------
typedef struct S_Time
{
        UINT32 Second;  
        UINT32 Usecond; 
}S_Time;

extern "C" int DecodeProc(HandleType int, unsigned char* data, int Len, S_Time 
s_time)
--------

The code (see attached test case):

--------
require 'ffi'

class S_Time < FFI::Struct
  layout :seconds => :uint32, :useconds => :uint32
end

class Decoder
  def initialize(lib)
  extend FFI:Library
  ffi_lib lib
  
  attach_function :DecodeProc, [:int, :pointer, :int, S_Time.by_value], int
  # .... Other functions
end
--------

And used like this:
# bit64 is a function to detect the OS bits.
lib = bit64 ? 'xxx_64_decoder.so' : 'xxx_32_decoder.so'
@decoder = Decoder.new(lib)
buf = "abcdef123456"
s_time = S_Time.new
s_time[:seconds], s[:useconds] = 1280196162, 138000
@decoder.DecodeProc(10, buf, buf.length, s_time)

These codes works fine under Linux 32, Windows 7(x64, JRuby is 32 bit), The 
library 
receive the s_time correctly, but under Linux x64, the FFI pass the s_time 
address,
so the library can't receive the time value correctly.

We found, If we change the S_Time declare as pointer, we can pass the s_time 
into
library correcly. But the libraries already used for many clients, we can't 
change 
the library interface declare, so I had to found a way to solve this issue with 
JRuby/FFI myself.

To reproduce - see the attached test case, and run the 
  ruby ffi_struct_fail.rb

It should return something like this:
 [1280196162, 138000]
 [1280196162, 138000]
 [1280196162, 139068]
 [1280196162, 139588]
 [1280196162, 139745]
 [1280196162, 139745]

However, on my 64 bit linux it returns:
[1276791760, 32548]
[2545484410, 695521]
[2545484410, 696589]
[2545484410, 697109]
[2545484410, 697266]
[2545484410, 697266]
[2545484411, 241823]





--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to