fairy 0.6.0 → 0.6.5
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/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
|
+
}
|