ffi-rzmq 1.0.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.travis.yml +1 -1
- data/AUTHORS.txt +5 -1
- data/History.txt +24 -0
- data/README.rdoc +2 -4
- data/examples/README.rdoc +1 -3
- data/examples/{v3api/latency_measurement.rb → latency_measurement.rb} +1 -2
- data/examples/{v3api/local_lat.rb → local_lat.rb} +1 -1
- data/examples/{v3api/local_lat_poll.rb → local_lat_poll.rb} +4 -4
- data/examples/{v3api/local_throughput.rb → local_throughput.rb} +1 -1
- data/examples/{v3api/pub.rb → pub.rb} +1 -1
- data/examples/{v2api/publish_subscribe.rb → publish_subscribe.rb} +2 -2
- data/examples/{v2api/remote_lat.rb → remote_lat.rb} +1 -1
- data/examples/{v3api/remote_throughput.rb → remote_throughput.rb} +4 -3
- data/examples/repreq_over_curve.rb +60 -0
- data/examples/{v2api/reqrep_poll.rb → reqrep_poll.rb} +3 -4
- data/examples/{v2api/request_response.rb → request_response.rb} +1 -2
- data/examples/{v3api/sub.rb → sub.rb} +1 -2
- data/examples/{v3api/throughput_measurement.rb → throughput_measurement.rb} +1 -1
- data/examples/{v3api/xreqxrep_poll.rb → xreqxrep_poll.rb} +6 -7
- data/ffi-rzmq.gemspec +4 -4
- data/lib/ffi-rzmq/context.rb +25 -53
- data/lib/ffi-rzmq/device.rb +8 -4
- data/lib/ffi-rzmq/exceptions.rb +3 -0
- data/lib/ffi-rzmq/message.rb +24 -30
- data/lib/ffi-rzmq/poll.rb +5 -16
- data/lib/ffi-rzmq/socket.rb +132 -282
- data/lib/ffi-rzmq/util.rb +28 -36
- data/lib/ffi-rzmq/version.rb +1 -1
- data/lib/ffi-rzmq.rb +2 -3
- data/spec/context_spec.rb +3 -8
- data/spec/device_spec.rb +10 -9
- data/spec/nonblocking_recv_spec.rb +7 -7
- data/spec/pushpull_spec.rb +8 -7
- data/spec/reqrep_spec.rb +6 -6
- data/spec/socket_spec.rb +43 -130
- data/spec/spec_helper.rb +3 -11
- data/spec/util_spec.rb +28 -0
- metadata +80 -104
- data/examples/v2api/latency_measurement.rb +0 -139
- data/examples/v2api/local_lat.rb +0 -58
- data/examples/v2api/local_lat_poll.rb +0 -66
- data/examples/v2api/local_throughput.rb +0 -58
- data/examples/v2api/pub.rb +0 -46
- data/examples/v2api/remote_throughput.rb +0 -39
- data/examples/v2api/sub.rb +0 -74
- data/examples/v2api/throughput_measurement.rb +0 -138
- data/examples/v2api/xreqxrep_poll.rb +0 -93
- data/examples/v3api/publish_subscribe.rb +0 -82
- data/examples/v3api/remote_lat.rb +0 -71
- data/examples/v3api/reqrep_poll.rb +0 -62
- data/examples/v3api/request_response.rb +0 -40
- data/lib/ffi-rzmq/constants.rb +0 -187
- data/lib/ffi-rzmq/libc.rb +0 -19
- data/lib/ffi-rzmq/libzmq.rb +0 -283
    
        data/lib/ffi-rzmq/socket.rb
    CHANGED
    
    | @@ -1,8 +1,7 @@ | |
| 1 1 |  | 
| 2 2 | 
             
            module ZMQ
         | 
| 3 3 |  | 
| 4 | 
            -
               | 
| 5 | 
            -
             | 
| 4 | 
            +
              class Socket
         | 
| 6 5 | 
             
                attr_reader :socket, :name
         | 
| 7 6 |  | 
| 8 7 | 
             
                # Allocates a socket of type +type+ for sending and receiving data.
         | 
| @@ -70,15 +69,15 @@ module ZMQ | |
| 70 69 |  | 
| 71 70 | 
             
                  context_ptr = context_ptr.pointer if context_ptr.kind_of?(ZMQ::Context)
         | 
| 72 71 |  | 
| 73 | 
            -
                   | 
| 72 | 
            +
                  if context_ptr.nil? || context_ptr.null?
         | 
| 73 | 
            +
                    raise ContextError.new 'zmq_socket', 0, ETERM, "Context pointer was null"
         | 
| 74 | 
            +
                  else
         | 
| 74 75 | 
             
                    @socket = LibZMQ.zmq_socket context_ptr, type
         | 
| 75 76 | 
             
                    if @socket && !@socket.null?
         | 
| 76 77 | 
             
                      @name = SocketTypeNameMap[type]
         | 
| 77 78 | 
             
                    else
         | 
| 78 79 | 
             
                      raise ContextError.new 'zmq_socket', 0, ETERM, "Socket pointer was null"
         | 
| 79 80 | 
             
                    end
         | 
| 80 | 
            -
                  else
         | 
| 81 | 
            -
                    raise ContextError.new 'zmq_socket', 0, ETERM, "Context pointer was null"
         | 
| 82 81 | 
             
                  end
         | 
