zeromq 0.0.1 → 0.0.2
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.
- data/extension/context.c +12 -1
- data/extension/error.c +6 -0
- data/extension/extension.c +2 -2
- data/extension/extension.h +1 -1
- data/extension/socket.c +185 -120
- data/extension/zeromq.c +1 -1
- data/lib/zeromq/version.rb +1 -1
- metadata +2 -2
data/extension/context.c
CHANGED
@@ -67,6 +67,12 @@ void zeromq_context_release( struct zeromq_context* context )
|
|
67
67
|
|
68
68
|
//-----------------------------------------------------------------------------
|
69
69
|
|
70
|
+
/*
|
71
|
+
* Document-class: ZeroMQ::Context
|
72
|
+
*
|
73
|
+
* The ZeroMQ::Context class ...
|
74
|
+
*/
|
75
|
+
|
70
76
|
VALUE context_declare( VALUE zeromq_module )
|
71
77
|
//------------------------------------------
|
72
78
|
{
|
@@ -90,6 +96,11 @@ VALUE context_declare( VALUE zeromq_module )
|
|
90
96
|
return klass;
|
91
97
|
}
|
92
98
|
|
99
|
+
/*
|
100
|
+
* @!method default
|
101
|
+
*
|
102
|
+
* The +default+ method ...
|
103
|
+
*/
|
93
104
|
VALUE context_default( VALUE self )
|
94
105
|
//---------------------------------
|
95
106
|
{
|
@@ -134,7 +145,7 @@ static VALUE context_initialize( int arg_count, VALUE* args, VALUE self )
|
|
134
145
|
context->context = zmq_ctx_new();
|
135
146
|
if ( !context->context )
|
136
147
|
{
|
137
|
-
rb_raise(
|
148
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
138
149
|
return Qnil;
|
139
150
|
}
|
140
151
|
|
data/extension/error.c
CHANGED
data/extension/extension.c
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
#include "socket.h"
|
7
7
|
|
8
8
|
VALUE module;
|
9
|
-
VALUE
|
9
|
+
VALUE exception_class;
|
10
10
|
VALUE context_class;
|
11
11
|
VALUE socket_class;
|
12
12
|
|
@@ -15,7 +15,7 @@ void Init_zeromq()
|
|
15
15
|
{
|
16
16
|
module = module_declare();
|
17
17
|
|
18
|
-
|
18
|
+
exception_class = error_declare( module );
|
19
19
|
context_class = context_declare( module );
|
20
20
|
socket_class = socket_declare( module );
|
21
21
|
}
|
data/extension/extension.h
CHANGED
data/extension/socket.c
CHANGED
@@ -31,6 +31,15 @@ static VALUE socket_send( int argc_, VALUE* argv_, VALUE self_ );
|
|
31
31
|
//-----------------------------------------------------------------------------
|
32
32
|
// zeromq socket helper functions
|
33
33
|
|
34
|
+
struct zeromq_socket_io_request
|
35
|
+
{
|
36
|
+
void* socket;
|
37
|
+
zmq_msg_t* message;
|
38
|
+
int flags;
|
39
|
+
|
40
|
+
int result;
|
41
|
+
};
|
42
|
+
|
34
43
|
struct zeromq_socket* zeromq_socket_create()
|
35
44
|
//------------------------------------------
|
36
45
|
{
|
@@ -60,6 +69,37 @@ void zeromq_socket_destroy( struct zeromq_socket* zeromq_socket )
|
|
60
69
|
xfree( zeromq_socket );
|
61
70
|
}
|
62
71
|
|
72
|
+
static VALUE zeromq_socket_send_blocking_region( void* argument )
|
73
|
+
//---------------------------------------------------------------
|
74
|
+
{
|
75
|
+
|
76
|
+
struct zeromq_socket_io_request* io_request =
|
77
|
+
( struct zeromq_socket_io_request* )argument;
|
78
|
+
|
79
|
+
io_request->result = zmq_sendmsg(
|
80
|
+
io_request->socket,
|
81
|
+
io_request->message,
|
82
|
+
io_request->flags
|
83
|
+
);
|
84
|
+
|
85
|
+
return Qnil;
|
86
|
+
}
|
87
|
+
|
88
|
+
static VALUE zeromq_socket_receive_blocking_region( void* argument )
|
89
|
+
//------------------------------------------------------------------
|
90
|
+
{
|
91
|
+
struct zeromq_socket_io_request* io_request =
|
92
|
+
( struct zeromq_socket_io_request* )argument;
|
93
|
+
|
94
|
+
io_request->result = zmq_recvmsg(
|
95
|
+
io_request->socket,
|
96
|
+
io_request->message,
|
97
|
+
io_request->flags
|
98
|
+
);
|
99
|
+
|
100
|
+
return Qnil;
|
101
|
+
}
|
102
|
+
|
63
103
|
int zeromq_apply_socket_option( VALUE option, VALUE value, VALUE socket )
|
64
104
|
//-----------------------------------------------------------------------
|
65
105
|
{
|
@@ -67,8 +107,18 @@ int zeromq_apply_socket_option( VALUE option, VALUE value, VALUE socket )
|
|
67
107
|
return ST_CONTINUE;
|
68
108
|
}
|
69
109
|
|
70
|
-
|
71
|
-
|
110
|
+
/*
|
111
|
+
* Document-class: ZeroMQ::Socket
|
112
|
+
*
|
113
|
+
* The Socket class ...
|
114
|
+
*/
|
115
|
+
|
116
|
+
/* call-seq: new()
|
117
|
+
*
|
118
|
+
* The new method does some stuff.
|
119
|
+
*/
|
120
|
+
|
121
|
+
//----------------------------------------------------------------------------
|
72
122
|
|
73
123
|
VALUE socket_declare( VALUE zeromq_module )
|
74
124
|
//-----------------------------------------
|
@@ -87,6 +137,8 @@ VALUE socket_declare( VALUE zeromq_module )
|
|
87
137
|
rb_define_method( klass, "recv", socket_recv, -1 );
|
88
138
|
rb_define_method( klass, "close", socket_close, 0 );
|
89
139
|
|
140
|
+
rb_define_alias( klass, "receive", "recv" );
|
141
|
+
|
90
142
|
return klass;
|
91
143
|
}
|
92
144
|
|
@@ -143,7 +195,7 @@ static VALUE socket_initialize( int arg_count, VALUE* arguments, VALUE self )
|
|
143
195
|
|
144
196
|
if ( socket_type == Qnil )
|
145
197
|
{
|
146
|
-
rb_raise(
|
198
|
+
rb_raise( exception_class, "The socket type is required." );
|
147
199
|
return Qnil;
|
148
200
|
}
|
149
201
|
|
@@ -157,7 +209,7 @@ static VALUE socket_initialize( int arg_count, VALUE* arguments, VALUE self )
|
|
157
209
|
|
158
210
|
if ( !socket->socket )
|
159
211
|
{
|
160
|
-
rb_raise(
|
212
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
161
213
|
return Qnil;
|
162
214
|
}
|
163
215
|
|
@@ -180,7 +232,7 @@ static VALUE socket_close( VALUE self_ )
|
|
180
232
|
if (s->socket != NULL) {
|
181
233
|
int rc = zmq_close(s->socket);
|
182
234
|
if (rc != 0) {
|
183
|
-
rb_raise (
|
235
|
+
rb_raise (exception_class, "%s", zmq_strerror (zmq_errno ()));
|
184
236
|
return Qnil;
|
185
237
|
}
|
186
238
|
|
@@ -222,7 +274,7 @@ static VALUE socket_getsockopt( VALUE self_, VALUE option_ )
|
|
222
274
|
|
223
275
|
if ( rc != 0 )
|
224
276
|
{
|
225
|
-
rb_raise (
|
277
|
+
rb_raise (exception_class, "%s", zmq_strerror (zmq_errno ()));
|
226
278
|
return Qnil;
|
227
279
|
}
|
228
280
|
|
@@ -247,7 +299,7 @@ static VALUE socket_getsockopt( VALUE self_, VALUE option_ )
|
|
247
299
|
|
248
300
|
if ( rc != 0 )
|
249
301
|
{
|
250
|
-
rb_raise(
|
302
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
251
303
|
return Qnil;
|
252
304
|
}
|
253
305
|
|
@@ -280,7 +332,7 @@ static VALUE socket_getsockopt( VALUE self_, VALUE option_ )
|
|
280
332
|
|
281
333
|
if ( rc != 0 )
|
282
334
|
{
|
283
|
-
rb_raise(
|
335
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
284
336
|
return Qnil;
|
285
337
|
}
|
286
338
|
|
@@ -305,7 +357,7 @@ static VALUE socket_getsockopt( VALUE self_, VALUE option_ )
|
|
305
357
|
&optvalsize);
|
306
358
|
|
307
359
|
if (rc != 0) {
|
308
|
-
rb_raise (
|
360
|
+
rb_raise (exception_class, "%s", zmq_strerror (zmq_errno ()));
|
309
361
|
return Qnil;
|
310
362
|
}
|
311
363
|
|
@@ -325,7 +377,7 @@ static VALUE socket_getsockopt( VALUE self_, VALUE option_ )
|
|
325
377
|
(void *)identity, &optvalsize);
|
326
378
|
|
327
379
|
if (rc != 0) {
|
328
|
-
rb_raise (
|
380
|
+
rb_raise (exception_class, "%s", zmq_strerror (zmq_errno ()));
|
329
381
|
return Qnil;
|
330
382
|
}
|
331
383
|
|
@@ -337,14 +389,15 @@ static VALUE socket_getsockopt( VALUE self_, VALUE option_ )
|
|
337
389
|
break;
|
338
390
|
|
339
391
|
default:
|
340
|
-
rb_raise (
|
392
|
+
rb_raise (exception_class, "%s", zmq_strerror (EINVAL));
|
341
393
|
return Qnil;
|
342
394
|
}
|
343
395
|
|
344
396
|
return retval;
|
345
397
|
}
|
346
398
|
|
347
|
-
static VALUE socket_setsockopt
|
399
|
+
static VALUE socket_setsockopt( VALUE self_, VALUE option_, VALUE optval_ )
|
400
|
+
//-------------------------------------------------------------------------
|
348
401
|
{
|
349
402
|
int rc = 0;
|
350
403
|
struct zeromq_socket * s;
|
@@ -409,14 +462,14 @@ static VALUE socket_setsockopt (VALUE self_, VALUE option_, VALUE optval_)
|
|
409
462
|
|
410
463
|
default:
|
411
464
|
{
|
412
|
-
rb_raise(
|
465
|
+
rb_raise( exception_class, "%s", zmq_strerror( EINVAL ) );
|
413
466
|
return Qnil;
|
414
467
|
}
|
415
468
|
}
|
416
469
|
|
417
470
|
if ( rc != 0 )
|
418
471
|
{
|
419
|
-
rb_raise(
|
472
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
420
473
|
return Qnil;
|
421
474
|
}
|
422
475
|
|
@@ -424,6 +477,7 @@ static VALUE socket_setsockopt (VALUE self_, VALUE option_, VALUE optval_)
|
|
424
477
|
}
|
425
478
|
|
426
479
|
static VALUE socket_bind( VALUE self_, VALUE addr_ )
|
480
|
+
//--------------------------------------------------
|
427
481
|
{
|
428
482
|
struct zeromq_socket * s;
|
429
483
|
Data_Get_Struct (self_, struct zeromq_socket, s);
|
@@ -431,7 +485,7 @@ static VALUE socket_bind( VALUE self_, VALUE addr_ )
|
|
431
485
|
|
432
486
|
int rc = zmq_bind (s->socket, rb_string_value_cstr (&addr_));
|
433
487
|
if (rc != 0) {
|
434
|
-
rb_raise (
|
488
|
+
rb_raise (exception_class, "%s", zmq_strerror (zmq_errno ()));
|
435
489
|
return Qnil;
|
436
490
|
}
|
437
491
|
|
@@ -439,6 +493,7 @@ static VALUE socket_bind( VALUE self_, VALUE addr_ )
|
|
439
493
|
}
|
440
494
|
|
441
495
|
static VALUE socket_connect( VALUE self_, VALUE addr_ )
|
496
|
+
//-----------------------------------------------------
|
442
497
|
{
|
443
498
|
struct zeromq_socket * s;
|
444
499
|
Data_Get_Struct (self_, struct zeromq_socket, s);
|
@@ -446,146 +501,156 @@ static VALUE socket_connect( VALUE self_, VALUE addr_ )
|
|
446
501
|
|
447
502
|
int rc = zmq_connect (s->socket, rb_string_value_cstr (&addr_));
|
448
503
|
if (rc != 0) {
|
449
|
-
rb_raise (
|
504
|
+
rb_raise (exception_class, "%s", zmq_strerror (zmq_errno ()));
|
450
505
|
return Qnil;
|
451
506
|
}
|
452
507
|
|
453
508
|
return Qnil;
|
454
509
|
}
|
455
510
|
|
456
|
-
|
457
|
-
|
458
|
-
void *socket;
|
459
|
-
zmq_msg_t *msg;
|
460
|
-
int flags;
|
461
|
-
int rc;
|
462
|
-
};
|
463
|
-
|
464
|
-
static VALUE zmq_send_blocking( void* args_ )
|
511
|
+
static VALUE socket_send( int argument_count, VALUE* arguments, VALUE self )
|
512
|
+
//--------------------------------------------------------------------------
|
465
513
|
{
|
466
|
-
|
467
|
-
|
468
|
-
send_args->rc = zmq_sendmsg(
|
469
|
-
send_args->socket,
|
470
|
-
send_args->msg,
|
471
|
-
send_args->flags
|
472
|
-
);
|
514
|
+
VALUE message_bytes_value, flags_value;
|
473
515
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
rb_scan_args (argc_, argv_, "11", &msg_, &flags_);
|
483
|
-
|
484
|
-
struct zeromq_socket * s;
|
485
|
-
Data_Get_Struct (self_, struct zeromq_socket, s);
|
486
|
-
Check_Socket (s);
|
516
|
+
rb_scan_args(
|
517
|
+
argument_count,
|
518
|
+
arguments,
|
519
|
+
"11",
|
520
|
+
&message_bytes_value,
|
521
|
+
&flags_value
|
522
|
+
);
|
487
523
|
|
488
|
-
Check_Type
|
524
|
+
Check_Type( message_bytes_value, T_STRING );
|
525
|
+
int flags = NIL_P( flags_value ) ? 0 : NUM2INT( flags_value );
|
489
526
|
|
490
|
-
|
527
|
+
struct zeromq_socket* socket;
|
528
|
+
Data_Get_Struct( self, struct zeromq_socket, socket );
|
529
|
+
Check_Socket( socket );
|
491
530
|
|
492
|
-
zmq_msg_t
|
493
|
-
int
|
494
|
-
|
495
|
-
|
496
|
-
|
531
|
+
zmq_msg_t message;
|
532
|
+
int message_length = ( int )RSTRING_LEN( message_bytes_value );
|
533
|
+
|
534
|
+
int result = zmq_msg_init_size( &message, message_length );
|
535
|
+
if ( result != 0 )
|
536
|
+
{
|
537
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
497
538
|
return Qnil;
|
498
539
|
}
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
540
|
+
|
541
|
+
memcpy(
|
542
|
+
zmq_msg_data( &message ),
|
543
|
+
RSTRING_PTR( message_bytes_value ),
|
544
|
+
message_length
|
545
|
+
);
|
546
|
+
|
547
|
+
if ( !( flags & ZMQ_NOBLOCK ) )
|
548
|
+
{
|
549
|
+
struct zeromq_socket_io_request io_request;
|
550
|
+
io_request.socket = socket->socket;
|
551
|
+
io_request.message = &message;
|
552
|
+
io_request.flags = flags;
|
553
|
+
|
554
|
+
rb_thread_blocking_region(
|
555
|
+
zeromq_socket_send_blocking_region,
|
556
|
+
( void* )&io_request,
|
557
|
+
NULL,
|
558
|
+
NULL
|
559
|
+
);
|
560
|
+
|
561
|
+
result = io_request.result;
|
509
562
|
}
|
510
563
|
else
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
564
|
+
{
|
565
|
+
result = zmq_sendmsg( socket->socket, &message, flags );
|
566
|
+
}
|
567
|
+
|
568
|
+
if ( result == -1 && zmq_errno() == EAGAIN )
|
569
|
+
{
|
570
|
+
result = zmq_msg_close( &message );
|
571
|
+
assert( result == 0 );
|
516
572
|
return Qfalse;
|
517
573
|
}
|
518
574
|
|
519
|
-
if (
|
520
|
-
|
521
|
-
|
522
|
-
|
575
|
+
if ( result == -1 )
|
576
|
+
{
|
577
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
578
|
+
|
579
|
+
result = zmq_msg_close( &message );
|
580
|
+
assert( result == 0 );
|
581
|
+
|
523
582
|
return Qnil;
|
524
583
|
}
|
525
584
|
|
526
|
-
|
527
|
-
assert
|
585
|
+
result = zmq_msg_close( &message );
|
586
|
+
assert( result == 0 );
|
587
|
+
|
528
588
|
return Qtrue;
|
529
589
|
}
|
530
590
|
|
531
|
-
|
532
|
-
|
591
|
+
static VALUE socket_recv( int argument_count, VALUE* arguments, VALUE self )
|
592
|
+
//--------------------------------------------------------------------------
|
533
593
|
{
|
534
|
-
|
535
|
-
|
536
|
-
recv_args->rc = zmq_recvmsg(recv_args->socket, recv_args->msg, recv_args->flags);
|
594
|
+
VALUE flags_value;
|
537
595
|
|
538
|
-
|
539
|
-
|
540
|
-
|
596
|
+
rb_scan_args(
|
597
|
+
argument_count,
|
598
|
+
arguments,
|
599
|
+
"01",
|
600
|
+
&flags_value
|
601
|
+
);
|
541
602
|
|
542
|
-
|
543
|
-
{
|
544
|
-
VALUE flags_;
|
545
|
-
|
546
|
-
rb_scan_args (argc_, argv_, "01", &flags_);
|
603
|
+
int flags = NIL_P( flags_value ) ? 0 : NUM2INT( flags_value );
|
547
604
|
|
548
|
-
struct zeromq_socket
|
549
|
-
Data_Get_Struct
|
550
|
-
Check_Socket
|
605
|
+
struct zeromq_socket* socket;
|
606
|
+
Data_Get_Struct( self, struct zeromq_socket, socket );
|
607
|
+
Check_Socket( socket );
|
551
608
|
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
609
|
+
zmq_msg_t message;
|
610
|
+
int rc = zmq_msg_init( &message );
|
611
|
+
assert( rc == 0 );
|
612
|
+
|
613
|
+
if ( !( flags & ZMQ_NOBLOCK ) )
|
614
|
+
{
|
615
|
+
struct zeromq_socket_io_request io_request;
|
616
|
+
io_request.socket = socket->socket;
|
617
|
+
io_request.message = &message;
|
618
|
+
io_request.flags = flags;
|
619
|
+
|
620
|
+
rb_thread_blocking_region(
|
621
|
+
zeromq_socket_receive_blocking_region,
|
622
|
+
( void* )&io_request,
|
623
|
+
NULL,
|
624
|
+
NULL
|
625
|
+
);
|
567
626
|
}
|
568
627
|
else
|
569
|
-
|
570
|
-
rc = zmq_recvmsg(
|
571
|
-
if (rc == -1 && zmq_errno () == EAGAIN) {
|
572
|
-
rc = zmq_msg_close (&msg);
|
573
|
-
assert (rc == 0);
|
574
|
-
return Qnil;
|
628
|
+
{
|
629
|
+
rc = zmq_recvmsg( socket->socket, &message, flags );
|
575
630
|
}
|
576
631
|
|
577
|
-
if (rc == -1)
|
578
|
-
|
579
|
-
rc = zmq_msg_close
|
580
|
-
assert
|
632
|
+
if ( rc == -1 && zmq_errno() == EAGAIN )
|
633
|
+
{
|
634
|
+
rc = zmq_msg_close( &message );
|
635
|
+
assert( rc == 0 );
|
581
636
|
return Qnil;
|
582
637
|
}
|
583
638
|
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
639
|
+
if ( rc == -1 )
|
640
|
+
{
|
641
|
+
rb_raise( exception_class, "%s", zmq_strerror( zmq_errno() ) );
|
642
|
+
rc = zmq_msg_close( &message );
|
643
|
+
assert( rc == 0 );
|
644
|
+
return Qnil;
|
645
|
+
}
|
590
646
|
|
647
|
+
VALUE message_bytes_value = rb_str_new(
|
648
|
+
( char* )zmq_msg_data( &message ),
|
649
|
+
zmq_msg_size( &message )
|
650
|
+
);
|
651
|
+
|
652
|
+
rc = zmq_msg_close( &message );
|
653
|
+
assert( rc == 0 );
|
591
654
|
|
655
|
+
return message_bytes_value;
|
656
|
+
}
|
data/extension/zeromq.c
CHANGED
@@ -219,7 +219,7 @@ static VALUE internal_select(VALUE argval)
|
|
219
219
|
rc = zmq_poll (ps.items, ps.nitems, arg->timeout_usec);
|
220
220
|
|
221
221
|
if (rc == -1) {
|
222
|
-
rb_raise(
|
222
|
+
rb_raise(exception_class, "%s", zmq_strerror (zmq_errno ()));
|
223
223
|
return Qnil;
|
224
224
|
}
|
225
225
|
else if (rc == 0)
|
data/lib/zeromq/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zeromq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -51,7 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
51
|
version: '0'
|
52
52
|
requirements: []
|
53
53
|
rubyforge_project:
|
54
|
-
rubygems_version: 1.8.
|
54
|
+
rubygems_version: 1.8.25
|
55
55
|
signing_key:
|
56
56
|
specification_version: 3
|
57
57
|
summary: Ruby API for ZeroMQ
|