diff options
-rw-r--r-- | perf/ruby/local_thr.rb | 2 | ||||
-rw-r--r-- | python/pyzmq.cpp | 33 | ||||
-rw-r--r-- | ruby/rbzmq.cpp | 106 |
3 files changed, 67 insertions, 74 deletions
diff --git a/perf/ruby/local_thr.rb b/perf/ruby/local_thr.rb index db14cf2..b916f2d 100644 --- a/perf/ruby/local_thr.rb +++ b/perf/ruby/local_thr.rb @@ -29,7 +29,7 @@ message_count = ARGV[2].to_i ctx = Context.new(1, 1) s = Socket.new(ctx, SUB); -s.setsockopt (SUBSCRIBE, "*"); +s.setsockopt(SUBSCRIBE, "*"); # Add your socket options here. # For example ZMQ_RATE, ZMQ_RECOVERY_IVL and ZMQ_MCAST_LOOP for PGM. diff --git a/python/pyzmq.cpp b/python/pyzmq.cpp index c550eb5..628d037 100644 --- a/python/pyzmq.cpp +++ b/python/pyzmq.cpp @@ -139,15 +139,30 @@ PyObject *socket_setsockopt (socket_t *self, PyObject *args, PyObject *kwdict) return NULL; } - int rc; - if (PyInt_Check (optval)) { - int val = PyInt_AsLong (optval); - rc = zmq_setsockopt (self->handle, option, &val, sizeof (int)); - } - if (PyString_Check (optval)) - rc = zmq_setsockopt (self->handle, option, PyString_AsString (optval), - PyString_Size (optval)); - else { + int rc = 0; + + switch (option) { + case ZMQ_HWM: + case ZMQ_LWM: + case ZMQ_SWAP: + case ZMQ_AFFINITY: + case ZMQ_RATE: + case ZMQ_RECOVERY_IVL: + case ZMQ_MCAST_LOOP: + { + int val = PyInt_AsLong (optval); + rc = zmq_setsockopt (self->handle, option, &val, sizeof (int)); + break; + } + case ZMQ_IDENTITY: + case ZMQ_SUBSCRIBE: + case ZMQ_UNSUBSCRIBE: + + rc = zmq_setsockopt (self->handle, option, PyString_AsString (optval), + PyString_Size (optval)); + break; + + default: rc = -1; errno = EINVAL; } diff --git a/ruby/rbzmq.cpp b/ruby/rbzmq.cpp index 1751c14..bf0d9bc 100644 --- a/ruby/rbzmq.cpp +++ b/ruby/rbzmq.cpp @@ -83,74 +83,52 @@ static VALUE socket_initialize (VALUE self_, VALUE context_, VALUE type_) return self_; } -/* -static VALUE rb_setsockopt (VALUE self_, VALUE socket_, VALUE option_, + +static VALUE socket_setsockopt (VALUE self_, VALUE option_, VALUE optval_) { - // Get the socket. - void* socket; - Data_Get_Struct (socket_, void*, socket); - + int rc = 0; - if (TYPE (optval_) == T_STRING) { - - // Forward the code to native 0MQ library. - rc = zmq_setsockopt (socket, NUM2INT (option_), - (void *) StringValueCStr (optval_), RSTRING_LEN (optval_)); - - } - else if (TYPE (optval_) == T_FLOAT) { - - double optval = NUM2DBL (optval_); - - // Forward the code to native 0MQ library. - rc = zmq_setsockopt (socket, NUM2INT (option_), - (void*) &optval, 8); - } - - else if (TYPE (optval_) == T_FIXNUM) { - - long optval = FIX2LONG (optval_); - - // Forward the code to native 0MQ library. - rc = zmq_setsockopt (socket, NUM2INT (option_), - (void *) &optval, 4); - - } - - else if (TYPE (optval_) == T_BIGNUM) { - - long optval = NUM2LONG (optval_); - - // Forward the code to native 0MQ library. - rc = zmq_setsockopt (socket, NUM2INT (option_), - (void *) &optval, 4); - - } - else if (TYPE (optval_) == T_ARRAY) { - - // Forward the code to native 0MQ library. - rc = zmq_setsockopt (socket, NUM2INT (option_), - (void *) RARRAY_PTR (optval_), RARRAY_LEN (optval_)); - - } - - else if (TYPE (optval_) == T_STRUCT) { - - // Forward the code to native 0MQ library. - rc = zmq_setsockopt (socket, NUM2INT (option_), - (void *) RSTRUCT_PTR (optval_), RSTRUCT_LEN (optval_)); - - } - else - rb_raise(rb_eRuntimeError, "Unknown type"); - - assert (rc == 0); - + switch (NUM2INT (option_)) { + case ZMQ_HWM: + case ZMQ_LWM: + case ZMQ_SWAP: + case ZMQ_AFFINITY: + case ZMQ_RATE: + case ZMQ_RECOVERY_IVL: + case ZMQ_MCAST_LOOP: + { + long optval = FIX2LONG (optval_); + + // Forward the code to native 0MQ library. + rc = zmq_setsockopt (DATA_PTR (self_), NUM2INT (option_), + (void *) &optval, 4); + } + + break; + case ZMQ_IDENTITY: + case ZMQ_SUBSCRIBE: + case ZMQ_UNSUBSCRIBE: + + // Forward the code to native 0MQ library. + rc = zmq_setsockopt (DATA_PTR (self_), NUM2INT (option_), + (void *) StringValueCStr (optval_), RSTRING_LEN (optval_)); + break; + + default: + rc = -1; + errno = EINVAL; + } + + if (rc != 0) { + rb_raise (rb_eRuntimeError, strerror (errno)); + return Qnil; + } + return self_; } -*/ + static VALUE socket_bind (VALUE self_, VALUE addr_) { @@ -264,8 +242,8 @@ extern "C" void Init_librbzmq () rb_define_alloc_func (socket_type, socket_alloc); rb_define_method (socket_type, "initialize", (VALUE(*)(...)) socket_initialize, 2); -// rb_define_method (socket_type, "setsockopt", -// (VALUE(*)(...)) socket_setsockopt, 2); + rb_define_method (socket_type, "setsockopt", + (VALUE(*)(...)) socket_setsockopt, 2); rb_define_method (socket_type, "bind", (VALUE(*)(...)) socket_bind, 1); rb_define_method (socket_type, "connect", |