| 83 82 |  | 
| 84 83 | 
             
                  @longlong_cache = @int_cache = nil
         | 
| @@ -118,7 +117,7 @@ module ZMQ | |
| 118 117 | 
             
                # Returns 0 when the operation completed successfully.
         | 
| 119 118 | 
             
                # Returns -1 when this operation failed.
         | 
| 120 119 | 
             
                #
         | 
| 121 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 120 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 122 121 | 
             
                # cause.
         | 
| 123 122 | 
             
                #
         | 
| 124 123 | 
             
                #  rc = socket.setsockopt(ZMQ::LINGER, 1_000)
         | 
| @@ -136,15 +135,14 @@ module ZMQ | |
| 136 135 | 
             
                    pointer.write_int value
         | 
| 137 136 |  | 
| 138 137 | 
             
                  elsif 2 == @option_lookup[name]
         | 
| 138 | 
            +
                    # Strings are treated as pointers by FFI so we'll just pass it through
         | 
| 139 139 | 
             
                    length ||= value.size
         | 
| 140 | 
            +
                    pointer = value
         | 
| 140 141 |  | 
| 141 | 
            -
                    # note: not checking errno for failed memory allocations :(
         | 
| 142 | 
            -
                    pointer = LibC.malloc length
         | 
| 143 | 
            -
                    pointer.write_string value
         | 
| 144 142 | 
             
                  end
         | 
| 145 143 |  | 
| 146 144 | 
             
                  rc = LibZMQ.zmq_setsockopt @socket, name, pointer, length
         | 
| 147 | 
            -
                  LibC.free(pointer) unless pointer.nil? || pointer.null?
         | 
| 145 | 
            +
                  LibC.free(pointer) unless pointer.is_a?(String) || pointer.nil? || pointer.null?
         | 
| 148 146 | 
             
                  rc
         | 
| 149 147 | 
             
                end
         | 
| 150 148 |  | 
| @@ -193,7 +191,7 @@ module ZMQ | |
| 193 191 | 
             
                # depending upon the value of the socket option ZMQ::LINGER.
         | 
| 194 192 | 
             
                #
         | 
| 195 193 | 
             
                # Returns 0 upon success *or* when the socket has already been closed.
         | 
| 196 | 
            -
                # Returns -1 when the operation fails. Check ZMQ.errno for the error code.
         | 
| 194 | 
            +
                # Returns -1 when the operation fails. Check ZMQ::Util.errno for the error code.
         | 
| 197 195 | 
             
                #
         | 
| 198 196 | 
             
                #  rc = socket.close
         | 
| 199 197 | 
             
                #  puts("Given socket was invalid!") unless 0 == rc
         | 
| @@ -215,15 +213,15 @@ module ZMQ | |
| 215 213 | 
             
                #
         | 
| 216 214 | 
             
                # +flags+ may take two values:
         | 
| 217 215 | 
             
                # * 0 (default) - blocking operation
         | 
| 218 | 
            -
                # * ZMQ:: | 
| 216 | 
            +
                # * ZMQ::DONTWAIT - non-blocking operation
         | 
| 219 217 | 
             
                # * ZMQ::SNDMORE - this message is part of a multi-part message
         | 
| 220 218 | 
             
                #
         | 
| 221 219 | 
             
                # Returns 0 when the message was successfully enqueued.
         | 
| 222 220 | 
             
                # Returns -1 under two conditions.
         | 
| 223 221 | 
             
                # 1. The message could not be enqueued
         | 
| 224 | 
            -
                # 2. When +flags+ is set with ZMQ:: | 
| 222 | 
            +
                # 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
         | 
| 225 223 | 
             
                #
         | 
| 226 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 224 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 227 225 | 
             
                # cause.
         | 
| 228 226 | 
             
                #
         | 
| 229 227 | 
             
                def sendmsg message, flags = 0
         | 
| @@ -233,14 +231,14 @@ module ZMQ | |
| 233 231 | 
             
                # Helper method to make a new #Message instance out of the +string+ passed
         | 
| 234 232 | 
             
                # in for transmission.
         | 
| 235 233 | 
             
                #
         | 
| 236 | 
            -
                # +flags+ may be ZMQ:: | 
| 234 | 
            +
                # +flags+ may be ZMQ::DONTWAIT and ZMQ::SNDMORE.
         | 
| 237 235 | 
             
                #
         | 
| 238 236 | 
             
                # Returns 0 when the message was successfully enqueued.
         | 
| 239 237 | 
             
                # Returns -1 under two conditions.
         | 
| 240 238 | 
             
                # 1. The message could not be enqueued
         | 
| 241 | 
            -
                # 2. When +flags+ is set with ZMQ:: | 
| 239 | 
            +
                # 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
         | 
| 242 240 | 
             
                #
         | 
| 243 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 241 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 244 242 | 
             
                # cause.
         | 
| 245 243 | 
             
                #
         | 
| 246 244 | 
             
                def send_string string, flags = 0
         | 
| @@ -252,14 +250,14 @@ module ZMQ | |
| 252 250 | 
             
                # passed in for transmission. Every element of +parts+ should be
         | 
| 253 251 | 
             
                # a String.
         | 
| 254 252 | 
             
                #
         | 
| 255 | 
            -
                # +flags+ may be ZMQ:: | 
| 253 | 
            +
                # +flags+ may be ZMQ::DONTWAIT.
         | 
| 256 254 | 
             
                #
         | 
