posix_mq 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +45 -0
- data/GIT-VERSION-FILE +1 -1
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +0 -1
- data/LATEST +3 -6
- data/NEWS +5 -0
- data/Rakefile +0 -38
- data/ext/posix_mq/extconf.rb +1 -0
- data/ext/posix_mq/posix_mq.c +49 -36
- data/pkg.mk +5 -1
- metadata +60 -60
data/ChangeLog
CHANGED
@@ -1,5 +1,50 @@
|
|
1
1
|
ChangeLog from http://bogomips.org/ruby_posix_mq.git
|
2
2
|
|
3
|
+
commit b14ae708a9e53b1f8a274aa78a610b2f776847f5
|
4
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
5
|
+
Date: Sat Feb 15 13:34:12 2014 +0000
|
6
|
+
|
7
|
+
posix_mq 2.1.0 - ensure compatibility with future Rubies
|
8
|
+
|
9
|
+
* avoid deprecated rb_thread_blocking_region in Ruby 2.0/2.1
|
10
|
+
* prepare for rb_thread_blocking_region removal
|
11
|
+
|
12
|
+
commit b77f930e712812024c3d379395c2879b312336f8
|
13
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
14
|
+
Date: Sat Feb 15 13:13:06 2014 +0000
|
15
|
+
|
16
|
+
avoid deprecated rb_thread_blocking_region in Ruby 2.0/2.1
|
17
|
+
|
18
|
+
This will be removed in Ruby 2.2, so avoid the deprecation warning.
|
19
|
+
|
20
|
+
commit a2a00d4ba8d16838e613cbecfad98cb188929e14
|
21
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
22
|
+
Date: Sun Feb 9 00:40:11 2014 +0000
|
23
|
+
|
24
|
+
prepare for rb_thread_blocking_region removal
|
25
|
+
|
26
|
+
It'll be OK to use rb_thread_call_without_gvl when
|
27
|
+
rb_thread_blocking_region is not detectable at all.
|
28
|
+
We still use rb_thread_blocking_region for Ruby 2.0-2.1 because
|
29
|
+
rb_thread_call_without_gvl was detectable in 1.9.3, but not
|
30
|
+
usable as an internal symbol.
|
31
|
+
|
32
|
+
ref: https://bugs.ruby-lang.org/issues/9502
|
33
|
+
|
34
|
+
commit 5f620f4435afcdc2304f53c74ff8b65fc4f04b0d
|
35
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
36
|
+
Date: Mon Sep 30 18:24:33 2013 +0000
|
37
|
+
|
38
|
+
Rakefile: kill raa_update task
|
39
|
+
|
40
|
+
RAA is dead.
|
41
|
+
|
42
|
+
commit 0e9e6c54bb25eadcf955a7abb0b60e97388d8290
|
43
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
44
|
+
Date: Mon Aug 6 21:06:38 2012 +0000
|
45
|
+
|
46
|
+
pkg.mk: update
|
47
|
+
|
3
48
|
commit 86f36a2d88aca8fdef45fd2a757f98a593935ba9
|
4
49
|
Author: Eric Wong <normalperson@yhbt.net>
|
5
50
|
Date: Mon Aug 6 20:58:04 2012 +0000
|
data/GIT-VERSION-FILE
CHANGED
@@ -1 +1 @@
|
|
1
|
-
GIT_VERSION = 2.
|
1
|
+
GIT_VERSION = 2.1.0
|
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
data/LATEST
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
-
=== posix_mq 2.
|
1
|
+
=== posix_mq 2.1.0 - ensure compatibility with future Rubies / 2014-02-15 13:35 UTC
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
There are also many FreeBSD-related fixes thanks to
|
7
|
-
Hleb Valoshka <375gnu@gmail.com> and small code cleanups.
|
3
|
+
* avoid deprecated rb_thread_blocking_region in Ruby 2.0/2.1
|
4
|
+
* prepare for rb_thread_blocking_region removal
|
8
5
|
|
data/NEWS
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== posix_mq 2.1.0 - ensure compatibility with future Rubies / 2014-02-15 13:35 UTC
|
2
|
+
|
3
|
+
* avoid deprecated rb_thread_blocking_region in Ruby 2.0/2.1
|
4
|
+
* prepare for rb_thread_blocking_region removal
|
5
|
+
|
1
6
|
=== posix_mq 2.0.0 - a minor API change + FreeBSD fixes / 2012-08-06 21:02 UTC
|
2
7
|
|
3
8
|
Blocking methods no longer raise Errno::EINTR (to match
|
data/Rakefile
CHANGED
@@ -31,41 +31,3 @@ task :publish_news do
|
|
31
31
|
rf.login
|
32
32
|
rf.post_news('qrp', subject, body)
|
33
33
|
end
|
34
|
-
|
35
|
-
desc "post to RAA"
|
36
|
-
task :raa_update do
|
37
|
-
require 'rubygems'
|
38
|
-
require 'net/http'
|
39
|
-
require 'net/netrc'
|
40
|
-
rc = Net::Netrc.locate('posix_mq-raa') or abort "~/.netrc not found"
|
41
|
-
password = rc.password
|
42
|
-
|
43
|
-
s = Gem::Specification.load('posix_mq.gemspec')
|
44
|
-
desc = [ s.description.strip ]
|
45
|
-
desc << ""
|
46
|
-
desc << "* #{s.email}"
|
47
|
-
desc << "* #{git_url}"
|
48
|
-
desc << "* #{cgit_url}"
|
49
|
-
desc = desc.join("\n")
|
50
|
-
uri = URI.parse('http://raa.ruby-lang.org/regist.rhtml')
|
51
|
-
form = {
|
52
|
-
:name => s.name,
|
53
|
-
:short_description => s.summary,
|
54
|
-
:version => s.version.to_s,
|
55
|
-
:status => 'experimental',
|
56
|
-
:owner => s.authors.first,
|
57
|
-
:email => s.email,
|
58
|
-
:category_major => 'Library',
|
59
|
-
:category_minor => 'System',
|
60
|
-
:url => s.homepage,
|
61
|
-
:download => 'http://rubyforge.org/frs/?group_id=5626',
|
62
|
-
:license => 'LGPL', # LGPLv3, actually, but RAA is ancient...
|
63
|
-
:description_style => 'Plain',
|
64
|
-
:description => desc,
|
65
|
-
:pass => password,
|
66
|
-
:submit => 'Update',
|
67
|
-
}
|
68
|
-
res = Net::HTTP.post_form(uri, form)
|
69
|
-
p res
|
70
|
-
puts res.body
|
71
|
-
end
|
data/ext/posix_mq/extconf.rb
CHANGED
@@ -6,6 +6,7 @@ have_header("mqueue.h") or abort "mqueue.h header missing"
|
|
6
6
|
have_header("pthread.h")
|
7
7
|
have_func("rb_str_set_len")
|
8
8
|
have_func('rb_thread_blocking_region')
|
9
|
+
have_func('rb_thread_call_without_gvl')
|
9
10
|
have_library("m")
|
10
11
|
have_library("rt")
|
11
12
|
have_library("pthread")
|
data/ext/posix_mq/posix_mq.c
CHANGED
@@ -95,18 +95,26 @@ static void rb_18_str_set_len(VALUE str, long len)
|
|
95
95
|
#define rb_str_set_len rb_18_str_set_len
|
96
96
|
#endif /* !defined(HAVE_RB_STR_SET_LEN) */
|
97
97
|
|
98
|
+
#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) && defined(HAVE_RUBY_THREAD_H)
|
99
|
+
/* Ruby 2.0+ */
|
100
|
+
# include <ruby/thread.h>
|
101
|
+
# define WITHOUT_GVL(fn,a,ubf,b) \
|
102
|
+
rb_thread_call_without_gvl((fn),(a),(ubf),(b))
|
103
|
+
#elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
|
104
|
+
typedef VALUE (*my_blocking_fn_t)(void*);
|
105
|
+
# define WITHOUT_GVL(fn,a,ubf,b) \
|
106
|
+
rb_thread_blocking_region((my_blocking_fn_t)(fn),(a),(ubf),(b))
|
107
|
+
|
108
|
+
#else /* Ruby 1.8 */
|
98
109
|
/* partial emulation of the 1.9 rb_thread_blocking_region under 1.8 */
|
99
|
-
#ifndef HAVE_RB_THREAD_BLOCKING_REGION
|
100
110
|
# include <rubysig.h>
|
101
111
|
# define RUBY_UBF_IO ((rb_unblock_function_t *)-1)
|
102
112
|
typedef void rb_unblock_function_t(void *);
|
103
|
-
typedef
|
104
|
-
static
|
105
|
-
|
106
|
-
rb_blocking_function_t *func, void *data1,
|
107
|
-
rb_unblock_function_t *ubf, void *data2)
|
113
|
+
typedef void * rb_blocking_function_t(void *);
|
114
|
+
static void * WITHOUT_GVL(rb_blocking_function_t *func, void *data1,
|
115
|
+
rb_unblock_function_t *ubf, void *data2)
|
108
116
|
{
|
109
|
-
|
117
|
+
void *rv;
|
110
118
|
|
111
119
|
assert(RUBY_UBF_IO == ubf && "RUBY_UBF_IO required for emulation");
|
112
120
|
|
@@ -120,6 +128,7 @@ rb_thread_blocking_region(
|
|
120
128
|
|
121
129
|
/* used to pass arguments to mq_open inside blocking region */
|
122
130
|
struct open_args {
|
131
|
+
mqd_t des;
|
123
132
|
int argc;
|
124
133
|
const char *name;
|
125
134
|
int oflags;
|
@@ -130,6 +139,10 @@ struct open_args {
|
|
130
139
|
/* used to pass arguments to mq_send/mq_receive inside blocking region */
|
131
140
|
struct rw_args {
|
132
141
|
mqd_t des;
|
142
|
+
union {
|
143
|
+
ssize_t received;
|
144
|
+
int retval;
|
145
|
+
};
|
133
146
|
char *msg_ptr;
|
134
147
|
size_t msg_len;
|
135
148
|
unsigned msg_prio;
|
@@ -229,43 +242,44 @@ static struct timespec *convert_timeout(struct timespec *dest, VALUE t)
|
|
229
242
|
}
|
230
243
|
|
231
244
|
/* (may) run without GVL */
|
232
|
-
static
|
245
|
+
static void * xopen(void *ptr)
|
233
246
|
{
|
234
247
|
struct open_args *x = ptr;
|
235
|
-
mqd_t rv;
|
236
248
|
|
237
249
|
switch (x->argc) {
|
238
|
-
case 2:
|
239
|
-
case 3:
|
240
|
-
case 4:
|
241
|
-
default:
|
250
|
+
case 2: x->des = mq_open(x->name, x->oflags); break;
|
251
|
+
case 3: x->des = mq_open(x->name, x->oflags, x->mode, NULL); break;
|
252
|
+
case 4: x->des = mq_open(x->name, x->oflags, x->mode, &x->attr); break;
|
253
|
+
default: x->des = MQD_INVALID;
|
242
254
|
}
|
243
255
|
|
244
|
-
return
|
256
|
+
return NULL;
|
245
257
|
}
|
246
258
|
|
247
259
|
/* runs without GVL */
|
248
|
-
static
|
260
|
+
static void *xsend(void *ptr)
|
249
261
|
{
|
250
262
|
struct rw_args *x = ptr;
|
251
263
|
|
252
|
-
|
253
|
-
|
254
|
-
|
264
|
+
x->retval = x->timeout ?
|
265
|
+
mq_timedsend(x->des, x->msg_ptr, x->msg_len,
|
266
|
+
x->msg_prio, x->timeout) :
|
267
|
+
mq_send(x->des, x->msg_ptr, x->msg_len, x->msg_prio);
|
255
268
|
|
256
|
-
return
|
269
|
+
return NULL;
|
257
270
|
}
|
258
271
|
|
259
272
|
/* runs without GVL */
|
260
|
-
static
|
273
|
+
static void * xrecv(void *ptr)
|
261
274
|
{
|
262
275
|
struct rw_args *x = ptr;
|
263
276
|
|
264
|
-
|
265
|
-
|
266
|
-
|
277
|
+
x->received = x->timeout ?
|
278
|
+
mq_timedreceive(x->des, x->msg_ptr, x->msg_len,
|
279
|
+
&x->msg_prio, x->timeout) :
|
280
|
+
mq_receive(x->des, x->msg_ptr, x->msg_len, &x->msg_prio);
|
267
281
|
|
268
|
-
return
|
282
|
+
return NULL;
|
269
283
|
}
|
270
284
|
|
271
285
|
/* called by GC */
|
@@ -438,7 +452,8 @@ static VALUE init(int argc, VALUE *argv, VALUE self)
|
|
438
452
|
check_struct_type(attr);
|
439
453
|
}
|
440
454
|
|
441
|
-
|
455
|
+
(void)xopen(&x);
|
456
|
+
mq->des = x.des;
|
442
457
|
if (mq->des == MQD_INVALID) {
|
443
458
|
switch (errno) {
|
444
459
|
case ENOMEM:
|
@@ -446,7 +461,8 @@ static VALUE init(int argc, VALUE *argv, VALUE self)
|
|
446
461
|
case ENFILE:
|
447
462
|
case ENOSPC:
|
448
463
|
rb_gc();
|
449
|
-
|
464
|
+
(void)xopen(&x);
|
465
|
+
mq->des = x.des;
|
450
466
|
}
|
451
467
|
if (mq->des == MQD_INVALID)
|
452
468
|
rb_sys_fail("mq_open");
|
@@ -532,7 +548,6 @@ static VALUE _send(int sflags, int argc, VALUE *argv, VALUE self)
|
|
532
548
|
struct posix_mq *mq = get(self, 1);
|
533
549
|
struct rw_args x;
|
534
550
|
VALUE buffer, prio, timeout;
|
535
|
-
int rv;
|
536
551
|
struct timespec expire;
|
537
552
|
|
538
553
|
rb_scan_args(argc, argv, "12", &buffer, &prio, &timeout);
|
@@ -543,8 +558,8 @@ static VALUE _send(int sflags, int argc, VALUE *argv, VALUE self)
|
|
543
558
|
x.msg_prio = NIL_P(prio) ? 0 : NUM2UINT(prio);
|
544
559
|
|
545
560
|
retry:
|
546
|
-
|
547
|
-
if (
|
561
|
+
WITHOUT_GVL(xsend, &x, RUBY_UBF_IO, 0);
|
562
|
+
if (x.retval == -1) {
|
548
563
|
if (errno == EINTR)
|
549
564
|
goto retry;
|
550
565
|
if (errno == EAGAIN && (sflags & PMQ_TRY))
|
@@ -570,7 +585,6 @@ static VALUE send0(VALUE self, VALUE buffer)
|
|
570
585
|
{
|
571
586
|
struct posix_mq *mq = get(self, 1);
|
572
587
|
struct rw_args x;
|
573
|
-
int rv;
|
574
588
|
|
575
589
|
setup_send_buffer(&x, buffer);
|
576
590
|
x.des = mq->des;
|
@@ -578,8 +592,8 @@ static VALUE send0(VALUE self, VALUE buffer)
|
|
578
592
|
x.msg_prio = 0;
|
579
593
|
|
580
594
|
retry:
|
581
|
-
|
582
|
-
if (
|
595
|
+
WITHOUT_GVL(xsend, &x, RUBY_UBF_IO, 0);
|
596
|
+
if (x.retval == -1) {
|
583
597
|
if (errno == EINTR)
|
584
598
|
goto retry;
|
585
599
|
rb_sys_fail("mq_send");
|
@@ -662,7 +676,6 @@ static VALUE _receive(int rflags, int argc, VALUE *argv, VALUE self)
|
|
662
676
|
struct posix_mq *mq = get(self, 1);
|
663
677
|
struct rw_args x;
|
664
678
|
VALUE buffer, timeout;
|
665
|
-
ssize_t r;
|
666
679
|
struct timespec expire;
|
667
680
|
|
668
681
|
if (mq->attr.mq_msgsize < 0) {
|
@@ -686,8 +699,8 @@ static VALUE _receive(int rflags, int argc, VALUE *argv, VALUE self)
|
|
686
699
|
x.des = mq->des;
|
687
700
|
|
688
701
|
retry:
|
689
|
-
|
690
|
-
if (
|
702
|
+
WITHOUT_GVL(xrecv, &x, RUBY_UBF_IO, 0);
|
703
|
+
if (x.received < 0) {
|
691
704
|
if (errno == EINTR)
|
692
705
|
goto retry;
|
693
706
|
if (errno == EAGAIN && (rflags & PMQ_TRY))
|
@@ -695,7 +708,7 @@ retry:
|
|
695
708
|
rb_sys_fail("mq_receive");
|
696
709
|
}
|
697
710
|
|
698
|
-
rb_str_set_len(buffer,
|
711
|
+
rb_str_set_len(buffer, x.received);
|
699
712
|
|
700
713
|
if (rflags & PMQ_WANTARRAY)
|
701
714
|
return rb_ary_new3(2, buffer, UINT2NUM(x.msg_prio));
|
data/pkg.mk
CHANGED
@@ -69,7 +69,7 @@ doc:: .document .wrongdoc.yml $(pkg_extra)
|
|
69
69
|
$(RM) -r doc
|
70
70
|
$(WRONGDOC) all
|
71
71
|
install -m644 COPYING doc/COPYING
|
72
|
-
install -m644 $(shell grep '^[A-Z]' .document) doc/
|
72
|
+
install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
|
73
73
|
|
74
74
|
ifneq ($(VERSION),)
|
75
75
|
pkggem := pkg/$(rfpackage)-$(VERSION).gem
|
@@ -167,5 +167,9 @@ doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
|
|
167
167
|
doc_gz:
|
168
168
|
for i in $(docs); do \
|
169
169
|
gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
|
170
|
+
check-warnings:
|
171
|
+
@(for i in $$(git ls-files '*.rb'| grep -v '^setup\.rb$$'); \
|
172
|
+
do $(RUBY) -d -W2 -c $$i; done) | grep -v '^Syntax OK$$' || :
|
170
173
|
|
171
174
|
.PHONY: all .FORCE-GIT-VERSION-FILE doc test $(test_units) manifest
|
175
|
+
.PHONY: check-warnings
|
metadata
CHANGED
@@ -1,47 +1,54 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
2
|
-
name:
|
3
|
-
|
4
|
-
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: !binary |-
|
3
|
+
cG9zaXhfbXE=
|
4
|
+
version: !ruby/object:Gem::Version
|
5
|
+
version: 2.1.0
|
5
6
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 2
|
8
|
-
- 0
|
9
|
-
- 0
|
10
|
-
version: 2.0.0
|
11
7
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
8
|
+
authors:
|
9
|
+
- !binary |-
|
10
|
+
UnVieSBQT1NJWCBNUSBoYWNrZXJz
|
14
11
|
autorequire:
|
15
12
|
bindir: bin
|
16
13
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
14
|
+
date: 2014-02-15 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: !binary |-
|
18
|
+
d3Jvbmdkb2M=
|
19
|
+
requirement: !ruby/object:Gem::Requirement
|
24
20
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
- 5
|
32
|
-
version: "1.5"
|
21
|
+
requirements:
|
22
|
+
- - !binary |-
|
23
|
+
fj4=
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: !binary |-
|
26
|
+
MS41
|
33
27
|
type: :development
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
prerelease: false
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - !binary |-
|
33
|
+
fj4=
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: !binary |-
|
36
|
+
MS41
|
37
|
+
description: ! 'POSIX message queues allow local processes to exchange data in the
|
38
|
+
form
|
39
|
+
|
37
40
|
of messages. This API is distinct from that provided by System V
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
-
|
44
|
-
|
41
|
+
|
42
|
+
message queues, but provides similar functionality.'
|
43
|
+
email: !binary |-
|
44
|
+
cnVieS5wb3NpeC5tcUBsaWJyZWxpc3QuY29t
|
45
|
+
executables:
|
46
|
+
- !binary |-
|
47
|
+
cG9zaXgtbXEtcmI=
|
48
|
+
extensions:
|
49
|
+
- !binary |-
|
50
|
+
ZXh0L3Bvc2l4X21xL2V4dGNvbmYucmI=
|
51
|
+
extra_rdoc_files:
|
45
52
|
- README
|
46
53
|
- LICENSE
|
47
54
|
- NEWS
|
@@ -49,7 +56,7 @@ extra_rdoc_files:
|
|
49
56
|
- lib/posix_mq.rb
|
50
57
|
- ext/posix_mq/posix_mq.c
|
51
58
|
- LATEST
|
52
|
-
files:
|
59
|
+
files:
|
53
60
|
- .document
|
54
61
|
- .gitignore
|
55
62
|
- .manifest
|
@@ -79,39 +86,32 @@ files:
|
|
79
86
|
- test/test_posix_mq.rb
|
80
87
|
homepage: http://bogomips.org/ruby_posix_mq/
|
81
88
|
licenses: []
|
82
|
-
|
83
89
|
post_install_message:
|
84
|
-
rdoc_options:
|
90
|
+
rdoc_options:
|
85
91
|
- -t
|
86
92
|
- posix_mq - POSIX Message Queues for Ruby
|
87
93
|
- -W
|
88
94
|
- http://bogomips.org/ruby_posix_mq.git/tree/%s
|
89
|
-
require_paths:
|
95
|
+
require_paths:
|
90
96
|
- lib
|
91
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
98
|
none: false
|
93
|
-
requirements:
|
94
|
-
- -
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
|
97
|
-
|
98
|
-
- 0
|
99
|
-
version: "0"
|
100
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
104
|
none: false
|
102
|
-
requirements:
|
103
|
-
- -
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
|
106
|
-
segments:
|
107
|
-
- 0
|
108
|
-
version: "0"
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
109
|
requirements: []
|
110
|
-
|
111
|
-
|
112
|
-
rubygems_version: 1.8.
|
110
|
+
rubyforge_project: !binary |-
|
111
|
+
cXJw
|
112
|
+
rubygems_version: 1.8.23
|
113
113
|
signing_key:
|
114
114
|
specification_version: 3
|
115
115
|
summary: POSIX Message Queues for Ruby
|
116
|
-
test_files:
|
116
|
+
test_files:
|
117
117
|
- test/test_posix_mq.rb
|