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.
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
+ }