| 257 255 | 
             
                # Returns 0 when the messages were successfully enqueued.
         | 
| 258 256 | 
             
                # Returns -1 under two conditions.
         | 
| 259 257 | 
             
                # 1. A message could not be enqueued
         | 
| 260 | 
            -
                # 2. When +flags+ is set with ZMQ:: | 
| 258 | 
            +
                # 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
         | 
| 261 259 | 
             
                #
         | 
| 262 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 260 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 263 261 | 
             
                # cause.
         | 
| 264 262 | 
             
                #
         | 
| 265 263 | 
             
                def send_strings parts, flags = 0
         | 
| @@ -270,14 +268,14 @@ module ZMQ | |
| 270 268 | 
             
                # passed in for transmission. Every element of +parts+ should be
         | 
| 271 269 | 
             
                # a Message (or subclass).
         | 
| 272 270 | 
             
                #
         | 
| 273 | 
            -
                # +flags+ may be ZMQ:: | 
| 271 | 
            +
                # +flags+ may be ZMQ::DONTWAIT.
         | 
| 274 272 | 
             
                #
         | 
| 275 273 | 
             
                # Returns 0 when the messages were successfully enqueued.
         | 
| 276 274 | 
             
                # Returns -1 under two conditions.
         | 
| 277 275 | 
             
                # 1. A message could not be enqueued
         | 
| 278 | 
            -
                # 2. When +flags+ is set with ZMQ:: | 
| 276 | 
            +
                # 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
         | 
| 279 277 | 
             
                #
         | 
| 280 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 278 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 281 279 | 
             
                # cause.
         | 
| 282 280 | 
             
                #
         | 
| 283 281 | 
             
                def sendmsgs parts, flags = 0
         | 
| @@ -290,9 +288,9 @@ module ZMQ | |
| 290 288 | 
             
                # Returns 0 when the message was successfully enqueued.
         | 
| 291 289 | 
             
                # Returns -1 under two conditions.
         | 
| 292 290 | 
             
                # 1. The message could not be enqueued
         | 
| 293 | 
            -
                # 2. When +flags+ is set with ZMQ:: | 
| 291 | 
            +
                # 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
         | 
| 294 292 | 
             
                #
         | 
| 295 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 293 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 296 294 | 
             
                # cause.
         | 
| 297 295 | 
             
                #
         | 
| 298 296 | 
             
                def send_and_close message, flags = 0
         | 
| @@ -305,14 +303,14 @@ module ZMQ | |
| 305 303 | 
             
                #
         | 
| 306 304 | 
             
                # +flags+ may take two values:
         | 
| 307 305 | 
             
                #  0 (default) - blocking operation
         | 
| 308 | 
            -
                #  ZMQ:: | 
| 306 | 
            +
                #  ZMQ::DONTWAIT - non-blocking operation
         | 
| 309 307 | 
             
                #
         | 
| 310 308 | 
             
                # Returns 0 when the message was successfully dequeued.
         | 
| 311 309 | 
             
                # Returns -1 under two conditions.
         | 
| 312 310 | 
             
                # 1. The message could not be dequeued
         | 
| 313 | 
            -
                # 2. When +flags+ is set with ZMQ:: | 
| 311 | 
            +
                # 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
         | 
| 314 312 | 
             
                #
         | 
| 315 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 313 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 316 314 | 
             
                # cause.
         | 
| 317 315 | 
             
                #
         | 
| 318 316 | 
             
                # The application code is responsible for handling the +message+ object lifecycle
         | 
| @@ -326,14 +324,14 @@ module ZMQ | |
| 326 324 | 
             
                # Helper method to make a new #Message instance and convert its payload
         | 
| 327 325 | 
             
                # to a string.
         | 
| 328 326 | 
             
                #
         | 
| 329 | 
            -
                # +flags+ may be ZMQ:: | 
| 327 | 
            +
                # +flags+ may be ZMQ::DONTWAIT.
         | 
| 330 328 | 
             
                #
         | 
| 331 329 | 
             
                # Returns 0 when the message was successfully dequeued.
         | 
| 332 330 | 
             
                # Returns -1 under two conditions.
         | 
| 333 331 | 
             
                # 1. The message could not be dequeued
         | 
| 334 | 
            -
                # 2. When +flags+ is set with ZMQ:: | 
| 332 | 
            +
                # 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
         | 
| 335 333 | 
             
                #
         | 
| 336 | 
            -
                # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 334 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 337 335 | 
             
                # cause.
         | 
| 338 336 | 
             
                #
         | 
| 339 337 | 
             
                # The application code is responsible for handling the +message+ object lifecycle
         | 
| @@ -349,7 +347,7 @@ module ZMQ | |
| 349 347 |  | 
| 350 348 | 
             
                # Receive a multipart message as a list of strings.
         | 
| 351 349 | 
             
                #
         | 
| 352 | 
            -
                # +flag+ may be ZMQ:: | 
| 350 | 
            +
                # +flag+ may be ZMQ::DONTWAIT. Any other flag will be
         | 
| 353 351 | 
             
                # removed.
         | 
| 354 352 | 
             
                #
         | 
| 355 353 | 
             
                def recv_strings list, flag = 0
         | 
| @@ -369,11 +367,11 @@ module ZMQ | |
| 369 367 | 
             
                # Receive a multipart message as an array of objects
         | 
| 370 368 | 
             
                # (by default these are instances of Message).
         | 
