1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
module LibZMQ
def self.version_number
10000 * version[:major] + 100 * version[:minor] + version[:patch]
end
def self.version_string
"%d.%d.%d" % version.values_at(:major, :minor, :patch)
end
raise "zmq library version not supported: #{version_string}" if version_number < 030200
# here are the typedefs for zmsg_msg_t for all known releases of libzmq
# grep 'typedef struct zmq_msg_t' */include/zmq.h
# zeromq-3.2.2/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-3.2.3/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-3.2.4/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-3.2.5/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.0/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.1/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.2/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.3/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.4/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.5/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.6/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.0.7/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
# zeromq-4.1.0/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [48];} zmq_msg_t;
# zeromq-4.1.1/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
# zeromq-4.1.2/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
# zeromq-4.1.3/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
# zeromq-4.1.4/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
# libzmq/include/zmq.h: typedef union zmq_msg_t {unsigned char _ [64]; void *p; } zmq_msg_t;
def self.size_of_zmq_msg_t
if version_number < 040100
32
elsif version_number < 040101
48
else
64
end
end
# Declare Message with correct size and alignment
class Message < FFI::Union
layout :'_', [:uint8, LibZMQ.size_of_zmq_msg_t],
:p, :pointer
end
# Create the basic mapping for the poll_item_t structure so we can
# access those fields via Ruby.
#
module PollItemLayout
def self.included(base)
fd_type = if FFI::Platform::IS_WINDOWS && FFI::Platform::ADDRESS_SIZE == 64
# On Windows, zmq.h defines fd as a SOCKET, which is 64 bits on x64.
:uint64
else
:int
end
base.class_eval do
layout :socket, :pointer,
:fd, fd_type,
:events, :short,
:revents, :short
end
end
end
# PollItem class includes the PollItemLayout module so that we can use the
# basic FFI accessors to get at the structure's fields. We also want to provide
# some higher-level Ruby accessors for convenience.
#
class PollItem < FFI::Struct
include PollItemLayout
def socket
self[:socket]
end
def fd
self[:fd]
end
def readable?
(self[:revents] & ZMQ::POLLIN) > 0
end
def writable?
(self[:revents] & ZMQ::POLLOUT) > 0
end
def inspect
"socket [#{socket}], fd [#{fd}], events [#{self[:events]}], revents [#{self[:revents]}]"
end
end
# /* Socket event data */
# typedef struct {
# uint16_t event; // id of the event as bitfield
# int32_t value ; // value is either error code, fd or reconnect interval
# } zmq_event_t;
module EventDataLayout
def self.included(base)
base.class_eval do
layout :event, :uint16,
:value, :int32
end
end
end # module EventDataLayout
# Provide a few convenience methods for accessing the event structure.
#
class EventData < FFI::Struct
include EventDataLayout
def event
self[:event]
end
def value
self[:value]
end
def inspect
"event [#{event}], value [#{value}]"
end
end # class EventData
end
|