fairy 0.6.0 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Makefile +1 -0
- data/bin/fairy +35 -5
- data/ext/extconf.rb +3 -0
- data/ext/fairy.c +180 -0
- data/ext/fairy.h +94 -0
- data/ext/fiber_mon.h +32 -0
- data/ext/fixnum-buffer.c +483 -0
- data/ext/p-group-by.c +529 -0
- data/ext/p-xgroup-by.c +467 -0
- data/ext/simple-hash.c +44 -0
- data/ext/string-buffer.c +286 -0
- data/ext/xmarshaled-queue.c +699 -0
- data/ext/xsized-queue.c +528 -0
- data/ext/xthread.h +65 -0
- data/fairy.gemspec +5 -2
- data/lib/fairy.rb +10 -1
- data/lib/fairy/client/group-by.rb +57 -2
- data/lib/fairy/client/here.rb +2 -1
- data/lib/fairy/controller.rb +25 -4
- data/lib/fairy/master.rb +17 -3
- data/lib/fairy/master/c-basic-group-by.rb +4 -2
- data/lib/fairy/master/c-cat.rb +3 -2
- data/lib/fairy/master/c-direct-product.rb +5 -3
- data/lib/fairy/master/c-filter.rb +5 -3
- data/lib/fairy/master/c-group-by.rb +13 -0
- data/lib/fairy/master/c-junction.rb +3 -2
- data/lib/fairy/master/c-seg-join.rb +3 -1
- data/lib/fairy/master/c-seg-shuffle.rb +3 -2
- data/lib/fairy/master/c-seg-split.rb +1 -1
- data/lib/fairy/master/c-seg-zip.rb +3 -1
- data/lib/fairy/master/c-sort.rb +7 -2
- data/lib/fairy/master/c-wc.rb +5 -3
- data/lib/fairy/node.rb +13 -2
- data/lib/fairy/node/p-barrier.rb +1 -1
- data/lib/fairy/node/p-basic-group-by.rb +22 -12
- data/lib/fairy/node/p-direct-product.rb +4 -2
- data/lib/fairy/node/p-filter.rb +8 -7
- data/lib/fairy/node/p-find.rb +2 -1
- data/lib/fairy/node/p-group-by.rb +17 -6
- data/lib/fairy/node/p-inject.rb +3 -2
- data/lib/fairy/node/p-output-file.rb +1 -1
- data/lib/fairy/node/p-seg-join.rb +2 -1
- data/lib/fairy/node/p-seg-zip.rb +2 -1
- data/lib/fairy/node/p-single-exportable.rb +3 -1
- data/lib/fairy/node/p-sort.rb +4 -2
- data/lib/fairy/node/p-task.rb +1 -1
- data/lib/fairy/node/p-wc.rb +5 -2
- data/lib/fairy/processor.rb +25 -18
- data/lib/fairy/share/block-source.rb +12 -2
- data/lib/fairy/share/conf.rb +35 -5
- data/lib/fairy/share/hash-simple-hash.rb +1 -1
- data/lib/fairy/share/log.rb +11 -4
- data/lib/fairy/share/pool-dictionary.rb +2 -1
- data/lib/fairy/share/port-marshaled-queue.rb +8 -1
- data/lib/fairy/share/port.rb +55 -45
- data/lib/fairy/share/reference.rb +2 -1
- data/lib/fairy/share/varray.rb +3 -1
- data/lib/fairy/share/vfile.rb +4 -2
- data/lib/fairy/version.rb +1 -1
- data/sample/sort.rb +69 -3
- data/spec/fairy8_spec.rb +1 -1
- data/test/testc.rb +380 -2
- data/tools/cap_recipe/Capfile +3 -3
- data/tools/fairy_conf_wizard.rb +375 -0
- data/tools/fairy_perf_graph.rb +15 -3
- data/tools/git-tag +1 -0
- data/tools/log-analysis.rb +59 -11
- metadata +33 -34
- data/ext/simple_hash/extconf.rb +0 -4
- data/ext/simple_hash/simple_hash.c +0 -42
data/Makefile
CHANGED
data/bin/fairy
CHANGED
@@ -120,6 +120,16 @@ module Fairy
|
|
120
120
|
def_prop :MARSHAL_QUEUE_MIN_CHUNK_NO
|
121
121
|
def_prop :SIZEDMARSHAL_QUEUE_MAX_CHUNK_NO
|
122
122
|
|
123
|
+
def_prop :XMARSHAL_QUEUE_CHUNK_SIZE
|
124
|
+
def_prop :XMARSHAL_QUEUE_MIN_CHUNK_NO
|
125
|
+
def_prop :XMARSHAL_QUEUE_BUFFERS_CACHE_LIMIT
|
126
|
+
def_prop :XMARSHAL_QUEUE_USE_STRING_BUFFER
|
127
|
+
def_prop :XMARSHAL_QUEUE_LOG_MSTORE
|
128
|
+
|
129
|
+
def_prop :XSIZED_QUEUE_CHUNK_SIZE
|
130
|
+
def_prop :XSIZED_QUEUE_QUEUES_LIMIT
|
131
|
+
def_prop :XSIZED_QUEUE_USE_STRING_BUFFER
|
132
|
+
|
123
133
|
def_prop :SORTEDQUEUE_POOL_THRESHOLD
|
124
134
|
def_prop :SORTEDQUEUE_THRESHOLD
|
125
135
|
def_prop :SORTEDQUEUE_SORTBY
|
@@ -128,6 +138,7 @@ module Fairy
|
|
128
138
|
def_prop :HERE_POOL_THRESHOLD
|
129
139
|
#def_prop :OUTPUT_LOCAL_POOL_THRESHOLD
|
130
140
|
|
141
|
+
def_prop :GROUP_BY
|
131
142
|
def_prop :GROUP_BY_NO_SEGMENT
|
132
143
|
def_prop :GROUP_BY_HASH_MODULE
|
133
144
|
def_prop :GROUP_BY_GROUPING_OPTIMIZE
|
@@ -136,6 +147,8 @@ module Fairy
|
|
136
147
|
def_prop :GROUP_BY_CMSB_THRESHOLD
|
137
148
|
def_prop :GROUP_BY_CMSB_CHUNK_SIZE
|
138
149
|
|
150
|
+
def_prop :XGROUP_BY_BUFFERING_POLICY
|
151
|
+
|
139
152
|
def_prop :BARRIER_MEMORY_BUFFERING_POLICY
|
140
153
|
|
141
154
|
def_prop :SORT_BUFFERING_POLICY
|
@@ -297,19 +310,32 @@ module Fairy
|
|
297
310
|
|
298
311
|
DEFAULT_CONF.POSTMAPPING_POLICY = nil
|
299
312
|
|
300
|
-
DEFAULT_CONF.PREQUEUING_POLICY = {:queuing_class => :
|
301
|
-
DEFAULT_CONF.POSTQUEUING_POLICY = {:queuing_class => :
|
313
|
+
DEFAULT_CONF.PREQUEUING_POLICY = {:queuing_class => :XSizedQueue}
|
314
|
+
DEFAULT_CONF.POSTQUEUING_POLICY = {:queuing_class => :XMarshaledQueue}
|
302
315
|
|
303
316
|
DEFAULT_CONF.POSTQUEUE_MAX_TRANSFER_SIZE = 100000
|
304
|
-
DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD =
|
317
|
+
DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD = 100000
|
305
318
|
DEFAULT_CONF.ONMEMORY_SIZEDQUEUE_SIZE = 10000
|
306
319
|
DEFAULT_CONF.FILEBUFFEREDQUEUE_THRESHOLD = 10000/2
|
307
320
|
|
308
321
|
DEFAULT_CONF.MARSHAL_QUEUE_CHUNK_SIZE = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
|
309
322
|
DEFAULT_CONF.MARSHAL_QUEUE_MIN_CHUNK_NO = DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
|
310
323
|
DEFAULT_CONF.SIZEDMARSHAL_QUEUE_MAX_CHUNK_NO = 10
|
324
|
+
|
325
|
+
DEFAULT_CONF.XMARSHAL_QUEUE_CHUNK_SIZE = DEFAULT_CONF.MARSHAL_QUEUE_CHUNK_SIZE
|
326
|
+
DEFAULT_CONF.XMARSHAL_QUEUE_MIN_CHUNK_NO = DEFAULT_CONF.MARSHAL_QUEUE_MIN_CHUNK_NO
|
327
|
+
DEFAULT_CONF.XMARSHAL_QUEUE_BUFFERS_CACHE_LIMIT = 1000
|
328
|
+
DEFAULT_CONF.XMARSHAL_QUEUE_USE_STRING_BUFFER = true
|
329
|
+
DEFAULT_CONF.XMARSHAL_QUEUE_LOG_MSTORE = false
|
330
|
+
|
331
|
+
DEFAULT_CONF.XSIZED_QUEUE_CHUNK_SIZE = DEFAULT_CONF.XMARSHAL_QUEUE_CHUNK_SIZE
|
332
|
+
DEFAULT_CONF.XSIZED_QUEUE_QUEUES_LIMIT =
|
333
|
+
DEFAULT_CONF.XMARSHAL_QUEUE_BUFFERS_CACHE_LIMIT
|
334
|
+
DEFAULT_CONF.XSIZED_QUEUE_USE_STRING_BUFFER =
|
335
|
+
DEFAULT_CONF.XMARSHAL_QUEUE_USE_STRING_BUFFER
|
311
336
|
|
312
|
-
DEFAULT_CONF.SORTEDQUEUE_POOL_THRESHOLD =
|
337
|
+
DEFAULT_CONF.SORTEDQUEUE_POOL_THRESHOLD =
|
338
|
+
DEFAULT_CONF.POOLQUEUE_POOL_THRESHOLD
|
313
339
|
DEFAULT_CONF.SORTEDQUEUE_THRESHOLD = 10000/2
|
314
340
|
DEFAULT_CONF.SORTEDQUEUE_SORTBY = %{|v| v}
|
315
341
|
|
@@ -317,6 +343,8 @@ module Fairy
|
|
317
343
|
DEFAULT_CONF.HERE_POOL_THRESHOLD = 32000
|
318
344
|
#DEFAULT_CONF.OUTPUT_LOCAL_POOL_THRESHOLD = 32000
|
319
345
|
|
346
|
+
DEFAULT_CONF.GROUP_BY = :XGroupBy
|
347
|
+
|
320
348
|
DEFAULT_CONF.GROUP_BY_NO_SEGMENT = 4
|
321
349
|
DEFAULT_CONF.GROUP_BY_HASH_MODULE = "fairy/share/hash-md5"
|
322
350
|
DEFAULT_CONF.GROUP_BY_GROUPING_OPTIMIZE = false
|
@@ -325,9 +353,11 @@ module Fairy
|
|
325
353
|
DEFAULT_CONF.GROUP_BY_CMSB_THRESHOLD = 400_000
|
326
354
|
DEFAULT_CONF.GROUP_BY_CMSB_CHUNK_SIZE = 1000
|
327
355
|
|
356
|
+
DEFAULT_CONF.XGROUP_BY_BUFFERING_POLICY = {:buffering_class => :XDirectMergeSortBuffer}
|
357
|
+
|
328
358
|
DEFAULT_CONF.BARRIER_MEMORY_BUFFERING_POLICY = {:queuing_class => :PoolQueue}
|
329
359
|
|
330
|
-
DEFAULT_CONF.SORT_BUFFERING_POLICY = {:buffering_class => "PGroupBy::
|
360
|
+
DEFAULT_CONF.SORT_BUFFERING_POLICY = {:buffering_class => "PGroupBy::XDirectMergeSortBuffer"}
|
331
361
|
DEFAULT_CONF.SORT_SAMPLING_MIN = 100
|
332
362
|
DEFAULT_CONF.SORT_SAMPLING_MAX = 10000
|
333
363
|
DEFAULT_CONF.SORT_SAMPLING_RATIO_1_TO = 100
|
data/ext/extconf.rb
ADDED
data/ext/fairy.c
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
/**********************************************************************
|
2
|
+
|
3
|
+
fairy.c -
|
4
|
+
Copyright (C) 2007-2011 Rakuten, Inc.
|
5
|
+
|
6
|
+
**********************************************************************/
|
7
|
+
|
8
|
+
#include <stdarg.h>
|
9
|
+
|
10
|
+
#include "ruby.h"
|
11
|
+
#include "fairy.h"
|
12
|
+
|
13
|
+
extern void Init_simple_hash();
|
14
|
+
extern void Init_fixnum_buffer();
|
15
|
+
extern void Init_string_buffer();
|
16
|
+
extern void Init_xsized_queue();
|
17
|
+
extern void Init_xmarshaled_queue();
|
18
|
+
extern void Init_p_group_by();
|
19
|
+
extern void Init_p_xgroup_by();
|
20
|
+
|
21
|
+
VALUE rb_mFairy;
|
22
|
+
VALUE rb_cFairyLog;
|
23
|
+
VALUE rb_cFairyProcessor = Qnil;
|
24
|
+
|
25
|
+
VALUE rb_cFairyImport;
|
26
|
+
VALUE rb_cFairyExport;
|
27
|
+
|
28
|
+
VALUE rb_cFairyImportCTLTOKEN_SET_NO_IMPORT;
|
29
|
+
VALUE rb_cFairyImportCTLTOKEN_NULLVALUE;
|
30
|
+
VALUE rb_cFairyImportCTLTOKEN_DELAYED_ELEMENT;
|
31
|
+
|
32
|
+
VALUE rb_FairyConf;
|
33
|
+
VALUE rb_FairyEOS;
|
34
|
+
|
35
|
+
static ID id_aref;
|
36
|
+
static ID id_def_export;
|
37
|
+
|
38
|
+
VALUE
|
39
|
+
rb_fairy_conf(const char *conf_attr, VALUE policy, const char *policy_name)
|
40
|
+
{
|
41
|
+
VALUE val = Qnil;
|
42
|
+
|
43
|
+
if (policy) {
|
44
|
+
val = rb_funcall(policy, id_aref, 1, ID2SYM(rb_intern(policy_name)));
|
45
|
+
}
|
46
|
+
|
47
|
+
if (NIL_P(val) && conf_attr != NULL) {
|
48
|
+
val = rb_funcall(rb_FairyConf, rb_intern(conf_attr), 0);
|
49
|
+
}
|
50
|
+
return val;
|
51
|
+
}
|
52
|
+
|
53
|
+
VALUE
|
54
|
+
rb_fairy_processor_def_export(VALUE klass)
|
55
|
+
{
|
56
|
+
return rb_funcall(rb_cFairyProcessor, id_def_export, 1, klass);
|
57
|
+
}
|
58
|
+
|
59
|
+
VALUE
|
60
|
+
rb_fairy_processor_def_export2(VALUE klass, char *name)
|
61
|
+
{
|
62
|
+
VALUE str = rb_str_new2(name);
|
63
|
+
|
64
|
+
return rb_funcall(rb_cFairyProcessor, id_def_export, 2, klass, str);
|
65
|
+
}
|
66
|
+
|
67
|
+
#define DEF_LOG_FUNC(LEVEL) \
|
68
|
+
static ID id_##LEVEL; \
|
69
|
+
VALUE \
|
70
|
+
rb_fairy_##LEVEL(VALUE sender, const char *message) \
|
71
|
+
{ \
|
72
|
+
return rb_funcall(rb_cFairyLog, id_##LEVEL, 2, \
|
73
|
+
sender, rb_str_new_cstr(message)); \
|
74
|
+
} \
|
75
|
+
VALUE \
|
76
|
+
rb_fairy_##LEVEL##f(VALUE sender, const char *format, ...) \
|
77
|
+
{ \
|
78
|
+
VALUE result; \
|
79
|
+
va_list ap; \
|
80
|
+
va_start(ap, format); \
|
81
|
+
result = rb_vsprintf(format, ap); \
|
82
|
+
va_end(ap); \
|
83
|
+
return rb_funcall(rb_cFairyLog, id_##LEVEL, 2, sender, result); \
|
84
|
+
} \
|
85
|
+
static ID id_##LEVEL##_exception; \
|
86
|
+
VALUE \
|
87
|
+
rb_fairy_##LEVEL##_exception(VALUE sender) \
|
88
|
+
{ \
|
89
|
+
return rb_funcall(rb_cFairyLog, id_##LEVEL##_exception, 1, \
|
90
|
+
sender); \
|
91
|
+
} \
|
92
|
+
static ID id_##LEVEL##_backtrace; \
|
93
|
+
VALUE \
|
94
|
+
rb_fairy_##LEVEL##_backtrace(VALUE sender) \
|
95
|
+
{ \
|
96
|
+
return rb_funcall(rb_cFairyLog, id_##LEVEL##_backtrace, 1, sender); \
|
97
|
+
}
|
98
|
+
|
99
|
+
DEF_LOG_FUNC(fatal);
|
100
|
+
DEF_LOG_FUNC(error);
|
101
|
+
DEF_LOG_FUNC(warn);
|
102
|
+
DEF_LOG_FUNC(info);
|
103
|
+
DEF_LOG_FUNC(verbose);
|
104
|
+
DEF_LOG_FUNC(debug);
|
105
|
+
|
106
|
+
#define LOG_PRE ""
|
107
|
+
#define LOG_POST "_exception"
|
108
|
+
|
109
|
+
#define DEF_LOG_ID(level) \
|
110
|
+
id_##level = rb_intern(#level); \
|
111
|
+
id_##level##_exception = rb_intern(LOG_PRE #level LOG_POST); \
|
112
|
+
id_##level##_backtrace = rb_intern("" #level "_backtrace");
|
113
|
+
|
114
|
+
static ID id_debug_p;
|
115
|
+
|
116
|
+
VALUE
|
117
|
+
rb_fairy_debug_p(VALUE obj)
|
118
|
+
{
|
119
|
+
return rb_funcall(rb_cFairyLog, id_debug_p, 1, obj);
|
120
|
+
}
|
121
|
+
|
122
|
+
VALUE
|
123
|
+
rb_fairy_debug_p2(VALUE self, const char *pre, VALUE obj)
|
124
|
+
{
|
125
|
+
const char post[] = ": %s";
|
126
|
+
char *buf = ALLOCA_N(char, strlen(pre) + strlen(post) + 1);
|
127
|
+
|
128
|
+
strcpy(buf, pre);
|
129
|
+
strcat(buf, post);
|
130
|
+
|
131
|
+
return rb_fairy_debugf(self, buf, RSTRING_PTR(rb_inspect(obj)));
|
132
|
+
}
|
133
|
+
|
134
|
+
Init_fairy()
|
135
|
+
{
|
136
|
+
rb_mFairy = rb_define_module("Fairy");
|
137
|
+
rb_FairyConf = rb_const_get(rb_mFairy, rb_intern("CONF"));
|
138
|
+
|
139
|
+
if (rb_const_defined(rb_mFairy, rb_intern("Processor"))) {
|
140
|
+
rb_cFairyProcessor = rb_const_get(rb_mFairy, rb_intern("Processor"));
|
141
|
+
}
|
142
|
+
|
143
|
+
rb_require("fairy/share/port");
|
144
|
+
|
145
|
+
rb_cFairyLog = rb_const_get(rb_mFairy, rb_intern("Log"));
|
146
|
+
|
147
|
+
rb_cFairyImport = rb_const_get(rb_mFairy, rb_intern("Import"));
|
148
|
+
rb_cFairyExport = rb_const_get(rb_mFairy, rb_intern("Export"));
|
149
|
+
|
150
|
+
rb_cFairyImportCTLTOKEN_SET_NO_IMPORT =
|
151
|
+
rb_const_get(rb_cFairyImport, rb_intern("CTLTOKEN_SET_NO_IMPORT"));
|
152
|
+
rb_cFairyImportCTLTOKEN_NULLVALUE =
|
153
|
+
rb_const_get(rb_cFairyImport, rb_intern("CTLTOKEN_NULLVALUE"));
|
154
|
+
rb_cFairyImportCTLTOKEN_DELAYED_ELEMENT =
|
155
|
+
rb_const_get(rb_cFairyImport, rb_intern("CTLTOKEN_DELAYED_ELEMENT"));
|
156
|
+
|
157
|
+
rb_FairyEOS = ID2SYM(rb_intern("END_OF_STREAM"));
|
158
|
+
|
159
|
+
id_aref = rb_intern("[]");
|
160
|
+
id_def_export = rb_intern("def_export");
|
161
|
+
|
162
|
+
DEF_LOG_ID(fatal);
|
163
|
+
DEF_LOG_ID(error);
|
164
|
+
DEF_LOG_ID(warn);
|
165
|
+
DEF_LOG_ID(info);
|
166
|
+
DEF_LOG_ID(verbose);
|
167
|
+
DEF_LOG_ID(debug);
|
168
|
+
|
169
|
+
id_debug_p = rb_intern("debug_p");
|
170
|
+
|
171
|
+
Init_simple_hash();
|
172
|
+
Init_fixnum_buffer();
|
173
|
+
Init_string_buffer();
|
174
|
+
Init_xsized_queue();
|
175
|
+
Init_xmarshaled_queue();
|
176
|
+
Init_p_group_by();
|
177
|
+
Init_p_xgroup_by();
|
178
|
+
|
179
|
+
rb_fairy_warn(rb_mFairy, "fairy.so initialize OK");
|
180
|
+
}
|
data/ext/fairy.h
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
/**********************************************************************
|
2
|
+
|
3
|
+
fairy.h -
|
4
|
+
Copyright (C) 2007-2011 Rakuten, Inc.
|
5
|
+
|
6
|
+
**********************************************************************/
|
7
|
+
|
8
|
+
RUBY_EXTERN VALUE rb_mFairy;
|
9
|
+
|
10
|
+
RUBY_EXTERN VALUE rb_cFairyImport;
|
11
|
+
RUBY_EXTERN VALUE rb_cFairyExport;
|
12
|
+
|
13
|
+
RUBY_EXTERN VALUE rb_mFairySimpleHash;
|
14
|
+
RUBY_EXTERN VALUE rb_cFairyFixnumBuffer;
|
15
|
+
RUBY_EXTERN VALUE rb_cFairyStringBuffer;
|
16
|
+
RUBY_EXTERN VALUE rb_cFairyXMarshaledQueue;
|
17
|
+
RUBY_EXTERN VALUE rb_cFairyPXGroupBy;
|
18
|
+
|
19
|
+
RUBY_EXTERN VALUE rb_cFairyImportCTLTOKEN_SET_NO_IMPORT;
|
20
|
+
RUBY_EXTERN VALUE rb_cFairyImportCTLTOKEN_NULLVALUE;
|
21
|
+
RUBY_EXTERN VALUE rb_cFairyImportCTLTOKEN_DELAYED_ELEMENT;
|
22
|
+
|
23
|
+
RUBY_EXTERN VALUE rb_FairyConf;
|
24
|
+
|
25
|
+
RUBY_EXTERN VALUE rb_fairy_conf(const char *, VALUE, const char *);
|
26
|
+
|
27
|
+
RUBY_EXTERN VALUE rb_fairy_processor_def_export(VALUE);
|
28
|
+
RUBY_EXTERN VALUE rb_fairy_processor_def_export2(VALUE, char*);
|
29
|
+
|
30
|
+
RUBY_EXTERN VALUE rb_fairy_simple_hash(VALUE, VALUE);
|
31
|
+
RUBY_EXTERN unsigned int rb_fairy_simple_hash_uint(VALUE, VALUE);
|
32
|
+
|
33
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_new(void);
|
34
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_clear(VALUE);
|
35
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_length(VALUE);
|
36
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_realsize(VALUE);
|
37
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_push_long(VALUE, long);
|
38
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_push(VALUE, VALUE);
|
39
|
+
RUBY_EXTERN long rb_fairy_fixnum_buffer_pop_long(VALUE);
|
40
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_pop(VALUE);
|
41
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_each(VALUE);
|
42
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_each_callback(VALUE, VALUE(*)(long, VALUE), VALUE);
|
43
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_to_a(VALUE);
|
44
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_marshal_dump(VALUE);
|
45
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_marshal_load(VALUE, VALUE);
|
46
|
+
RUBY_EXTERN VALUE rb_fairy_fixnum_buffer_inspect(VALUE);
|
47
|
+
|
48
|
+
RUBY_EXTERN VALUE rb_fairy_string_buffer_new(void);
|
49
|
+
RUBY_EXTERN VALUE rb_fairy_string_buffer_clear(VALUE);
|
50
|
+
RUBY_EXTERN VALUE rb_fairy_string_buffer_size(VALUE);
|
51
|
+
RUBY_EXTERN VALUE rb_fairy_string_buffer_push(VALUE, VALUE);
|
52
|
+
RUBY_EXTERN VALUE rb_fairy_string_buffer_to_a(VALUE);
|
53
|
+
RUBY_EXTERN VALUE rb_fairy_string_buffer_marshal_dump(VALUE);
|
54
|
+
RUBY_EXTERN VALUE rb_fairy_string_buffer_marshal_load(VALUE, VALUE);
|
55
|
+
|
56
|
+
RUBY_EXTERN VALUE rb_FairyEOS;
|
57
|
+
|
58
|
+
#define EOS_P(v) (v == rb_FairyEOS)
|
59
|
+
|
60
|
+
RUBY_EXTERN VALUE rb_fairy_xmarshaled_queue_new(VALUE, VALUE, VALUE);
|
61
|
+
RUBY_EXTERN VALUE rb_fairy_xmarshaled_queue_push(VALUE, VALUE);
|
62
|
+
RUBY_EXTERN VALUE rb_fairy_xmarshaled_queue_pop(VALUE);
|
63
|
+
RUBY_EXTERN VALUE rb_fairy_xmarshaled_queue_inspect(VALUE);
|
64
|
+
|
65
|
+
|
66
|
+
#define DEF_LOG_FUNC_EXTERN(LEVEL) \
|
67
|
+
RUBY_EXTERN VALUE rb_fairy_##LEVEL(VALUE, const char *); \
|
68
|
+
RUBY_EXTERN VALUE rb_fairy_##LEVEL##f(VALUE, const char *, ...); \
|
69
|
+
RUBY_EXTERN VALUE rb_fairy_##LEVEL##_exception(VALUE); \
|
70
|
+
RUBY_EXTERN VALUE rb_fairy_##LEVEL##_backtrace(VALUE);
|
71
|
+
|
72
|
+
DEF_LOG_FUNC_EXTERN(fatal);
|
73
|
+
DEF_LOG_FUNC_EXTERN(error);
|
74
|
+
DEF_LOG_FUNC_EXTERN(warn);
|
75
|
+
DEF_LOG_FUNC_EXTERN(info);
|
76
|
+
DEF_LOG_FUNC_EXTERN(verbose);
|
77
|
+
DEF_LOG_FUNC_EXTERN(debug);
|
78
|
+
|
79
|
+
|
80
|
+
RUBY_EXTERN VALUE rb_fairy_debug_p(VALUE);
|
81
|
+
RUBY_EXTERN VALUE rb_fairy_debug_p2(VALUE, const char *, VALUE);
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
data/ext/fiber_mon.h
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
/**********************************************************************
|
2
|
+
|
3
|
+
fiber-mon.h -
|
4
|
+
Copyright (C) 2010-2011 Keiju ISHITSUKA
|
5
|
+
(Penta Advanced Labrabries, Co.,Ltd)
|
6
|
+
|
7
|
+
**********************************************************************/
|
8
|
+
|
9
|
+
RUBY_EXTERN VALUE rb_cFiberMon;
|
10
|
+
RUBY_EXTERN VALUE rb_cFiberMonMonitor;
|
11
|
+
RUBY_EXTERN VALUE rb_cFiberMonConditionVariable;
|
12
|
+
|
13
|
+
RUBY_EXTERN VALUE rb_fibermon_new(void);
|
14
|
+
RUBY_EXTERN VALUE rb_fibermon_current(VALUE);
|
15
|
+
RUBY_EXTERN VALUE rb_fibermon_entry_fiber(VALUE, VALUE);
|
16
|
+
RUBY_EXTERN VALUE rb_fibermon_yield(VALUE);
|
17
|
+
RUBY_EXTERN VALUE rb_fibermon_new_mon(VALUE);
|
18
|
+
|
19
|
+
RUBY_EXTERN VALUE rb_fibermon_monitor_new(VALUE);
|
20
|
+
RUBY_EXTERN VALUE rb_fibermon_monitor_valid_owner_p(VALUE);
|
21
|
+
RUBY_EXTERN VALUE rb_fibermon_monitor_try_enter(VALUE);
|
22
|
+
RUBY_EXTERN VALUE rb_fibermon_monitor_enter(VALUE);
|
23
|
+
RUBY_EXTERN VALUE rb_fibermon_monitor_exit(VALUE);
|
24
|
+
RUBY_EXTERN VALUE rb_fibermon_monitor_synchronize(VALUE, VALUE (*)(VALUE), VALUE);
|
25
|
+
RUBY_EXTERN VALUE rb_fibermon_monitor_new_cond(VALUE);
|
26
|
+
|
27
|
+
RUBY_EXTERN VALUE rb_fibermon_cond_new(VALUE);
|
28
|
+
RUBY_EXTERN VALUE rb_fibermon_cond_signal(VALUE);
|
29
|
+
RUBY_EXTERN VALUE rb_fibermon_cond_broadcast(VALUE);
|
30
|
+
RUBY_EXTERN VALUE rb_fibermon_cond_wait(VALUE);
|
31
|
+
RUBY_EXTERN VALUE rb_fibermon_cond_wait_until(VALUE);
|
32
|
+
RUBY_EXTERN VALUE rb_fibermon_cond_wait_while(VALUE);
|
data/ext/fixnum-buffer.c
ADDED
@@ -0,0 +1,483 @@
|
|
1
|
+
/**********************************************************************
|
2
|
+
|
3
|
+
fixnum-buffer.c -
|
4
|
+
Copyright (C) 2007-2011 Rakuten, Inc.
|
5
|
+
|
6
|
+
**********************************************************************/
|
7
|
+
|
8
|
+
#include "ruby.h"
|
9
|
+
|
10
|
+
#include "fairy.h"
|
11
|
+
|
12
|
+
#define FIXNUM_BUFFER_DEFAULT_CAPA 16
|
13
|
+
|
14
|
+
VALUE rb_cFairyFixnumBuffer;
|
15
|
+
|
16
|
+
typedef struct rb_fairy_fixnum_buffer_struct
|
17
|
+
{
|
18
|
+
long capa;
|
19
|
+
long length;
|
20
|
+
long push;
|
21
|
+
long pop;
|
22
|
+
unsigned char *fixnums;
|
23
|
+
} fairy_fixnum_buffer_t;
|
24
|
+
|
25
|
+
#define GetFairyFixnumBufferPtr(obj, tobj) \
|
26
|
+
TypedData_Get_Struct((obj), fairy_fixnum_buffer_t, &fairy_fixnum_buffer_data_type, (tobj))
|
27
|
+
|
28
|
+
static void
|
29
|
+
fairy_fixnum_buffer_free(void *ptr)
|
30
|
+
{
|
31
|
+
fairy_fixnum_buffer_t *fb = (fairy_fixnum_buffer_t*)ptr;
|
32
|
+
|
33
|
+
if (fb->fixnums) {
|
34
|
+
ruby_xfree(fb->fixnums);
|
35
|
+
}
|
36
|
+
ruby_xfree(ptr);
|
37
|
+
}
|
38
|
+
|
39
|
+
static size_t
|
40
|
+
fairy_fixnum_buffer_memsize(const void *ptr)
|
41
|
+
{
|
42
|
+
fairy_fixnum_buffer_t *fb = (fairy_fixnum_buffer_t*)ptr;
|
43
|
+
return ptr ? sizeof(fairy_fixnum_buffer_t) + fb->capa : 0;
|
44
|
+
}
|
45
|
+
|
46
|
+
#ifdef HAVE_RB_DATA_TYPE_T_FUNCTION
|
47
|
+
static const rb_data_type_t fairy_fixnum_buffer_data_type = {
|
48
|
+
"fairy_fixnum_buffer",
|
49
|
+
{0, fairy_fixnum_buffer_free, fairy_fixnum_buffer_memsize,},
|
50
|
+
};
|
51
|
+
#else
|
52
|
+
static const rb_data_type_t fairy_fixnum_buffer_data_type = {
|
53
|
+
"fairy_fixnum_buffer",
|
54
|
+
0,
|
55
|
+
fairy_fixnum_buffer_free,
|
56
|
+
fairy_fixnum_buffer_memsize,
|
57
|
+
};
|
58
|
+
#endif
|
59
|
+
|
60
|
+
static VALUE
|
61
|
+
fairy_fixnum_buffer_alloc(VALUE klass)
|
62
|
+
{
|
63
|
+
VALUE volatile obj;
|
64
|
+
fairy_fixnum_buffer_t *fb;
|
65
|
+
|
66
|
+
obj = TypedData_Make_Struct(klass, fairy_fixnum_buffer_t, &fairy_fixnum_buffer_data_type, fb);
|
67
|
+
|
68
|
+
fb->capa = 0;
|
69
|
+
fb->length = 0;
|
70
|
+
fb->push = 0;
|
71
|
+
fb->pop = 0;
|
72
|
+
fb->fixnums = NULL;
|
73
|
+
|
74
|
+
return obj;
|
75
|
+
}
|
76
|
+
|
77
|
+
static void
|
78
|
+
fairy_fixnum_buffer_resize_double_capa(fairy_fixnum_buffer_t *fb)
|
79
|
+
{
|
80
|
+
long new_capa = fb->capa * 2;
|
81
|
+
|
82
|
+
REALLOC_N(fb->fixnums, unsigned char, new_capa);
|
83
|
+
|
84
|
+
if (fb->push > fb->capa) {
|
85
|
+
if (fb->capa - fb->pop <= fb->push - fb->capa) {
|
86
|
+
MEMCPY(&fb->fixnums[fb->pop + fb->capa],
|
87
|
+
&fb->fixnums[fb->pop], unsigned char, fb->capa - fb->pop);
|
88
|
+
fb->pop += fb->capa;
|
89
|
+
fb->push += fb->capa;
|
90
|
+
}
|
91
|
+
else {
|
92
|
+
MEMCPY(&fb->fixnums[fb->capa],
|
93
|
+
fb->fixnums, unsigned char, fb->push - fb->capa);
|
94
|
+
}
|
95
|
+
}
|
96
|
+
fb->capa = new_capa;
|
97
|
+
}
|
98
|
+
|
99
|
+
static VALUE
|
100
|
+
fairy_fixnum_buffer_initialize(VALUE self)
|
101
|
+
{
|
102
|
+
fairy_fixnum_buffer_t *fb;
|
103
|
+
GetFairyFixnumBufferPtr(self, fb);
|
104
|
+
|
105
|
+
fb->capa = FIXNUM_BUFFER_DEFAULT_CAPA;
|
106
|
+
fb->fixnums = ALLOC_N(unsigned char, fb->capa);
|
107
|
+
return self;
|
108
|
+
}
|
109
|
+
|
110
|
+
VALUE
|
111
|
+
rb_fairy_fixnum_buffer_new(void)
|
112
|
+
{
|
113
|
+
VALUE fb;
|
114
|
+
fb = fairy_fixnum_buffer_alloc(rb_cFairyFixnumBuffer);
|
115
|
+
fairy_fixnum_buffer_initialize(fb);
|
116
|
+
return fb;
|
117
|
+
}
|
118
|
+
|
119
|
+
VALUE
|
120
|
+
rb_fairy_fixnum_buffer_clear(VALUE self)
|
121
|
+
{
|
122
|
+
fairy_fixnum_buffer_t *fb;
|
123
|
+
GetFairyFixnumBufferPtr(self, fb);
|
124
|
+
|
125
|
+
fb->capa = FIXNUM_BUFFER_DEFAULT_CAPA;
|
126
|
+
fb->length = 0;
|
127
|
+
fb->push = 0;
|
128
|
+
fb->pop = 0;
|
129
|
+
if (fb->fixnums) {
|
130
|
+
ruby_xfree(fb->fixnums);
|
131
|
+
}
|
132
|
+
fb->fixnums = ALLOC_N(unsigned char, fb->capa);
|
133
|
+
return self;
|
134
|
+
}
|
135
|
+
|
136
|
+
VALUE
|
137
|
+
rb_fairy_fixnum_buffer_length(VALUE self)
|
138
|
+
{
|
139
|
+
fairy_fixnum_buffer_t *fb;
|
140
|
+
|
141
|
+
GetFairyFixnumBufferPtr(self, fb);
|
142
|
+
return LONG2NUM(fb->length);
|
143
|
+
}
|
144
|
+
|
145
|
+
|
146
|
+
VALUE
|
147
|
+
rb_fairy_fixnum_buffer_realsize(VALUE self)
|
148
|
+
{
|
149
|
+
fairy_fixnum_buffer_t *fb;
|
150
|
+
|
151
|
+
GetFairyFixnumBufferPtr(self, fb);
|
152
|
+
return LONG2NUM(fb->push - fb->pop);
|
153
|
+
}
|
154
|
+
|
155
|
+
inline static int
|
156
|
+
push_index(fairy_fixnum_buffer_t *fb)
|
157
|
+
{
|
158
|
+
int idx = 0;
|
159
|
+
retry:
|
160
|
+
if (fb->push < fb->capa) {
|
161
|
+
idx = fb->push;
|
162
|
+
}
|
163
|
+
else if (fb->push - fb->capa < fb->pop) {
|
164
|
+
idx = fb->push - fb->capa;
|
165
|
+
}
|
166
|
+
else {
|
167
|
+
fairy_fixnum_buffer_resize_double_capa(fb);
|
168
|
+
goto retry;
|
169
|
+
}
|
170
|
+
return idx;
|
171
|
+
}
|
172
|
+
|
173
|
+
VALUE
|
174
|
+
rb_fairy_fixnum_buffer_push_long(VALUE self, long v)
|
175
|
+
{
|
176
|
+
fairy_fixnum_buffer_t *fb;
|
177
|
+
int idx, i;
|
178
|
+
char low;
|
179
|
+
GetFairyFixnumBufferPtr(self, fb);
|
180
|
+
|
181
|
+
fb->length++;
|
182
|
+
for (i = 0; i <= (int)sizeof(long); i++) {
|
183
|
+
idx = push_index(fb);
|
184
|
+
low = (char)(v & 0x7f);
|
185
|
+
v >>= 7;
|
186
|
+
if (v == 0 && low != 0x7f) {
|
187
|
+
fb->fixnums[idx] = low;
|
188
|
+
fb->push++;
|
189
|
+
return self;
|
190
|
+
}
|
191
|
+
else if (v == -1) {
|
192
|
+
low |= 0x80;
|
193
|
+
fb->fixnums[idx] = low;
|
194
|
+
fb->push++;
|
195
|
+
idx = push_index(fb);
|
196
|
+
fb->fixnums[idx] = 0x7f;
|
197
|
+
fb->push++;
|
198
|
+
return self;
|
199
|
+
}
|
200
|
+
else {
|
201
|
+
low |= 0x80;
|
202
|
+
fb->fixnums[idx] = low;
|
203
|
+
fb->push++;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
return self;
|
207
|
+
}
|
208
|
+
|
209
|
+
|
210
|
+
VALUE
|
211
|
+
rb_fairy_fixnum_buffer_push(VALUE self, VALUE v)
|
212
|
+
{
|
213
|
+
if (!FIXNUM_P(v)) {
|
214
|
+
rb_raise(rb_eTypeError, "not a fixnum");
|
215
|
+
}
|
216
|
+
|
217
|
+
return rb_fairy_fixnum_buffer_push_long(self, FIX2LONG(v));
|
218
|
+
}
|
219
|
+
|
220
|
+
inline static long
|
221
|
+
at_long(fairy_fixnum_buffer_t *fb, long idx, long *ret)
|
222
|
+
{
|
223
|
+
long v = 0;
|
224
|
+
long idx2;
|
225
|
+
int i = 0;
|
226
|
+
char low;
|
227
|
+
|
228
|
+
while(1) {
|
229
|
+
if (idx < fb->capa) {
|
230
|
+
idx2 = idx;
|
231
|
+
}
|
232
|
+
else {
|
233
|
+
idx2 = idx - fb-> capa;
|
234
|
+
}
|
235
|
+
low = fb->fixnums[idx2];
|
236
|
+
idx++;
|
237
|
+
|
238
|
+
if (low & 0x80) {
|
239
|
+
v |= (low & 0x7f) << i;
|
240
|
+
}
|
241
|
+
else if (low == 0x7f) {
|
242
|
+
while (i <= (int)sizeof(long)*8) {
|
243
|
+
v |= 0x7f << i;
|
244
|
+
i += 7;
|
245
|
+
}
|
246
|
+
break;
|
247
|
+
}
|
248
|
+
else {
|
249
|
+
v |= (low & 0x7f) << i;
|
250
|
+
break;
|
251
|
+
}
|
252
|
+
i += 7;
|
253
|
+
}
|
254
|
+
if (ret != NULL) {
|
255
|
+
*ret = idx;
|
256
|
+
}
|
257
|
+
return v;
|
258
|
+
}
|
259
|
+
|
260
|
+
long
|
261
|
+
rb_fairy_fixnum_buffer_pop_long(VALUE self)
|
262
|
+
{
|
263
|
+
fairy_fixnum_buffer_t *fb;
|
264
|
+
long v = 0;
|
265
|
+
int i;
|
266
|
+
char low;
|
267
|
+
|
268
|
+
GetFairyFixnumBufferPtr(self, fb);
|
269
|
+
|
270
|
+
if (fb->push == fb->pop)
|
271
|
+
return 0;
|
272
|
+
|
273
|
+
fb->length--;
|
274
|
+
i = 0;
|
275
|
+
while(1) {
|
276
|
+
low = fb->fixnums[fb->pop++];
|
277
|
+
if(fb->pop >= fb->capa) {
|
278
|
+
fb->pop -= fb->capa;
|
279
|
+
fb->push -= fb->capa;
|
280
|
+
}
|
281
|
+
|
282
|
+
if (low & 0x80) {
|
283
|
+
v |= (low & 0x7f) << i;
|
284
|
+
}
|
285
|
+
else if (low == 0x7f) {
|
286
|
+
while (i <= (int)sizeof(long)*8) {
|
287
|
+
v |= 0x7f << i;
|
288
|
+
i += 7;
|
289
|
+
}
|
290
|
+
break;
|
291
|
+
}
|
292
|
+
else {
|
293
|
+
v |= (low & 0x7f) << i;
|
294
|
+
break;
|
295
|
+
}
|
296
|
+
i += 7;
|
297
|
+
}
|
298
|
+
return v;
|
299
|
+
}
|
300
|
+
|
301
|
+
VALUE
|
302
|
+
rb_fairy_fixnum_buffer_pop(VALUE self)
|
303
|
+
{
|
304
|
+
fairy_fixnum_buffer_t *fb;
|
305
|
+
GetFairyFixnumBufferPtr(self, fb);
|
306
|
+
|
307
|
+
if (fb->push == fb->pop)
|
308
|
+
return Qnil;
|
309
|
+
return LONG2FIX(rb_fairy_fixnum_buffer_pop_long(self));
|
310
|
+
}
|
311
|
+
|
312
|
+
VALUE
|
313
|
+
rb_fairy_fixnum_buffer_each(VALUE self)
|
314
|
+
{
|
315
|
+
fairy_fixnum_buffer_t *fb;
|
316
|
+
long i;
|
317
|
+
|
318
|
+
GetFairyFixnumBufferPtr(self, fb);
|
319
|
+
|
320
|
+
i = fb->pop;
|
321
|
+
while (i < fb->push) {
|
322
|
+
rb_yield(LONG2FIX(at_long(fb, i, &i)));
|
323
|
+
}
|
324
|
+
return self;
|
325
|
+
}
|
326
|
+
|
327
|
+
VALUE
|
328
|
+
rb_fairy_fixnum_buffer_each_callback(VALUE self, VALUE(*callback)(long, VALUE), VALUE arg)
|
329
|
+
{
|
330
|
+
fairy_fixnum_buffer_t *fb;
|
331
|
+
long i;
|
332
|
+
|
333
|
+
GetFairyFixnumBufferPtr(self, fb);
|
334
|
+
|
335
|
+
i = fb->pop;
|
336
|
+
while (i < fb->push) {
|
337
|
+
callback(at_long(fb, i, &i), arg);
|
338
|
+
}
|
339
|
+
return self;
|
340
|
+
}
|
341
|
+
|
342
|
+
|
343
|
+
VALUE
|
344
|
+
rb_fairy_fixnum_buffer_to_a(VALUE self)
|
345
|
+
{
|
346
|
+
VALUE ary;
|
347
|
+
fairy_fixnum_buffer_t *fb;
|
348
|
+
VALUE s, v;
|
349
|
+
long i;
|
350
|
+
|
351
|
+
GetFairyFixnumBufferPtr(self, fb);
|
352
|
+
|
353
|
+
ary = rb_ary_new2(fb->length);
|
354
|
+
|
355
|
+
i = fb->pop;
|
356
|
+
while (i < fb->push) {
|
357
|
+
v = LONG2FIX(at_long(fb, i, &i));
|
358
|
+
rb_ary_push(ary, v);
|
359
|
+
}
|
360
|
+
return ary;
|
361
|
+
}
|
362
|
+
|
363
|
+
VALUE
|
364
|
+
rb_fairy_fixnum_buffer_marshal_dump(VALUE self)
|
365
|
+
{
|
366
|
+
fairy_fixnum_buffer_t *fb;
|
367
|
+
long len;
|
368
|
+
VALUE str;
|
369
|
+
|
370
|
+
GetFairyFixnumBufferPtr(self, fb);
|
371
|
+
|
372
|
+
if (fb->push < fb->capa) {
|
373
|
+
str = rb_str_new(fb->fixnums + fb->pop, fb->push - fb->pop);
|
374
|
+
}
|
375
|
+
else {
|
376
|
+
str = rb_str_new(fb->fixnums + fb->pop, fb->capa - fb->pop);
|
377
|
+
rb_str_cat(str, fb->fixnums, fb->push - fb->capa);
|
378
|
+
}
|
379
|
+
return rb_ary_new3(3, LONG2NUM(fb->push - fb->pop), str, LONG2NUM(fb->length));
|
380
|
+
}
|
381
|
+
|
382
|
+
VALUE
|
383
|
+
rb_fairy_fixnum_buffer_marshal_load(VALUE self, VALUE obj)
|
384
|
+
{
|
385
|
+
fairy_fixnum_buffer_t *fb;
|
386
|
+
VALUE str;
|
387
|
+
GetFairyFixnumBufferPtr(self, fb);
|
388
|
+
|
389
|
+
fb->push = NUM2LONG(rb_ary_entry(obj, 0));
|
390
|
+
|
391
|
+
fb->capa = FIXNUM_BUFFER_DEFAULT_CAPA;
|
392
|
+
if (fb->capa <= fb->push) {
|
393
|
+
fb->capa += fb->push;
|
394
|
+
}
|
395
|
+
|
396
|
+
fb->fixnums = ALLOC_N(unsigned char, fb->capa);
|
397
|
+
MEMCPY(fb->fixnums, RSTRING_PTR(rb_ary_entry(obj, 1)),
|
398
|
+
unsigned char, fb->push);
|
399
|
+
|
400
|
+
fb->length = NUM2LONG(rb_ary_entry(obj, 2));
|
401
|
+
|
402
|
+
return self;
|
403
|
+
}
|
404
|
+
|
405
|
+
|
406
|
+
VALUE
|
407
|
+
rb_fairy_fixnum_buffer_inspect(VALUE self)
|
408
|
+
{
|
409
|
+
fairy_fixnum_buffer_t *fb;
|
410
|
+
VALUE str;
|
411
|
+
GetFairyFixnumBufferPtr(self, fb);
|
412
|
+
|
413
|
+
str = rb_sprintf("<%s:%x length=%d ", rb_obj_classname(self), (void*)self, fb->length);
|
414
|
+
|
415
|
+
rb_str_append(str, rb_inspect(rb_fairy_fixnum_buffer_to_a(self)));
|
416
|
+
rb_str_cat2(str, ">");
|
417
|
+
return str;
|
418
|
+
}
|
419
|
+
|
420
|
+
VALUE
|
421
|
+
rb_fairy_fixnum_buffer_inspect_raw(VALUE self)
|
422
|
+
{
|
423
|
+
fairy_fixnum_buffer_t *fb;
|
424
|
+
VALUE str;
|
425
|
+
GetFairyFixnumBufferPtr(self, fb);
|
426
|
+
|
427
|
+
str = rb_sprintf("<%s:%x length=%d: [", rb_obj_classname(self), (void*)self, fb->length);
|
428
|
+
if (fb->push < fb->capa) {
|
429
|
+
VALUE s;
|
430
|
+
long i;
|
431
|
+
|
432
|
+
for (i = fb->pop; i < fb->push; i++) {
|
433
|
+
int b = fb->fixnums[i] >> 7;
|
434
|
+
char v = fb->fixnums[i] & 0x7f;
|
435
|
+
|
436
|
+
s = rb_sprintf(" %d:%d", b, v);
|
437
|
+
rb_str_append(str, s);
|
438
|
+
}
|
439
|
+
}
|
440
|
+
else {
|
441
|
+
VALUE s;
|
442
|
+
long i;
|
443
|
+
for (i = fb->pop; i < fb->capa; i++) {
|
444
|
+
int b = fb->fixnums[i] >> 7;
|
445
|
+
char v = fb->fixnums[i] & 0x7f;
|
446
|
+
|
447
|
+
s = rb_sprintf(" %d:%d", b, v);
|
448
|
+
rb_str_append(str, s);
|
449
|
+
}
|
450
|
+
|
451
|
+
for (i = 0; i < fb->push - fb->capa; i++) {
|
452
|
+
int b = fb->fixnums[i] >> 7;
|
453
|
+
char v = fb->fixnums[i] & 0x7f;
|
454
|
+
|
455
|
+
s = rb_sprintf(" %d:%d", b, v);
|
456
|
+
rb_str_append(str, s);
|
457
|
+
}
|
458
|
+
}
|
459
|
+
rb_str_cat2(str, "]>");
|
460
|
+
return str;
|
461
|
+
}
|
462
|
+
|
463
|
+
void
|
464
|
+
Init_fixnum_buffer()
|
465
|
+
{
|
466
|
+
VALUE ffb;
|
467
|
+
|
468
|
+
rb_cFairyFixnumBuffer = rb_define_class_under(rb_mFairy, "FixnumBuffer", rb_cObject);
|
469
|
+
|
470
|
+
ffb = rb_cFairyFixnumBuffer;
|
471
|
+
rb_define_alloc_func(ffb, fairy_fixnum_buffer_alloc);
|
472
|
+
rb_define_method(ffb, "initialize", fairy_fixnum_buffer_initialize, 0);
|
473
|
+
rb_define_method(ffb, "length", rb_fairy_fixnum_buffer_length, 0);
|
474
|
+
rb_define_alias(ffb, "size", "length");
|
475
|
+
rb_define_method(ffb, "realsize", rb_fairy_fixnum_buffer_realsize, 0);
|
476
|
+
rb_define_method(ffb, "push", rb_fairy_fixnum_buffer_push, 1);
|
477
|
+
rb_define_method(ffb, "pop", rb_fairy_fixnum_buffer_pop, 0);
|
478
|
+
rb_define_method(ffb, "each", rb_fairy_fixnum_buffer_each, 0);
|
479
|
+
rb_define_method(ffb, "to_a", rb_fairy_fixnum_buffer_to_a, 0);
|
480
|
+
rb_define_method(ffb, "marshal_dump", rb_fairy_fixnum_buffer_marshal_dump, 0);
|
481
|
+
rb_define_method(ffb, "marshal_load", rb_fairy_fixnum_buffer_marshal_load, 1);
|
482
|
+
rb_define_method(ffb, "inspect", rb_fairy_fixnum_buffer_inspect, 0);
|
483
|
+
}
|