| 371 369 | 
             
                #
         | 
| 372 | 
            -
                # +flag+ may be ZMQ:: | 
| 370 | 
            +
                # +flag+ may be ZMQ::DONTWAIT. Any other flag will be
         | 
| 373 371 | 
             
                # removed.
         | 
| 374 372 | 
             
                #
         | 
| 375 373 | 
             
                def recvmsgs list, flag = 0
         | 
| 376 | 
            -
                  flag =  | 
| 374 | 
            +
                  flag = DONTWAIT if dontwait?(flag)
         | 
| 377 375 |  | 
| 378 376 | 
             
                  message = @receiver_klass.new
         | 
| 379 377 | 
             
                  rc = recvmsg message, flag
         | 
| @@ -426,24 +424,96 @@ module ZMQ | |
| 426 424 | 
             
                  rc
         | 
| 427 425 | 
             
                end
         | 
| 428 426 |  | 
| 427 | 
            +
                # Get the options set on this socket.
         | 
| 428 | 
            +
                #
         | 
| 429 | 
            +
                # +name+ determines the socket option to request
         | 
| 430 | 
            +
                # +array+ should be an empty array; a result of the proper type
         | 
| 431 | 
            +
                # (numeric, string, boolean) will be inserted into
         | 
| 432 | 
            +
                # the first position.
         | 
| 433 | 
            +
                #
         | 
| 434 | 
            +
                # Valid +option_name+ values:
         | 
| 435 | 
            +
                #  ZMQ::RCVMORE - true or false
         | 
| 436 | 
            +
                #  ZMQ::HWM - integer
         | 
| 437 | 
            +
                #  ZMQ::SWAP - integer
         | 
| 438 | 
            +
                #  ZMQ::AFFINITY - bitmap in an integer
         | 
| 439 | 
            +
                #  ZMQ::IDENTITY - string
         | 
| 440 | 
            +
                #  ZMQ::RATE - integer
         | 
| 441 | 
            +
                #  ZMQ::RECOVERY_IVL - integer
         | 
| 442 | 
            +
                #  ZMQ::SNDBUF - integer
         | 
| 443 | 
            +
                #  ZMQ::RCVBUF - integer
         | 
| 444 | 
            +
                #  ZMQ::FD     - fd in an integer
         | 
| 445 | 
            +
                #  ZMQ::EVENTS - bitmap integer
         | 
| 446 | 
            +
                #  ZMQ::LINGER - integer measured in milliseconds
         | 
| 447 | 
            +
                #  ZMQ::RECONNECT_IVL - integer measured in milliseconds
         | 
| 448 | 
            +
                #  ZMQ::BACKLOG - integer
         | 
| 449 | 
            +
                #  ZMQ::RECOVER_IVL_MSEC - integer measured in milliseconds
         | 
| 450 | 
            +
                #  ZMQ::IPV4ONLY - integer
         | 
| 451 | 
            +
                #
         | 
| 452 | 
            +
                # Returns 0 when the operation completed successfully.
         | 
| 453 | 
            +
                # Returns -1 when this operation failed.
         | 
| 454 | 
            +
                #
         | 
| 455 | 
            +
                # With a -1 return code, the user must check ZMQ::Util.errno to determine the
         | 
| 456 | 
            +
                # cause.
         | 
| 457 | 
            +
                #
         | 
| 458 | 
            +
                #  # retrieve high water mark
         | 
| 459 | 
            +
                #  array = []
         | 
| 460 | 
            +
                #  rc = socket.getsockopt(ZMQ::HWM, array)
         | 
| 461 | 
            +
                #  hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
         | 
| 462 | 
            +
                #
         | 
| 463 | 
            +
                def getsockopt name, array
         | 
| 464 | 
            +
                  rc = __getsockopt__ name, array
         | 
| 465 | 
            +
             | 
| 466 | 
            +
                  if Util.resultcode_ok?(rc) && (RCVMORE == name)
         | 
| 467 | 
            +
                    # convert to boolean
         | 
| 468 | 
            +
                    array[0] = 1 == array[0]
         | 
| 469 | 
            +
                  end
         | 
| 470 | 
            +
             | 
| 471 | 
            +
                  rc
         | 
| 472 | 
            +
                end
         | 
| 473 | 
            +
             | 
| 474 | 
            +
                # Convenience method for getting the value of the socket IDENTITY.
         | 
| 475 | 
            +
                #
         | 
| 476 | 
            +
                def identity
         | 
| 477 | 
            +
                  array = []
         | 
| 478 | 
            +
                  getsockopt IDENTITY, array
         | 
| 479 | 
            +
                  array.at(0)
         | 
| 480 | 
            +
                end
         | 
| 481 | 
            +
             | 
| 482 | 
            +
                # Convenience method for setting the value of the socket IDENTITY.
         | 
| 483 | 
            +
                #
         | 
| 484 | 
            +
                def identity=(value)
         | 
| 485 | 
            +
                  setsockopt IDENTITY, value.to_s
         | 
| 486 | 
            +
                end
         | 
| 487 | 
            +
             | 
| 488 | 
            +
                # Disconnect the socket from the given +endpoint+.
         | 
| 489 | 
            +
                #
         | 
| 490 | 
            +
                def disconnect(endpoint)
         | 
| 491 | 
            +
                  LibZMQ.zmq_disconnect(socket, endpoint)
         | 
