lwes 0.2.3 → 0.3.0
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/ChangeLog +7 -0
- data/ext/lwes/emitter.c +128 -56
- data/ext/lwes/extconf.rb +2 -0
- data/ext/lwes/lwes-0.22.3.diff +287 -0
- data/ext/lwes/type_db.c +9 -3
- data/lib/lwes/type_db.rb +10 -0
- data/lib/lwes.rb +2 -2
- data/lwes.gemspec +3 -1
- data/test/unit/test_emit_struct.rb +1 -1
- data/test/unit/test_emitter.rb +15 -1
- data/test/unit/test_struct.rb +1 -1
- data/test/unit/test_type_db.rb +1 -1
- metadata +4 -3
data/ChangeLog
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
Version 0.3.0 (erik-s-chang)
|
2
|
+
* attempt memory allocation failure handling by invoking Ruby GC
|
3
|
+
* corner-case fixes for copying TypeDB and Emitter objects
|
4
|
+
* for folks without LWES libraries separately installed:
|
5
|
+
- backport ESF error handling fix (r344)
|
6
|
+
- backport empty events in ESFs fix (inherited fields only) (r307)
|
7
|
+
|
1
8
|
Version 0.2.3 (erik-s-chang)
|
2
9
|
* hopefully fix installation/build problems under OSX
|
3
10
|
|
data/ext/lwes/emitter.c
CHANGED
@@ -7,6 +7,12 @@ static ID id_new;
|
|
7
7
|
/* the underlying struct for LWES::Emitter */
|
8
8
|
struct _rb_lwes_emitter {
|
9
9
|
struct lwes_emitter *emitter;
|
10
|
+
LWES_CONST_SHORT_STRING address;
|
11
|
+
LWES_CONST_SHORT_STRING iface;
|
12
|
+
LWES_U_INT_32 port;
|
13
|
+
LWES_BOOLEAN emit_heartbeat;
|
14
|
+
LWES_INT_16 freq;
|
15
|
+
LWES_U_INT_32 ttl;
|
10
16
|
};
|
11
17
|
|
12
18
|
/* gets the _rb_lwes_emitter struct pointer from self */
|
@@ -26,7 +32,26 @@ static void rle_free(void *ptr)
|
|
26
32
|
|
27
33
|
if (rle->emitter)
|
28
34
|
lwes_emitter_destroy(rle->emitter);
|
29
|
-
|
35
|
+
xfree(ptr);
|
36
|
+
}
|
37
|
+
|
38
|
+
static struct lwes_event *
|
39
|
+
lwesrb_event_create(struct lwes_event_type_db *db, VALUE name)
|
40
|
+
{
|
41
|
+
int gc_retry = 1;
|
42
|
+
const char *event_name = RSTRING_PTR(name);
|
43
|
+
struct lwes_event *event;
|
44
|
+
|
45
|
+
retry:
|
46
|
+
event = lwes_event_create(db, event_name);
|
47
|
+
if (!event) {
|
48
|
+
if (--gc_retry == 0) {
|
49
|
+
rb_gc();
|
50
|
+
goto retry;
|
51
|
+
}
|
52
|
+
rb_raise(rb_eRuntimeError, "failed to create lwes_event");
|
53
|
+
}
|
54
|
+
return event;
|
30
55
|
}
|
31
56
|
|
32
57
|
/* called by the GC when object is allocated */
|
@@ -49,18 +74,20 @@ static VALUE rle_alloc(VALUE klass)
|
|
49
74
|
static VALUE event_hash_iter_i(VALUE kv, VALUE memo)
|
50
75
|
{
|
51
76
|
VALUE *tmp;
|
52
|
-
VALUE
|
77
|
+
VALUE val;
|
53
78
|
struct lwes_event *event = (struct lwes_event *)memo;
|
54
79
|
LWES_CONST_SHORT_STRING name;
|
55
80
|
int rv = 0;
|
81
|
+
int gc_retry = 1;
|
56
82
|
|
57
83
|
assert(TYPE(kv) == T_ARRAY &&
|
58
84
|
"hash iteration not giving key-value pairs");
|
59
85
|
tmp = RARRAY_PTR(kv);
|
60
86
|
name = RSTRING_PTR(rb_obj_as_string(tmp[0]));
|
87
|
+
val = tmp[1];
|
61
88
|
|
62
|
-
|
63
|
-
switch (TYPE(
|
89
|
+
retry:
|
90
|
+
switch (TYPE(val)) {
|
64
91
|
case T_TRUE:
|
65
92
|
rv = lwes_event_set_BOOLEAN(event, name, TRUE);
|
66
93
|
break;
|
@@ -68,20 +95,26 @@ static VALUE event_hash_iter_i(VALUE kv, VALUE memo)
|
|
68
95
|
rv = lwes_event_set_BOOLEAN(event, name, FALSE);
|
69
96
|
break;
|
70
97
|
case T_ARRAY:
|
71
|
-
rv = lwesrb_event_set_numeric(event, name,
|
98
|
+
rv = lwesrb_event_set_numeric(event, name, val);
|
72
99
|
break;
|
73
100
|
case T_STRING:
|
74
|
-
rv = lwes_event_set_STRING(event, name, RSTRING_PTR(
|
101
|
+
rv = lwes_event_set_STRING(event, name, RSTRING_PTR(val));
|
75
102
|
break;
|
76
103
|
}
|
77
|
-
if (rv > 0)
|
104
|
+
if (rv > 0) {
|
78
105
|
return Qnil;
|
79
|
-
if (rv == 0)
|
106
|
+
} else if (rv == 0) {
|
80
107
|
rb_raise(rb_eArgError, "unhandled type %s=%s for event=%s",
|
81
|
-
name, RSTRING_PTR(rb_inspect(
|
82
|
-
|
83
|
-
|
84
|
-
|
108
|
+
name, RSTRING_PTR(rb_inspect(val)), event->eventName);
|
109
|
+
} else {
|
110
|
+
/* looking at the lwes source code, -3 is allocation errors */
|
111
|
+
if (rv == -3 && --gc_retry == 0) {
|
112
|
+
rb_gc();
|
113
|
+
goto retry;
|
114
|
+
}
|
115
|
+
rb_raise(rb_eRuntimeError, "failed to set %s=%s for event=%s",
|
116
|
+
name, RSTRING_PTR(rb_inspect(val)), event->eventName);
|
117
|
+
}
|
85
118
|
return Qfalse;
|
86
119
|
}
|
87
120
|
|
@@ -99,31 +132,50 @@ static VALUE _emit_hash(VALUE _tmp)
|
|
99
132
|
return _event;
|
100
133
|
}
|
101
134
|
|
102
|
-
static
|
135
|
+
static void
|
136
|
+
set_field(
|
103
137
|
struct lwes_event *event,
|
104
138
|
LWES_CONST_SHORT_STRING name,
|
105
139
|
LWES_TYPE type,
|
106
140
|
VALUE val)
|
107
141
|
{
|
142
|
+
int gc_retry = 1;
|
143
|
+
int rv;
|
144
|
+
|
145
|
+
retry:
|
108
146
|
switch (type) {
|
109
147
|
case LWES_TYPE_BOOLEAN:
|
110
148
|
if (val == Qfalse)
|
111
|
-
|
149
|
+
rv = lwes_event_set_BOOLEAN(event, name, FALSE);
|
112
150
|
else if (val == Qtrue)
|
113
|
-
|
151
|
+
rv = lwes_event_set_BOOLEAN(event, name, TRUE);
|
114
152
|
else
|
115
153
|
rb_raise(rb_eTypeError, "non-boolean set for %s: %s",
|
116
154
|
name, RSTRING_PTR(rb_inspect(val)));
|
155
|
+
break;
|
117
156
|
case LWES_TYPE_STRING:
|
118
157
|
if (TYPE(val) != T_STRING)
|
119
158
|
rb_raise(rb_eTypeError, "non-String set for %s: %s",
|
120
159
|
name, RSTRING_PTR(rb_inspect(val)));
|
121
|
-
|
160
|
+
rv = lwes_event_set_STRING(event, name, RSTRING_PTR(val));
|
161
|
+
break;
|
122
162
|
default:
|
123
|
-
|
163
|
+
rv = lwesrb_event_set_num(event, name, type, val);
|
124
164
|
}
|
165
|
+
if (rv > 0) {
|
166
|
+
return;
|
167
|
+
} else {
|
168
|
+
if (rv == -3 && --gc_retry == 0) {
|
169
|
+
rb_gc();
|
170
|
+
goto retry;
|
171
|
+
}
|
172
|
+
rb_raise(rb_eRuntimeError,
|
173
|
+
"failed to set %s=%s for event=%s (error: %d)",
|
174
|
+
name, RSTRING_PTR(rb_inspect(val)),
|
175
|
+
event->eventName, rv);
|
176
|
+
}
|
177
|
+
|
125
178
|
assert(0 && "you should never get here (set_field)");
|
126
|
-
return -1;
|
127
179
|
}
|
128
180
|
|
129
181
|
static VALUE _emit_struct(VALUE _argv)
|
@@ -144,7 +196,6 @@ static VALUE _emit_struct(VALUE _argv)
|
|
144
196
|
/* inner: [ :field_sym, "field_name", type ] */
|
145
197
|
VALUE *inner = RARRAY_PTR(*tmp);
|
146
198
|
VALUE val = rb_struct_aref(_event, inner[0]);
|
147
|
-
int rv;
|
148
199
|
LWES_CONST_SHORT_STRING name;
|
149
200
|
LWES_TYPE type;
|
150
201
|
|
@@ -153,14 +204,7 @@ static VALUE _emit_struct(VALUE _argv)
|
|
153
204
|
|
154
205
|
name = RSTRING_PTR(inner[1]);
|
155
206
|
type = NUM2INT(inner[2]);
|
156
|
-
|
157
|
-
if (rv > 0)
|
158
|
-
continue;
|
159
|
-
|
160
|
-
rb_raise(rb_eRuntimeError,
|
161
|
-
"failed to set %s=%s for event=%s (error: %d)",
|
162
|
-
name, RSTRING_PTR(rb_inspect(val)),
|
163
|
-
event->eventName, rv);
|
207
|
+
set_field(event, name, type, val);
|
164
208
|
}
|
165
209
|
|
166
210
|
if (lwes_emitter_emit(_rle(self)->emitter, event) < 0)
|
@@ -182,10 +226,7 @@ static VALUE _destroy_event(VALUE _event)
|
|
182
226
|
static VALUE emit_hash(VALUE self, VALUE name, VALUE _event)
|
183
227
|
{
|
184
228
|
VALUE tmp[3];
|
185
|
-
struct lwes_event *event =
|
186
|
-
|
187
|
-
if (!event)
|
188
|
-
rb_raise(rb_eRuntimeError, "failed to create lwes_event");
|
229
|
+
struct lwes_event *event = lwesrb_event_create(NULL, name);
|
189
230
|
|
190
231
|
tmp[0] = self;
|
191
232
|
tmp[1] = _event;
|
@@ -219,9 +260,7 @@ static VALUE emit_struct(VALUE self, VALUE _event)
|
|
219
260
|
"could not get class NAME or TYPE_LIST from: %s",
|
220
261
|
RSTRING_PTR(rb_inspect(_event)));
|
221
262
|
|
222
|
-
event =
|
223
|
-
if (!event)
|
224
|
-
rb_raise(rb_eRuntimeError, "failed to create lwes_event");
|
263
|
+
event = lwesrb_event_create(db, name);
|
225
264
|
|
226
265
|
argv[0] = self;
|
227
266
|
argv[1] = _event;
|
@@ -311,21 +350,61 @@ static VALUE emitter_emit(int argc, VALUE *argv, VALUE self)
|
|
311
350
|
*/
|
312
351
|
static VALUE emitter_close(VALUE self)
|
313
352
|
{
|
314
|
-
|
353
|
+
struct _rb_lwes_emitter *rle = _rle(self);
|
354
|
+
|
355
|
+
if (rle->emitter)
|
356
|
+
lwes_emitter_destroy(rle->emitter);
|
357
|
+
rle->emitter = NULL;
|
315
358
|
|
316
359
|
return Qnil;
|
317
360
|
}
|
318
361
|
|
362
|
+
static void lwesrb_emitter_create(struct _rb_lwes_emitter *rle)
|
363
|
+
{
|
364
|
+
int gc_retry = 1;
|
365
|
+
retry:
|
366
|
+
if (rle->ttl == UINT32_MAX)
|
367
|
+
rle->emitter = lwes_emitter_create(
|
368
|
+
rle->address, rle->iface, rle->port,
|
369
|
+
rle->emit_heartbeat, rle->freq);
|
370
|
+
else
|
371
|
+
rle->emitter = lwes_emitter_create_with_ttl(
|
372
|
+
rle->address, rle->iface, rle->port,
|
373
|
+
rle->emit_heartbeat, rle->freq, rle->ttl);
|
374
|
+
|
375
|
+
if (!rle->emitter) {
|
376
|
+
if (--gc_retry == 0) {
|
377
|
+
rb_gc();
|
378
|
+
goto retry;
|
379
|
+
}
|
380
|
+
rb_raise(rb_eRuntimeError, "failed to create LWES emitter");
|
381
|
+
}
|
382
|
+
}
|
383
|
+
|
384
|
+
/* :nodoc: */
|
385
|
+
static VALUE init_copy(VALUE dest, VALUE obj)
|
386
|
+
{
|
387
|
+
struct _rb_lwes_emitter *dst = _rle(dest);
|
388
|
+
struct _rb_lwes_emitter *src = _rle(obj);
|
389
|
+
|
390
|
+
memcpy(dst, src, sizeof(*dst));
|
391
|
+
lwesrb_emitter_create(dst);
|
392
|
+
|
393
|
+
assert(dst->emitter && dst->emitter != src->emitter &&
|
394
|
+
"emitter not a copy");
|
395
|
+
|
396
|
+
return dest;
|
397
|
+
}
|
398
|
+
|
319
399
|
/* should only used internally by #initialize */
|
320
400
|
static VALUE _create(VALUE self, VALUE options)
|
321
401
|
{
|
322
402
|
struct _rb_lwes_emitter *rle = _rle(self);
|
323
403
|
VALUE address, iface, port, heartbeat, ttl;
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
LWES_U_INT_32 _ttl = UINT32_MAX; /* nobody sets a ttl this long, right? */
|
404
|
+
|
405
|
+
rle->emit_heartbeat = FALSE;
|
406
|
+
rle->freq = 0;
|
407
|
+
rle->ttl = UINT32_MAX; /* nobody sets a ttl this long, right? */
|
329
408
|
|
330
409
|
if (rle->emitter)
|
331
410
|
rb_raise(rb_eRuntimeError, "already created lwes_emitter");
|
@@ -335,15 +414,15 @@ static VALUE _create(VALUE self, VALUE options)
|
|
335
414
|
address = rb_hash_aref(options, ID2SYM(rb_intern("address")));
|
336
415
|
if (TYPE(address) != T_STRING)
|
337
416
|
rb_raise(rb_eTypeError, ":address must be a string");
|
338
|
-
|
417
|
+
rle->address = RSTRING_PTR(address);
|
339
418
|
|
340
419
|
iface = rb_hash_aref(options, ID2SYM(rb_intern("iface")));
|
341
420
|
switch (TYPE(iface)) {
|
342
421
|
case T_NIL:
|
343
|
-
|
422
|
+
rle->iface = NULL;
|
344
423
|
break;
|
345
424
|
case T_STRING:
|
346
|
-
|
425
|
+
rle->iface = RSTRING_PTR(iface);
|
347
426
|
break;
|
348
427
|
default:
|
349
428
|
rb_raise(rb_eTypeError, ":iface must be a String or nil");
|
@@ -352,15 +431,15 @@ static VALUE _create(VALUE self, VALUE options)
|
|
352
431
|
port = rb_hash_aref(options, ID2SYM(rb_intern("port")));
|
353
432
|
if (TYPE(port) != T_FIXNUM)
|
354
433
|
rb_raise(rb_eTypeError, ":port must be a Fixnum");
|
355
|
-
|
434
|
+
rle->port = NUM2UINT(port);
|
356
435
|
|
357
436
|
heartbeat = rb_hash_aref(options, ID2SYM(rb_intern("heartbeat")));
|
358
437
|
if (TYPE(heartbeat) == T_FIXNUM) {
|
359
438
|
int tmp = NUM2INT(heartbeat);
|
360
439
|
if (tmp > INT16_MAX)
|
361
440
|
rb_raise(rb_eArgError,":heartbeat > INT16_MAX seconds");
|
362
|
-
|
363
|
-
|
441
|
+
rle->emit_heartbeat = TRUE;
|
442
|
+
rle->freq = (LWES_INT_16)tmp;
|
364
443
|
} else if (NIL_P(heartbeat)) { /* do nothing, use defaults */
|
365
444
|
} else
|
366
445
|
rb_raise(rb_eTypeError, ":heartbeat must be a Fixnum or nil");
|
@@ -370,20 +449,12 @@ static VALUE _create(VALUE self, VALUE options)
|
|
370
449
|
unsigned LONG_LONG tmp = NUM2ULL(ttl);
|
371
450
|
if (tmp >= UINT32_MAX)
|
372
451
|
rb_raise(rb_eArgError, ":ttl >= UINT32_MAX seconds");
|
373
|
-
|
452
|
+
rle->ttl = (LWES_U_INT_32)tmp;
|
374
453
|
} else if (NIL_P(ttl)) { /* do nothing, no ttl */
|
375
454
|
} else
|
376
455
|
rb_raise(rb_eTypeError, ":ttl must be a Fixnum or nil");
|
377
456
|
|
378
|
-
|
379
|
-
rle->emitter = lwes_emitter_create(
|
380
|
-
_address, _iface, _port, _emit_heartbeat, _freq);
|
381
|
-
else
|
382
|
-
rle->emitter = lwes_emitter_create_with_ttl(
|
383
|
-
_address, _iface, _port, _emit_heartbeat, _freq, _ttl);
|
384
|
-
|
385
|
-
if (!rle->emitter)
|
386
|
-
rb_raise(rb_eRuntimeError, "failed to create LWES emitter");
|
457
|
+
lwesrb_emitter_create(rle);
|
387
458
|
|
388
459
|
return self;
|
389
460
|
}
|
@@ -398,6 +469,7 @@ void lwesrb_init_emitter(void)
|
|
398
469
|
rb_define_method(cLWES_Emitter, "emit", emitter_emit, -1);
|
399
470
|
rb_define_method(cLWES_Emitter, "_create", _create, 1);
|
400
471
|
rb_define_method(cLWES_Emitter, "close", emitter_close, 0);
|
472
|
+
rb_define_method(cLWES_Emitter, "initialize_copy", init_copy, 1);
|
401
473
|
rb_define_alloc_func(cLWES_Emitter, rle_alloc);
|
402
474
|
LWESRB_MKID(TYPE_DB);
|
403
475
|
LWESRB_MKID(TYPE_LIST);
|
data/ext/lwes/extconf.rb
CHANGED
@@ -6,6 +6,7 @@ dir_config('lwes')
|
|
6
6
|
pwd = File.expand_path(File.dirname(__FILE__))
|
7
7
|
v = '0.22.3'
|
8
8
|
dir = "lwes-#{v}"
|
9
|
+
diff = "#{pwd}/#{dir}.diff"
|
9
10
|
inst = "#{pwd}/.inst"
|
10
11
|
tgz = "#{dir}.tar.gz"
|
11
12
|
url = "http://sourceforge.net/projects/lwes/files/lwes-c/#{v}/#{tgz}/download"
|
@@ -37,6 +38,7 @@ unless have_library('lwes') && have_header('lwes.h')
|
|
37
38
|
FileUtils.rm_rf(dir)
|
38
39
|
system('tar', 'zxf', tgz) or abort "tar failed with #{$?}"
|
39
40
|
Dir.chdir(dir) do
|
41
|
+
system("patch", "-p1", "-i", diff) or abort "patch failed: #{$?}"
|
40
42
|
args = %w(--disable-shared
|
41
43
|
--disable-hardcore
|
42
44
|
--with-pic
|
@@ -0,0 +1,287 @@
|
|
1
|
+
backport of several things from lwes trunk
|
2
|
+
|
3
|
+
* ESF error handling (r344)
|
4
|
+
* empty events in ESFs (inherited fields only) (r307)
|
5
|
+
|
6
|
+
https://lwes.svn.sourceforge.net/svnroot/lwes/lwes/trunk
|
7
|
+
|
8
|
+
diff -rup a/src/lwes_esf_parser_y.y b/src/lwes_esf_parser_y.y
|
9
|
+
--- a/src/lwes_esf_parser_y.y
|
10
|
+
+++ b/src/lwes_esf_parser_y.y
|
11
|
+
@@ -63,8 +63,10 @@ eventname: EVENTWORD {
|
12
|
+
|
13
|
+
;
|
14
|
+
|
15
|
+
-attributelist: attribute
|
16
|
+
- | attributelist attribute
|
17
|
+
+attributelist:
|
18
|
+
+ /* empty */
|
19
|
+
+ | attribute
|
20
|
+
+ | attributelist attribute
|
21
|
+
;
|
22
|
+
|
23
|
+
attribute: type attributename ';'
|
24
|
+
@@ -221,6 +223,7 @@ lwes_parse_esf
|
25
|
+
else
|
26
|
+
{
|
27
|
+
fprintf (stderr,"ERROR: No such file : \"%s\"\n",filename);
|
28
|
+
+ state.errors++;
|
29
|
+
}
|
30
|
+
|
31
|
+
if (state.errors)
|
32
|
+
diff -rup a/src/lwes_event_type_db.c b/src/lwes_event_type_db.c
|
33
|
+
--- a/src/lwes_event_type_db.c
|
34
|
+
+++ b/src/lwes_event_type_db.c
|
35
|
+
@@ -36,7 +36,11 @@ lwes_event_type_db_create
|
36
|
+
db->events = lwes_hash_create ();
|
37
|
+
if (db->events != NULL)
|
38
|
+
{
|
39
|
+
- lwes_parse_esf (db, db->esf_filename);
|
40
|
+
+ if (lwes_parse_esf (db, db->esf_filename) != 0)
|
41
|
+
+ {
|
42
|
+
+ free (db);
|
43
|
+
+ db = NULL;
|
44
|
+
+ }
|
45
|
+
}
|
46
|
+
else
|
47
|
+
{
|
48
|
+
diff -rup a/src/lwes_esf_parser_y.c b/src/lwes_esf_parser_y.c
|
49
|
+
--- a/src/lwes_esf_parser_y.c
|
50
|
+
+++ b/src/lwes_esf_parser_y.c
|
51
|
+
@@ -387,7 +387,7 @@ union yyalloc
|
52
|
+
/* YYNNTS -- Number of nonterminals. */
|
53
|
+
#define YYNNTS 8
|
54
|
+
/* YYNRULES -- Number of rules. */
|
55
|
+
-#define YYNRULES 23
|
56
|
+
+#define YYNRULES 24
|
57
|
+
/* YYNRULES -- Number of states. */
|
58
|
+
#define YYNSTATES 32
|
59
|
+
|
60
|
+
@@ -435,9 +435,9 @@ static const yytype_uint8 yytranslate[] =
|
61
|
+
YYRHS. */
|
62
|
+
static const yytype_uint8 yyprhs[] =
|
63
|
+
{
|
64
|
+
- 0, 0, 3, 5, 8, 13, 16, 19, 21, 23,
|
65
|
+
- 26, 30, 35, 40, 42, 44, 46, 48, 50, 52,
|
66
|
+
- 54, 56, 58, 60
|
67
|
+
+ 0, 0, 3, 5, 8, 13, 16, 19, 21, 22,
|
68
|
+
+ 24, 27, 31, 36, 41, 43, 45, 47, 49, 51,
|
69
|
+
+ 53, 55, 57, 59, 61
|
70
|
+
};
|
71
|
+
|
72
|
+
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
|
73
|
+
@@ -445,19 +445,19 @@ static const yytype_int8 yyrhs[] =
|
74
|
+
{
|
75
|
+
18, 0, -1, 19, -1, 18, 19, -1, 20, 14,
|
76
|
+
21, 15, -1, 1, 16, -1, 1, 15, -1, 12,
|
77
|
+
- -1, 22, -1, 21, 22, -1, 24, 23, 16, -1,
|
78
|
+
- 24, 23, 1, 16, -1, 24, 23, 1, 15, -1,
|
79
|
+
- 13, -1, 3, -1, 4, -1, 5, -1, 6, -1,
|
80
|
+
- 10, -1, 11, -1, 7, -1, 8, -1, 9, -1,
|
81
|
+
- 13, -1
|
82
|
+
+ -1, -1, 22, -1, 21, 22, -1, 24, 23, 16,
|
83
|
+
+ -1, 24, 23, 1, 16, -1, 24, 23, 1, 15,
|
84
|
+
+ -1, 13, -1, 3, -1, 4, -1, 5, -1, 6,
|
85
|
+
+ -1, 10, -1, 11, -1, 7, -1, 8, -1, 9,
|
86
|
+
+ -1, 13, -1
|
87
|
+
};
|
88
|
+
|
89
|
+
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
90
|
+
static const yytype_uint8 yyrline[] =
|
91
|
+
{
|
92
|
+
- 0, 35, 35, 36, 39, 47, 48, 51, 66, 67,
|
93
|
+
- 70, 71, 72, 75, 93, 104, 115, 125, 135, 145,
|
94
|
+
- 155, 165, 175, 185
|
95
|
+
+ 0, 35, 35, 36, 39, 47, 48, 51, 66, 68,
|
96
|
+
+ 69, 72, 73, 74, 77, 95, 106, 117, 127, 137,
|
97
|
+
+ 147, 157, 167, 177, 187
|
98
|
+
};
|
99
|
+
#endif
|
100
|
+
|
101
|
+
@@ -488,16 +488,16 @@ static const yytype_uint16 yytoknum[] =
|
102
|
+
static const yytype_uint8 yyr1[] =
|
103
|
+
{
|
104
|
+
0, 17, 18, 18, 19, 19, 19, 20, 21, 21,
|
105
|
+
- 22, 22, 22, 23, 24, 24, 24, 24, 24, 24,
|
106
|
+
- 24, 24, 24, 24
|
107
|
+
+ 21, 22, 22, 22, 23, 24, 24, 24, 24, 24,
|
108
|
+
+ 24, 24, 24, 24, 24
|
109
|
+
};
|
110
|
+
|
111
|
+
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
|
112
|
+
static const yytype_uint8 yyr2[] =
|
113
|
+
{
|
114
|
+
- 0, 2, 1, 2, 4, 2, 2, 1, 1, 2,
|
115
|
+
- 3, 4, 4, 1, 1, 1, 1, 1, 1, 1,
|
116
|
+
- 1, 1, 1, 1
|
117
|
+
+ 0, 2, 1, 2, 4, 2, 2, 1, 0, 1,
|
118
|
+
+ 2, 3, 4, 4, 1, 1, 1, 1, 1, 1,
|
119
|
+
+ 1, 1, 1, 1, 1
|
120
|
+
};
|
121
|
+
|
122
|
+
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
|
123
|
+
@@ -506,9 +506,9 @@ static const yytype_uint8 yyr2[] =
|
124
|
+
static const yytype_uint8 yydefact[] =
|
125
|
+
{
|
126
|
+
0, 0, 7, 0, 2, 0, 6, 5, 1, 3,
|
127
|
+
- 0, 14, 15, 16, 17, 20, 21, 22, 18, 19,
|
128
|
+
- 23, 0, 8, 0, 4, 9, 13, 0, 0, 10,
|
129
|
+
- 12, 11
|
130
|
+
+ 8, 15, 16, 17, 18, 21, 22, 23, 19, 20,
|
131
|
+
+ 24, 0, 9, 0, 4, 10, 14, 0, 0, 11,
|
132
|
+
+ 13, 12
|
133
|
+
};
|
134
|
+
|
135
|
+
/* YYDEFGOTO[NTERM-NUM]. */
|
136
|
+
@@ -1414,18 +1414,18 @@ yyreduce:
|
137
|
+
}
|
138
|
+
break;
|
139
|
+
|
140
|
+
- case 11:
|
141
|
+
-#line 71 "lwes_esf_parser_y.y"
|
142
|
+
+ case 12:
|
143
|
+
+#line 73 "lwes_esf_parser_y.y"
|
144
|
+
{ lweserror("Did you forget a ';'?"); }
|
145
|
+
break;
|
146
|
+
|
147
|
+
- case 12:
|
148
|
+
-#line 72 "lwes_esf_parser_y.y"
|
149
|
+
+ case 13:
|
150
|
+
+#line 74 "lwes_esf_parser_y.y"
|
151
|
+
{ lweserror("Did you forget a semi-colon?"); }
|
152
|
+
break;
|
153
|
+
|
154
|
+
- case 13:
|
155
|
+
-#line 75 "lwes_esf_parser_y.y"
|
156
|
+
+ case 14:
|
157
|
+
+#line 77 "lwes_esf_parser_y.y"
|
158
|
+
{
|
159
|
+
if (((struct lwes_parser_state *) param)->lastType != NULL)
|
160
|
+
{
|
161
|
+
@@ -1444,8 +1444,8 @@ yyreduce:
|
162
|
+
}
|
163
|
+
break;
|
164
|
+
|
165
|
+
- case 14:
|
166
|
+
-#line 93 "lwes_esf_parser_y.y"
|
167
|
+
+ case 15:
|
168
|
+
+#line 95 "lwes_esf_parser_y.y"
|
169
|
+
{
|
170
|
+
/* allocate a string, and copy the type value into it */
|
171
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
172
|
+
@@ -1459,8 +1459,8 @@ yyreduce:
|
173
|
+
}
|
174
|
+
break;
|
175
|
+
|
176
|
+
- case 15:
|
177
|
+
-#line 104 "lwes_esf_parser_y.y"
|
178
|
+
+ case 16:
|
179
|
+
+#line 106 "lwes_esf_parser_y.y"
|
180
|
+
{
|
181
|
+
/* allocate a string, and copy the type value into it */
|
182
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
183
|
+
@@ -1474,8 +1474,8 @@ yyreduce:
|
184
|
+
}
|
185
|
+
break;
|
186
|
+
|
187
|
+
- case 16:
|
188
|
+
-#line 115 "lwes_esf_parser_y.y"
|
189
|
+
+ case 17:
|
190
|
+
+#line 117 "lwes_esf_parser_y.y"
|
191
|
+
{
|
192
|
+
/* allocate a string, and copy the type value into it */
|
193
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
194
|
+
@@ -1488,8 +1488,8 @@ yyreduce:
|
195
|
+
}
|
196
|
+
break;
|
197
|
+
|
198
|
+
- case 17:
|
199
|
+
-#line 125 "lwes_esf_parser_y.y"
|
200
|
+
+ case 18:
|
201
|
+
+#line 127 "lwes_esf_parser_y.y"
|
202
|
+
{
|
203
|
+
/* allocate a string, and copy the type value into it */
|
204
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
205
|
+
@@ -1502,8 +1502,8 @@ yyreduce:
|
206
|
+
}
|
207
|
+
break;
|
208
|
+
|
209
|
+
- case 18:
|
210
|
+
-#line 135 "lwes_esf_parser_y.y"
|
211
|
+
+ case 19:
|
212
|
+
+#line 137 "lwes_esf_parser_y.y"
|
213
|
+
{
|
214
|
+
/* allocate a string, and copy the type value into it */
|
215
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
216
|
+
@@ -1516,8 +1516,8 @@ yyreduce:
|
217
|
+
}
|
218
|
+
break;
|
219
|
+
|
220
|
+
- case 19:
|
221
|
+
-#line 145 "lwes_esf_parser_y.y"
|
222
|
+
+ case 20:
|
223
|
+
+#line 147 "lwes_esf_parser_y.y"
|
224
|
+
{
|
225
|
+
/* allocate a string, and copy the type value into it */
|
226
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
227
|
+
@@ -1530,8 +1530,8 @@ yyreduce:
|
228
|
+
}
|
229
|
+
break;
|
230
|
+
|
231
|
+
- case 20:
|
232
|
+
-#line 155 "lwes_esf_parser_y.y"
|
233
|
+
+ case 21:
|
234
|
+
+#line 157 "lwes_esf_parser_y.y"
|
235
|
+
{
|
236
|
+
/* allocate a string, and copy the type value into it */
|
237
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
238
|
+
@@ -1544,8 +1544,8 @@ yyreduce:
|
239
|
+
}
|
240
|
+
break;
|
241
|
+
|
242
|
+
- case 21:
|
243
|
+
-#line 165 "lwes_esf_parser_y.y"
|
244
|
+
+ case 22:
|
245
|
+
+#line 167 "lwes_esf_parser_y.y"
|
246
|
+
{
|
247
|
+
/* allocate a string, and copy the type value into it */
|
248
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
249
|
+
@@ -1558,8 +1558,8 @@ yyreduce:
|
250
|
+
}
|
251
|
+
break;
|
252
|
+
|
253
|
+
- case 22:
|
254
|
+
-#line 175 "lwes_esf_parser_y.y"
|
255
|
+
+ case 23:
|
256
|
+
+#line 177 "lwes_esf_parser_y.y"
|
257
|
+
{
|
258
|
+
/* allocate a string, and copy the type value into it */
|
259
|
+
((struct lwes_parser_state *) param)->lastType = strdup(lweslval);
|
260
|
+
@@ -1572,8 +1572,8 @@ yyreduce:
|
261
|
+
}
|
262
|
+
break;
|
263
|
+
|
264
|
+
- case 23:
|
265
|
+
-#line 185 "lwes_esf_parser_y.y"
|
266
|
+
+ case 24:
|
267
|
+
+#line 187 "lwes_esf_parser_y.y"
|
268
|
+
{ char buffer[256];
|
269
|
+
sprintf(buffer,"unknown type '%s'",lweslval);
|
270
|
+
lweserror(buffer);
|
271
|
+
@@ -1797,7 +1797,7 @@ yyreturn:
|
272
|
+
}
|
273
|
+
|
274
|
+
|
275
|
+
-#line 192 "lwes_esf_parser_y.y"
|
276
|
+
+#line 194 "lwes_esf_parser_y.y"
|
277
|
+
|
278
|
+
|
279
|
+
extern FILE *lwesin;
|
280
|
+
@@ -1830,6 +1830,7 @@ lwes_parse_esf
|
281
|
+
else
|
282
|
+
{
|
283
|
+
fprintf (stderr,"ERROR: No such file : \"%s\"\n",filename);
|
284
|
+
+ state.errors++;
|
285
|
+
}
|
286
|
+
|
287
|
+
if (state.errors)
|
data/ext/lwes/type_db.c
CHANGED
@@ -12,7 +12,7 @@ static void tdb_free(void *ptr)
|
|
12
12
|
|
13
13
|
if (tdb->db)
|
14
14
|
lwes_event_type_db_destroy(tdb->db);
|
15
|
-
|
15
|
+
xfree(ptr);
|
16
16
|
}
|
17
17
|
|
18
18
|
static VALUE tdb_alloc(VALUE klass)
|
@@ -25,6 +25,7 @@ static VALUE tdb_alloc(VALUE klass)
|
|
25
25
|
static VALUE tdb_init(VALUE self, VALUE path)
|
26
26
|
{
|
27
27
|
struct _tdb *tdb;
|
28
|
+
int gc_retry = 1;
|
28
29
|
|
29
30
|
if (TYPE(path) != T_STRING)
|
30
31
|
rb_raise(rb_eArgError, "path must be a string");
|
@@ -32,12 +33,17 @@ static VALUE tdb_init(VALUE self, VALUE path)
|
|
32
33
|
Data_Get_Struct(self, struct _tdb, tdb);
|
33
34
|
if (tdb->db)
|
34
35
|
rb_raise(rb_eRuntimeError, "ESF already initialized");
|
35
|
-
|
36
|
+
retry:
|
36
37
|
tdb->db = lwes_event_type_db_create(RSTRING_PTR(path));
|
37
|
-
if (!tdb->db)
|
38
|
+
if (!tdb->db) {
|
39
|
+
if (--gc_retry == 0) {
|
40
|
+
rb_gc();
|
41
|
+
goto retry;
|
42
|
+
}
|
38
43
|
rb_raise(rb_eRuntimeError,
|
39
44
|
"failed to create type DB for LWES file %s",
|
40
45
|
RSTRING_PTR(path));
|
46
|
+
}
|
41
47
|
|
42
48
|
return Qnil;
|
43
49
|
}
|
data/lib/lwes/type_db.rb
CHANGED
data/lib/lwes.rb
CHANGED
data/lwes.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{lwes}
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.3.0"
|
4
4
|
s.date = Time.now
|
5
5
|
s.authors = ["Erik S. Chang", "Frank Maritato"]
|
6
6
|
s.email = %q{lwes-devel@lists.sourceforge.net}
|
@@ -23,6 +23,7 @@ examples/demo.rb
|
|
23
23
|
examples/my_events.esf
|
24
24
|
ext/lwes/emitter.c
|
25
25
|
ext/lwes/extconf.rb
|
26
|
+
ext/lwes/lwes-0.22.3.diff
|
26
27
|
ext/lwes/lwes.c
|
27
28
|
ext/lwes/lwes_ruby.h
|
28
29
|
ext/lwes/numeric.c
|
@@ -42,5 +43,6 @@ test/unit/test_emitter.rb
|
|
42
43
|
test/unit/test_struct.rb
|
43
44
|
test/unit/test_type_db.rb
|
44
45
|
)
|
46
|
+
s.rubyforge_project = 'lwes'
|
45
47
|
s.test_files = s.files.grep(%r{\Atest/unit/test_})
|
46
48
|
end
|
data/test/unit/test_emitter.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/../test_helper"
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/../test_helper"
|
2
2
|
require 'ipaddr'
|
3
3
|
|
4
4
|
class TestEmitter < Test::Unit::TestCase
|
@@ -20,6 +20,20 @@ class TestEmitter < Test::Unit::TestCase
|
|
20
20
|
assert_instance_of LWES::Emitter, LWES::Emitter.new(@options)
|
21
21
|
end
|
22
22
|
|
23
|
+
def test_dup
|
24
|
+
orig = LWES::Emitter.new(@options)
|
25
|
+
duped = orig.dup
|
26
|
+
assert_instance_of LWES::Emitter, duped
|
27
|
+
assert duped.object_id != orig.object_id
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_clone
|
31
|
+
orig = LWES::Emitter.new(@options)
|
32
|
+
cloned = orig.clone
|
33
|
+
assert_instance_of LWES::Emitter, cloned
|
34
|
+
assert cloned.object_id != orig.object_id
|
35
|
+
end
|
36
|
+
|
23
37
|
def test_initialize_with_heartbeat
|
24
38
|
heartbeat = @options.merge(:heartbeat => 30)
|
25
39
|
assert_instance_of LWES::Emitter, LWES::Emitter.new(heartbeat)
|
data/test/unit/test_struct.rb
CHANGED
data/test/unit/test_type_db.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lwes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik S. Chang
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2010-
|
13
|
+
date: 2010-04-15 00:00:00 +00:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- examples/my_events.esf
|
37
37
|
- ext/lwes/emitter.c
|
38
38
|
- ext/lwes/extconf.rb
|
39
|
+
- ext/lwes/lwes-0.22.3.diff
|
39
40
|
- ext/lwes/lwes.c
|
40
41
|
- ext/lwes/lwes_ruby.h
|
41
42
|
- ext/lwes/numeric.c
|
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
78
|
version:
|
78
79
|
requirements: []
|
79
80
|
|
80
|
-
rubyforge_project:
|
81
|
+
rubyforge_project: lwes
|
81
82
|
rubygems_version: 1.3.5
|
82
83
|
signing_key:
|
83
84
|
specification_version: 3
|