File: structures.rb

package info (click to toggle)
ruby-ffi-rzmq-core 1.0.7-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 192 kB
  • sloc: ruby: 524; makefile: 2
file content (133 lines) | stat: -rw-r--r-- 4,271 bytes parent folder | download | duplicates (2)
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