| 492 | 
            +
                end
         | 
| 493 | 
            +
             | 
| 494 | 
            +
                # Unbind the socket from the given +endpoint+.
         | 
| 495 | 
            +
                #
         | 
| 496 | 
            +
                def unbind(endpoint)
         | 
| 497 | 
            +
                  LibZMQ.zmq_unbind(socket, endpoint)
         | 
| 498 | 
            +
                end
         | 
| 499 | 
            +
             | 
| 429 500 |  | 
| 430 501 | 
             
                private
         | 
| 431 | 
            -
             | 
| 502 | 
            +
             | 
| 432 503 | 
             
                def send_multiple(parts, flags, method_name)
         | 
| 433 504 | 
             
                  if !parts || parts.empty?
         | 
| 434 505 | 
             
                    -1
         | 
| 435 506 | 
             
                  else
         | 
| 436 | 
            -
                    flags =  | 
| 507 | 
            +
                    flags = DONTWAIT if dontwait?(flags)
         | 
| 437 508 | 
             
                    rc = 0
         | 
| 438 | 
            -
             | 
| 509 | 
            +
             | 
| 439 510 | 
             
                    parts[0..-2].each do |part|
         | 
| 440 511 | 
             
                      rc = send(method_name, part, (flags | ZMQ::SNDMORE))
         | 
| 441 512 | 
             
                      break unless Util.resultcode_ok?(rc)
         | 
| 442 513 | 
             
                    end
         | 
| 443 | 
            -
             | 
| 514 | 
            +
             | 
| 444 515 | 
             
                    Util.resultcode_ok?(rc) ? send(method_name, parts[-1], flags) : rc
         | 
| 445 516 | 
             
                  end
         | 
| 446 | 
            -
                  
         | 
| 447 517 | 
             
                end
         | 
| 448 518 |  | 
| 449 519 | 
             
                def __getsockopt__ name, array
         | 
| @@ -485,277 +555,57 @@ module ZMQ | |
| 485 555 | 
             
                    alloc_pointer(255, 255)
         | 
| 486 556 |  | 
| 487 557 | 
             
                  else
         | 
| 488 | 
            -
                    # uh oh, someone passed in an unknown option;  | 
| 558 | 
            +
                    # uh oh, someone passed in an unknown option; return nil
         | 
| 489 559 | 
             
                    @int_cache ||= alloc_pointer(:int32, 4)
         | 
| 490 560 | 
             
                  end
         | 
| 491 561 | 
             
                end
         | 
| 492 562 |  | 
| 493 | 
            -
                def populate_option_lookup
         | 
| 494 | 
            -
                  # integer options
         | 
| 495 | 
            -
                  [EVENTS, LINGER, RCVTIMEO, SNDTIMEO, RECONNECT_IVL, FD, TYPE, BACKLOG].each { |option| @option_lookup[option] = 0 }
         | 
| 496 | 
            -
             | 
| 497 | 
            -
                  # long long options
         | 
| 498 | 
            -
                  [RCVMORE, AFFINITY].each { |option| @option_lookup[option] = 1 }
         | 
| 499 | 
            -
             | 
| 500 | 
            -
                  # string options
         | 
| 501 | 
            -
                  [SUBSCRIBE, UNSUBSCRIBE].each { |option| @option_lookup[option] = 2 }
         | 
| 502 | 
            -
                end
         | 
| 503 | 
            -
             | 
| 504 563 | 
             
                def release_cache
         | 
| 505 564 | 
             
                  @longlong_cache = nil
         | 
| 506 565 | 
             
                  @int_cache = nil
         | 
| 507 566 | 
             
                end
         | 
| 508 567 |  | 
| 509 568 | 
             
                def dontwait?(flags)
         | 
