fairy 0.6.0 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/Makefile +1 -0
  2. data/bin/fairy +35 -5
  3. data/ext/extconf.rb +3 -0
  4. data/ext/fairy.c +180 -0
  5. data/ext/fairy.h +94 -0
  6. data/ext/fiber_mon.h +32 -0
  7. data/ext/fixnum-buffer.c +483 -0
  8. data/ext/p-group-by.c +529 -0
  9. data/ext/p-xgroup-by.c +467 -0
  10. data/ext/simple-hash.c +44 -0
  11. data/ext/string-buffer.c +286 -0
  12. data/ext/xmarshaled-queue.c +699 -0
  13. data/ext/xsized-queue.c +528 -0
  14. data/ext/xthread.h +65 -0
  15. data/fairy.gemspec +5 -2
  16. data/lib/fairy.rb +10 -1
  17. data/lib/fairy/client/group-by.rb +57 -2
  18. data/lib/fairy/client/here.rb +2 -1
  19. data/lib/fairy/controller.rb +25 -4
  20. data/lib/fairy/master.rb +17 -3
  21. data/lib/fairy/master/c-basic-group-by.rb +4 -2
  22. data/lib/fairy/master/c-cat.rb +3 -2
  23. data/lib/fairy/master/c-direct-product.rb +5 -3
  24. data/lib/fairy/master/c-filter.rb +5 -3
  25. data/lib/fairy/master/c-group-by.rb +13 -0
  26. data/lib/fairy/master/c-junction.rb +3 -2
  27. data/lib/fairy/master/c-seg-join.rb +3 -1
  28. data/lib/fairy/master/c-seg-shuffle.rb +3 -2
  29. data/lib/fairy/master/c-seg-split.rb +1 -1
  30. data/lib/fairy/master/c-seg-zip.rb +3 -1
  31. data/lib/fairy/master/c-sort.rb +7 -2
  32. data/lib/fairy/master/c-wc.rb +5 -3
  33. data/lib/fairy/node.rb +13 -2
  34. data/lib/fairy/node/p-barrier.rb +1 -1
  35. data/lib/fairy/node/p-basic-group-by.rb +22 -12
  36. data/lib/fairy/node/p-direct-product.rb +4 -2
  37. data/lib/fairy/node/p-filter.rb +8 -7
  38. data/lib/fairy/node/p-find.rb +2 -1
  39. data/lib/fairy/node/p-group-by.rb +17 -6
  40. data/lib/fairy/node/p-inject.rb +3 -2
  41. data/lib/fairy/node/p-output-file.rb +1 -1
  42. data/lib/fairy/node/p-seg-join.rb +2 -1
  43. data/lib/fairy/node/p-seg-zip.rb +2 -1
  44. data/lib/fairy/node/p-single-exportable.rb +3 -1
  45. data/lib/fairy/node/p-sort.rb +4 -2
  46. data/lib/fairy/node/p-task.rb +1 -1
  47. data/lib/fairy/node/p-wc.rb +5 -2
  48. data/lib/fairy/processor.rb +25 -18
  49. data/lib/fairy/share/block-source.rb +12 -2
  50. data/lib/fairy/share/conf.rb +35 -5
  51. data/lib/fairy/share/hash-simple-hash.rb +1 -1
  52. data/lib/fairy/share/log.rb +11 -4
  53. data/lib/fairy/share/pool-dictionary.rb +2 -1
  54. data/lib/fairy/share/port-marshaled-queue.rb +8 -1
  55. data/lib/fairy/share/port.rb +55 -45
  56. data/lib/fairy/share/reference.rb +2 -1
  57. data/lib/fairy/share/varray.rb +3 -1
  58. data/lib/fairy/share/vfile.rb +4 -2
  59. data/lib/fairy/version.rb +1 -1
  60. data/sample/sort.rb +69 -3
  61. data/spec/fairy8_spec.rb +1 -1
  62. data/test/testc.rb +380 -2
  63. data/tools/cap_recipe/Capfile +3 -3
  64. data/tools/fairy_conf_wizard.rb +375 -0
  65. data/tools/fairy_perf_graph.rb +15 -3
  66. data/tools/git-tag +1 -0
  67. data/tools/log-analysis.rb +59 -11
  68. metadata +33 -34
  69. data/ext/simple_hash/extconf.rb +0 -4
  70. data/ext/simple_hash/simple_hash.c +0 -42
data/Makefile CHANGED
@@ -90,6 +90,7 @@ doc/programming-interface.html: doc/programming-interface.rd
90
90
  # gem
91
91
  gem:
92
92
  gem build fairy.gemspec
93
+ mv *.gem pkg
93
94
 
94
95
  # tar archives
95
96
  TGZ_FILES = $(SRCS) $(DEEPCONNECTSRCS)
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 => :FileMarshaledQueue}
301
- DEFAULT_CONF.POSTQUEUING_POLICY = {:queuing_class => :FileMarshaledQueue}
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 = 10000
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 = DEFAULT_CONF.POOLQUEUE_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::DirectMergeSortBuffer"}
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
@@ -0,0 +1,3 @@
1
+ require 'mkmf'
2
+
3
+ create_makefile("fairy")
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);
@@ -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
+ }