| 510 | 
            -
                  ( | 
| 569 | 
            +
                  (DONTWAIT & flags) == DONTWAIT
         | 
| 511 570 | 
             
                end
         | 
| 512 571 | 
             
                alias :noblock? :dontwait?
         | 
| 513 | 
            -
             | 
| 572 | 
            +
             | 
| 514 573 | 
             
                def alloc_pointer(kind, length)
         | 
| 515 574 | 
             
                  pointer = FFI::MemoryPointer.new :size_t
         | 
| 516 575 | 
             
                  pointer.write_int(length)
         | 
| 517 576 | 
             
                  [FFI::MemoryPointer.new(kind), pointer]
         | 
| 518 577 | 
             
                end
         | 
| 519 | 
            -
              end # module CommonSocketBehavior
         | 
| 520 578 |  | 
| 521 | 
            -
             | 
| 522 | 
            -
             | 
| 523 | 
            -
             | 
| 524 | 
            -
                # Convenience method for getting the value of the socket IDENTITY.
         | 
| 525 | 
            -
                #
         | 
| 526 | 
            -
                def identity
         | 
| 527 | 
            -
                  array = []
         | 
| 528 | 
            -
                  getsockopt IDENTITY, array
         | 
| 529 | 
            -
                  array.at(0)
         | 
| 579 | 
            +
                def __sendmsg__(socket, address, flags)
         | 
| 580 | 
            +
                  LibZMQ.zmq_sendmsg(socket, address, flags)
         | 
| 530 581 | 
             
                end
         | 
| 531 582 |  | 
| 532 | 
            -
                 | 
| 533 | 
            -
             | 
| 534 | 
            -
                def identity=(value)
         | 
| 535 | 
            -
                  setsockopt IDENTITY, value.to_s
         | 
| 583 | 
            +
                def __recvmsg__(socket, address, flags)
         | 
| 584 | 
            +
                  LibZMQ.zmq_recvmsg(socket, address, flags)
         | 
| 536 585 | 
             
                end
         | 
| 537 586 |  | 
| 538 | 
            -
             | 
| 539 | 
            -
                private
         | 
| 540 | 
            -
             | 
| 541 587 | 
             
                def populate_option_lookup
         | 
| 542 | 
            -
                   | 
| 543 | 
            -
             | 
| 544 | 
            -
                  # string options
         | 
| 545 | 
            -
                  [IDENTITY].each { |option| @option_lookup[option] = 2 }
         | 
| 546 | 
            -
                end
         | 
| 547 | 
            -
             | 
| 548 | 
            -
              end # module IdentitySupport
         | 
| 549 | 
            -
             | 
| 550 | 
            -
             | 
| 551 | 
            -
              if LibZMQ.version2?
         | 
| 552 | 
            -
             | 
| 553 | 
            -
                class Socket
         | 
| 554 | 
            -
                  # Inclusion order is *important* since later modules may have a call
         | 
| 555 | 
            -
                  # to #super. We want those calls to go up the chain in a particular
         | 
| 556 | 
            -
                  # order
         | 
| 557 | 
            -
                  include CommonSocketBehavior
         | 
| 558 | 
            -
                  include IdentitySupport
         | 
| 559 | 
            -
             | 
| 560 | 
            -
                  # Get the options set on this socket.
         | 
| 561 | 
            -
                  #
         | 
| 562 | 
            -
                  # +name+ determines the socket option to request
         | 
| 563 | 
            -
                  # +array+ should be an empty array; a result of the proper type
         | 
| 564 | 
            -
                  # (numeric, string, boolean) will be inserted into
         | 
| 565 | 
            -
                  # the first position.
         | 
| 566 | 
            -
                  #
         | 
| 567 | 
            -
                  # Valid +option_name+ values:
         | 
| 568 | 
            -
                  #  ZMQ::RCVMORE - true or false
         | 
| 569 | 
            -
                  #  ZMQ::HWM - integer
         | 
| 570 | 
            -
                  #  ZMQ::SWAP - integer
         | 
| 571 | 
            -
                  #  ZMQ::AFFINITY - bitmap in an integer
         | 
| 572 | 
            -
                  #  ZMQ::IDENTITY - string
         | 
| 573 | 
            -
                  #  ZMQ::RATE - integer
         | 
| 574 | 
            -
                  #  ZMQ::RECOVERY_IVL - integer
         | 
| 575 | 
            -
                  #  ZMQ::MCAST_LOOP - true or false
         | 
| 576 | 
            -
                  #  ZMQ::SNDBUF - integer
         | 
| 577 | 
            -
                  #  ZMQ::RCVBUF - integer
         | 
| 578 | 
            -
                  #  ZMQ::FD     - fd in an integer
         | 
| 579 | 
            -
                  #  ZMQ::EVENTS - bitmap integer
         | 
| 580 | 
            -
                  #  ZMQ::LINGER - integer measured in milliseconds
         | 
| 581 | 
            -
                  #  ZMQ::RECONNECT_IVL - integer measured in milliseconds
         | 
| 582 | 
            -
                  #  ZMQ::BACKLOG - integer
         | 
| 583 | 
            -
                  #  ZMQ::RECOVER_IVL_MSEC - integer measured in milliseconds
         | 
| 584 | 
            -
                  #
         | 
| 585 | 
            -
                  # Returns 0 when the operation completed successfully.
         | 
| 586 | 
            -
                  # Returns -1 when this operation failed.
         | 
| 587 | 
            -
                  #
         | 
| 588 | 
            -
                  # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 589 | 
            -
                  # cause.
         | 
| 590 | 
            -
                  #
         | 
| 591 | 
            -
                  #  # retrieve high water mark
         | 
| 592 | 
            -
                  #  array = []
         | 
| 593 | 
            -
                  #  rc = socket.getsockopt(ZMQ::HWM, array)
         | 
| 594 | 
            -
                  #  hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
         | 
| 595 | 
            -
                  #
         | 
| 596 | 
            -
                  def getsockopt name, array
         | 
| 597 | 
            -
                    rc = __getsockopt__ name, array
         | 
| 598 | 
            -
             | 
| 599 | 
            -
                    if Util.resultcode_ok?(rc) && (RCVMORE == name || MCAST_LOOP == name)
         | 
| 600 | 
            -
                      # convert to boolean
         | 
| 601 | 
            -
                      array[0] = 1 == array[0]
         | 
| 602 | 
            -
                    end
         | 
| 603 | 
            -
             | 
| 604 | 
            -
                    rc
         | 
| 605 | 
            -
                  end
         | 
| 606 | 
            -
             | 
| 588 | 
            +
                  IntegerSocketOptions.each { |option| @option_lookup[option] = 0 }
         | 
| 607 589 |  | 
| 608 | 
            -
                   | 
| 609 | 
            -
             | 
| 610 | 
            -
                  def __sendmsg__(socket, address, flags)
         | 
| 611 | 
            -
                    LibZMQ.zmq_send(socket, address, flags)
         | 
| 612 | 
            -
                  end
         | 
| 613 | 
            -
             | 
| 614 | 
            -
                  def __recvmsg__(socket, address, flags)
         | 
| 615 | 
            -
                    LibZMQ.zmq_recv(socket, address, flags)
         | 
| 616 | 
            -
                  end
         | 
| 617 | 
            -
             | 
| 618 | 
            -
                  def populate_option_lookup
         | 
| 619 | 
            -
                    super()
         | 
| 620 | 
            -
             | 
| 621 | 
            -
                    # integer options
         | 
| 622 | 
            -
                    [RECONNECT_IVL_MAX].each { |option| @option_lookup[option] = 0 }
         | 
| 623 | 
            -
             | 
| 624 | 
            -
                    # long long options
         | 
| 625 | 
            -
                    [HWM, SWAP, RATE, RECOVERY_IVL, RECOVERY_IVL_MSEC, MCAST_LOOP, SNDBUF, RCVBUF].each { |option| @option_lookup[option] = 1 }
         | 
| 626 | 
            -
                  end
         | 
| 627 | 
            -
             | 
| 628 | 
            -
                  # these finalizer-related methods cannot live in the CommonSocketBehavior
         | 
| 629 | 
            -
                  # module; they *must* be in the class definition directly
         | 
| 630 | 
            -
             | 
| 631 | 
            -
                  def define_finalizer
         | 
| 632 | 
            -
                    ObjectSpace.define_finalizer(self, self.class.close(@socket, Process.pid))
         | 
| 633 | 
            -
                  end
         | 
| 634 | 
            -
             | 
| 635 | 
            -
                  def remove_finalizer
         | 
| 636 | 
            -
                    ObjectSpace.undefine_finalizer self
         | 
| 637 | 
            -
                  end
         | 
| 590 | 
            +
                  LongLongSocketOptions.each { |option| @option_lookup[option] = 1 }
         | 
| 638 591 |  | 
| 639 | 
            -
                   | 
| 640 | 
            -
             | 
| 641 | 
            -
                      LibZMQ.zmq_close(socket) if socket && !socket.nil? && Process.pid == pid
         | 
| 642 | 
            -
                    end
         | 
| 643 | 
            -
                  end
         | 
| 644 | 
            -
                end # class Socket for version2
         | 
| 645 | 
            -
             | 
| 646 | 
            -
              end # LibZMQ.version2?
         | 
| 647 | 
            -
             | 
| 648 | 
            -
             | 
| 649 | 
            -
              if LibZMQ.version3?
         | 
| 650 | 
            -
                class Socket
         | 
| 651 | 
            -
                  include CommonSocketBehavior
         | 
| 652 | 
            -
                  include IdentitySupport
         | 
| 653 | 
            -
             | 
| 654 | 
            -
                  # Get the options set on this socket.
         | 
| 655 | 
            -
                  #
         | 
| 656 | 
            -
                  # +name+ determines the socket option to request
         | 
| 657 | 
            -
                  # +array+ should be an empty array; a result of the proper type
         | 
| 658 | 
            -
                  # (numeric, string, boolean) will be inserted into
         | 
| 659 | 
            -
                  # the first position.
         | 
| 660 | 
            -
                  #
         | 
| 661 | 
            -
                  # Valid +option_name+ values:
         | 
| 662 | 
            -
                  #  ZMQ::RCVMORE - true or false
         | 
| 663 | 
            -
                  #  ZMQ::HWM - integer
         | 
| 664 | 
            -
                  #  ZMQ::SWAP - integer
         | 
| 665 | 
            -
                  #  ZMQ::AFFINITY - bitmap in an integer
         | 
| 666 | 
            -
                  #  ZMQ::IDENTITY - string
         | 
| 667 | 
            -
                  #  ZMQ::RATE - integer
         | 
| 668 | 
            -
                  #  ZMQ::RECOVERY_IVL - integer
         | 
| 669 | 
            -
                  #  ZMQ::SNDBUF - integer
         | 
| 670 | 
            -
                  #  ZMQ::RCVBUF - integer
         | 
| 671 | 
            -
                  #  ZMQ::FD     - fd in an integer
         | 
| 672 | 
            -
                  #  ZMQ::EVENTS - bitmap integer
         | 
| 673 | 
            -
                  #  ZMQ::LINGER - integer measured in milliseconds
         | 
| 674 | 
            -
                  #  ZMQ::RECONNECT_IVL - integer measured in milliseconds
         | 
| 675 | 
            -
                  #  ZMQ::BACKLOG - integer
         | 
| 676 | 
            -
                  #  ZMQ::RECOVER_IVL_MSEC - integer measured in milliseconds
         | 
| 677 | 
            -
                  #  ZMQ::IPV4ONLY - integer
         | 
| 678 | 
            -
                  #
         | 
| 679 | 
            -
                  # Returns 0 when the operation completed successfully.
         | 
| 680 | 
            -
                  # Returns -1 when this operation failed.
         | 
| 681 | 
            -
                  #
         | 
| 682 | 
            -
                  # With a -1 return code, the user must check ZMQ.errno to determine the
         | 
| 683 | 
            -
                  # cause.
         | 
| 684 | 
            -
                  #
         | 
| 685 | 
            -
                  #  # retrieve high water mark
         | 
| 686 | 
            -
                  #  array = []
         | 
| 687 | 
            -
                  #  rc = socket.getsockopt(ZMQ::HWM, array)
         | 
| 688 | 
            -
                  #  hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
         | 
| 689 | 
            -
                  #
         | 
| 690 | 
            -
                  def getsockopt name, array
         | 
| 691 | 
            -
                    rc = __getsockopt__ name, array
         | 
| 692 | 
            -
             | 
| 693 | 
            -
                    if Util.resultcode_ok?(rc) && (RCVMORE == name)
         | 
| 694 | 
            -
                      # convert to boolean
         | 
| 695 | 
            -
                      array[0] = 1 == array[0]
         | 
| 696 | 
            -
                    end
         | 
| 697 | 
            -
             | 
| 698 | 
            -
                    rc
         | 
| 699 | 
            -
                  end
         | 
| 700 | 
            -
                  
         | 
| 701 | 
            -
                  # Version3 only
         | 
| 702 | 
            -
                  #
         | 
| 703 | 
            -
                  # Disconnect the socket from the given +endpoint+.
         | 
| 704 | 
            -
                  #
         | 
| 705 | 
            -
                  def disconnect(endpoint)
         | 
| 706 | 
            -
                    LibZMQ.zmq_disconnect(socket, endpoint)
         | 
| 707 | 
            -
                  end
         | 
| 708 | 
            -
                  
         | 
| 709 | 
            -
                  # Version3 only
         | 
| 710 | 
            -
                  #
         | 
| 711 | 
            -
                  # Unbind the socket from the given +endpoint+.
         | 
| 712 | 
            -
                  #
         | 
| 713 | 
            -
                  def unbind(endpoint)
         | 
| 714 | 
            -
                    LibZMQ.zmq_unbind(socket, endpoint)
         | 
| 715 | 
            -
                  end
         | 
| 716 | 
            -
             | 
| 717 | 
            -
             | 
| 718 | 
            -
                  private
         | 
| 719 | 
            -
             | 
| 720 | 
            -
                  def __sendmsg__(socket, address, flags)
         | 
| 721 | 
            -
                    LibZMQ.zmq_sendmsg(socket, address, flags)
         | 
| 722 | 
            -
                  end
         | 
| 723 | 
            -
             | 
| 724 | 
            -
                  def __recvmsg__(socket, address, flags)
         | 
| 725 | 
            -
                    LibZMQ.zmq_recvmsg(socket, address, flags)
         | 
| 726 | 
            -
                  end
         | 
| 727 | 
            -
             | 
| 728 | 
            -
                  def populate_option_lookup
         | 
| 729 | 
            -
                    super()
         | 
| 730 | 
            -
             | 
| 731 | 
            -
                    # integer options
         | 
| 732 | 
            -
                    [RECONNECT_IVL_MAX, RCVHWM, SNDHWM, RATE, RECOVERY_IVL, SNDBUF, RCVBUF, IPV4ONLY,
         | 
| 733 | 
            -
                      ROUTER_BEHAVIOR, TCP_KEEPALIVE, TCP_KEEPALIVE_CNT,
         | 
| 734 | 
            -
                      TCP_KEEPALIVE_IDLE, TCP_KEEPALIVE_INTVL, TCP_ACCEPT_FILTER, MULTICAST_HOPS
         | 
| 735 | 
            -
                    ].each { |option| @option_lookup[option] = 0 }
         | 
| 736 | 
            -
             | 
| 737 | 
            -
                    # long long options
         | 
| 738 | 
            -
                    [MAXMSGSIZE].each { |option| @option_lookup[option] = 1 }
         | 
| 739 | 
            -
             | 
| 740 | 
            -
                    # string options
         | 
| 741 | 
            -
                    [LAST_ENDPOINT].each { |option| @option_lookup[option] = 2 }
         | 
| 742 | 
            -
                  end
         | 
| 592 | 
            +
                  StringSocketOptions.each { |option| @option_lookup[option] = 2 }
         | 
| 593 | 
            +
                end
         | 
| 743 594 |  | 
| 744 | 
            -
             | 
| 745 | 
            -
             | 
| 595 | 
            +
                # these finalizer-related methods cannot live in the CommonSocketBehavior
         | 
| 596 | 
            +
                # module; they *must* be in the class definition directly
         | 
| 746 597 |  | 
| 747 | 
            -
             | 
| 748 | 
            -
             | 
| 749 | 
            -
             | 
| 598 | 
            +
                def define_finalizer
         | 
| 599 | 
            +
                  ObjectSpace.define_finalizer(self, self.class.close(@socket, Process.pid))
         | 
| 600 | 
            +
                end
         | 
| 750 601 |  | 
| 751 | 
            -
             | 
| 752 | 
            -
             | 
| 753 | 
            -
             | 
| 602 | 
            +
                def remove_finalizer
         | 
| 603 | 
            +
                  ObjectSpace.undefine_finalizer self
         | 
| 604 | 
            +
                end
         | 
| 754 605 |  | 
| 755 | 
            -
             | 
| 756 | 
            -
             | 
| 757 | 
            -
             | 
| 758 | 
            -
             | 
| 759 | 
            -
              end # LibZMQ.version3?
         | 
| 606 | 
            +
                def self.close socket, pid
         | 
| 607 | 
            +
                  Proc.new { LibZMQ.zmq_close socket if Process.pid == pid }
         | 
| 608 | 
            +
                end
         | 
| 609 | 
            +
              end # Socket
         | 
| 760 610 |  | 
| 761 611 | 
             
            end # module ZMQ
         |