fairy 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. data/LICENSE +674 -0
  2. data/Makefile +116 -0
  3. data/README +15 -0
  4. data/bin/fairy +582 -0
  5. data/bin/fairy-cat +74 -0
  6. data/bin/fairy-cp +128 -0
  7. data/bin/fairy-rm +122 -0
  8. data/bin/subcmd/controller +41 -0
  9. data/bin/subcmd/inspector +81 -0
  10. data/bin/subcmd/master +43 -0
  11. data/bin/subcmd/node +47 -0
  12. data/bin/subcmd/processor +54 -0
  13. data/doc/programming-interface.html +240 -0
  14. data/doc/programming-interface.rd +300 -0
  15. data/etc/fairy.conf.tmpl +118 -0
  16. data/ext/simple_hash/extconf.rb +4 -0
  17. data/ext/simple_hash/simple_hash.c +42 -0
  18. data/fairy.gemspec +60 -0
  19. data/lib/fairy/client/addins.rb +20 -0
  20. data/lib/fairy/client/barrier.rb +29 -0
  21. data/lib/fairy/client/basic-group-by.rb +52 -0
  22. data/lib/fairy/client/cat.rb +41 -0
  23. data/lib/fairy/client/direct-product.rb +51 -0
  24. data/lib/fairy/client/equijoin.rb +79 -0
  25. data/lib/fairy/client/exec.rb +54 -0
  26. data/lib/fairy/client/filter.rb +62 -0
  27. data/lib/fairy/client/find.rb +35 -0
  28. data/lib/fairy/client/group-by.rb +194 -0
  29. data/lib/fairy/client/here.rb +84 -0
  30. data/lib/fairy/client/inject.rb +70 -0
  31. data/lib/fairy/client/input-file.rb +53 -0
  32. data/lib/fairy/client/input-iota.rb +49 -0
  33. data/lib/fairy/client/input-local-file.rb +188 -0
  34. data/lib/fairy/client/input-varray.rb +30 -0
  35. data/lib/fairy/client/input.rb +42 -0
  36. data/lib/fairy/client/io-filter.rb +26 -0
  37. data/lib/fairy/client/junction.rb +31 -0
  38. data/lib/fairy/client/map.rb +34 -0
  39. data/lib/fairy/client/merge-group-by.rb +71 -0
  40. data/lib/fairy/client/output-file.rb +64 -0
  41. data/lib/fairy/client/output-local-file.rb +60 -0
  42. data/lib/fairy/client/output-null.rb +47 -0
  43. data/lib/fairy/client/output-varray.rb +50 -0
  44. data/lib/fairy/client/output.rb +29 -0
  45. data/lib/fairy/client/roma-put.rb +62 -0
  46. data/lib/fairy/client/roma.rb +156 -0
  47. data/lib/fairy/client/seg-join.rb +61 -0
  48. data/lib/fairy/client/seg-map.rb +78 -0
  49. data/lib/fairy/client/seg-shuffle.rb +35 -0
  50. data/lib/fairy/client/seg-split.rb +27 -0
  51. data/lib/fairy/client/seg-zip.rb +60 -0
  52. data/lib/fairy/client/select.rb +38 -0
  53. data/lib/fairy/client/sort.rb +48 -0
  54. data/lib/fairy/client/sort18.rb +56 -0
  55. data/lib/fairy/client/sort19.rb +61 -0
  56. data/lib/fairy/client/there.rb +47 -0
  57. data/lib/fairy/client/top_n_into_roma.rb +34 -0
  58. data/lib/fairy/client/wc.rb +92 -0
  59. data/lib/fairy/controller.rb +1103 -0
  60. data/lib/fairy/logger.rb +107 -0
  61. data/lib/fairy/master/addins.rb +20 -0
  62. data/lib/fairy/master/atom.rb +17 -0
  63. data/lib/fairy/master/c-barrier.rb +283 -0
  64. data/lib/fairy/master/c-basic-group-by.rb +250 -0
  65. data/lib/fairy/master/c-cat.rb +159 -0
  66. data/lib/fairy/master/c-direct-product.rb +203 -0
  67. data/lib/fairy/master/c-exec.rb +68 -0
  68. data/lib/fairy/master/c-filter.rb +422 -0
  69. data/lib/fairy/master/c-find.rb +138 -0
  70. data/lib/fairy/master/c-group-by.rb +64 -0
  71. data/lib/fairy/master/c-here.rb +80 -0
  72. data/lib/fairy/master/c-inject.rb +119 -0
  73. data/lib/fairy/master/c-input-file.rb +46 -0
  74. data/lib/fairy/master/c-input-iota.rb +66 -0
  75. data/lib/fairy/master/c-input-local-file.rb +117 -0
  76. data/lib/fairy/master/c-input-varray.rb +53 -0
  77. data/lib/fairy/master/c-input.rb +24 -0
  78. data/lib/fairy/master/c-inputtable.rb +31 -0
  79. data/lib/fairy/master/c-inputtable18.rb +36 -0
  80. data/lib/fairy/master/c-inputtable19.rb +35 -0
  81. data/lib/fairy/master/c-io-filter.rb +28 -0
  82. data/lib/fairy/master/c-junction.rb +54 -0
  83. data/lib/fairy/master/c-map.rb +27 -0
  84. data/lib/fairy/master/c-merge-group-by.rb +241 -0
  85. data/lib/fairy/master/c-output-file.rb +84 -0
  86. data/lib/fairy/master/c-output-local-file.rb +19 -0
  87. data/lib/fairy/master/c-output-null.rb +45 -0
  88. data/lib/fairy/master/c-output-varray.rb +57 -0
  89. data/lib/fairy/master/c-output.rb +20 -0
  90. data/lib/fairy/master/c-seg-join.rb +141 -0
  91. data/lib/fairy/master/c-seg-map.rb +26 -0
  92. data/lib/fairy/master/c-seg-shuffle.rb +87 -0
  93. data/lib/fairy/master/c-seg-split.rb +110 -0
  94. data/lib/fairy/master/c-seg-zip.rb +132 -0
  95. data/lib/fairy/master/c-select.rb +27 -0
  96. data/lib/fairy/master/c-sort.rb +108 -0
  97. data/lib/fairy/master/c-there.rb +57 -0
  98. data/lib/fairy/master/c-wc.rb +232 -0
  99. data/lib/fairy/master/job-interpriter.rb +19 -0
  100. data/lib/fairy/master/scheduler.rb +24 -0
  101. data/lib/fairy/master.rb +329 -0
  102. data/lib/fairy/node/addins.rb +19 -0
  103. data/lib/fairy/node/p-barrier.rb +95 -0
  104. data/lib/fairy/node/p-basic-group-by.rb +252 -0
  105. data/lib/fairy/node/p-direct-product.rb +153 -0
  106. data/lib/fairy/node/p-exec.rb +30 -0
  107. data/lib/fairy/node/p-filter.rb +363 -0
  108. data/lib/fairy/node/p-find.rb +111 -0
  109. data/lib/fairy/node/p-group-by.rb +1534 -0
  110. data/lib/fairy/node/p-here.rb +21 -0
  111. data/lib/fairy/node/p-identity.rb +24 -0
  112. data/lib/fairy/node/p-inject.rb +127 -0
  113. data/lib/fairy/node/p-input-file.rb +108 -0
  114. data/lib/fairy/node/p-input-iota.rb +39 -0
  115. data/lib/fairy/node/p-input-local-file.rb +61 -0
  116. data/lib/fairy/node/p-input-varray.rb +26 -0
  117. data/lib/fairy/node/p-io-filter.rb +28 -0
  118. data/lib/fairy/node/p-map.rb +40 -0
  119. data/lib/fairy/node/p-merger-group-by.rb +48 -0
  120. data/lib/fairy/node/p-output-file.rb +104 -0
  121. data/lib/fairy/node/p-output-local-file.rb +14 -0
  122. data/lib/fairy/node/p-output-null.rb +32 -0
  123. data/lib/fairy/node/p-output-varray.rb +41 -0
  124. data/lib/fairy/node/p-seg-join.rb +82 -0
  125. data/lib/fairy/node/p-seg-map.rb +34 -0
  126. data/lib/fairy/node/p-seg-split.rb +61 -0
  127. data/lib/fairy/node/p-seg-zip.rb +79 -0
  128. data/lib/fairy/node/p-select.rb +40 -0
  129. data/lib/fairy/node/p-single-exportable.rb +90 -0
  130. data/lib/fairy/node/p-sort.rb +195 -0
  131. data/lib/fairy/node/p-task.rb +113 -0
  132. data/lib/fairy/node/p-there.rb +44 -0
  133. data/lib/fairy/node/p-wc.rb +266 -0
  134. data/lib/fairy/node.rb +187 -0
  135. data/lib/fairy/processor.rb +510 -0
  136. data/lib/fairy/share/base-app.rb +114 -0
  137. data/lib/fairy/share/block-source.rb +234 -0
  138. data/lib/fairy/share/conf.rb +396 -0
  139. data/lib/fairy/share/debug.rb +21 -0
  140. data/lib/fairy/share/encoding.rb +17 -0
  141. data/lib/fairy/share/fast-tempfile.rb +93 -0
  142. data/lib/fairy/share/file-place.rb +176 -0
  143. data/lib/fairy/share/hash-1.rb +20 -0
  144. data/lib/fairy/share/hash-md5.rb +28 -0
  145. data/lib/fairy/share/hash-murmur.rb +69 -0
  146. data/lib/fairy/share/hash-rb18.rb +20 -0
  147. data/lib/fairy/share/hash-simple-hash.rb +28 -0
  148. data/lib/fairy/share/inspector.rb +16 -0
  149. data/lib/fairy/share/lc/exceptions.rb +82 -0
  150. data/lib/fairy/share/lc/ja/exceptions.rb +81 -0
  151. data/lib/fairy/share/locale.rb +17 -0
  152. data/lib/fairy/share/log.rb +215 -0
  153. data/lib/fairy/share/pool-dictionary.rb +53 -0
  154. data/lib/fairy/share/port-marshaled-queue.rb +347 -0
  155. data/lib/fairy/share/port.rb +1697 -0
  156. data/lib/fairy/share/reference.rb +45 -0
  157. data/lib/fairy/share/stdout.rb +56 -0
  158. data/lib/fairy/share/tr.rb +16 -0
  159. data/lib/fairy/share/varray.rb +147 -0
  160. data/lib/fairy/share/vfile.rb +183 -0
  161. data/lib/fairy/version.rb +8 -0
  162. data/lib/fairy.rb +206 -0
  163. data/sample/grep.rb +46 -0
  164. data/sample/ping.rb +19 -0
  165. data/sample/sort.rb +102 -0
  166. data/sample/wordcount.rb +61 -0
  167. data/spec/README +12 -0
  168. data/spec/fairy1_spec.rb +31 -0
  169. data/spec/fairy2_spec.rb +42 -0
  170. data/spec/fairy3_spec.rb +126 -0
  171. data/spec/fairy4_spec.rb +63 -0
  172. data/spec/fairy5_spec.rb +45 -0
  173. data/spec/fairy6_spec.rb +52 -0
  174. data/spec/fairy7_spec.rb +58 -0
  175. data/spec/fairy8_spec.rb +48 -0
  176. data/spec/mkdat.rb +148 -0
  177. data/spec/run_all.sh +65 -0
  178. data/test/testc.rb +7111 -0
  179. data/tools/cap_recipe/Capfile +144 -0
  180. data/tools/cap_recipe/cluster.yml.sample +14 -0
  181. data/tools/fairy_perf_graph.rb +444 -0
  182. data/tools/git-tag +44 -0
  183. data/tools/log-analysis.rb +62 -0
  184. data/tools/svn-ls-diff +38 -0
  185. data/tools/svn-tags +37 -0
  186. metadata +298 -0
@@ -0,0 +1,28 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "simple_hash"
7
+
8
+ module Fairy
9
+ module HValueGenerator
10
+ module SimpleHash
11
+ def SimpleHash.value(key)
12
+ case key
13
+ when String
14
+ Fairy::SimpleHash.hash(key)
15
+ else
16
+ ERR::Raise ERR::NoImpliment, "non-string key(#{key.inspect})"
17
+ end
18
+ end
19
+ # module_function :hash
20
+ end
21
+
22
+ def self.create_seed;end
23
+ def self.new(seed)
24
+ SimpleHash
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,16 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ module Fairy
7
+ class Inspector
8
+ def initialize(obj)
9
+ @obj = obj
10
+ end
11
+
12
+ def exec str
13
+ @obj.instance_eval str
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,82 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "e2mmap"
7
+
8
+ module Fairy
9
+
10
+ class BreakCreateNode<Exception;end
11
+ class AbortCreateNode<Exception;end
12
+
13
+ module ERR
14
+ extend Exception2MessageMapper
15
+
16
+ def_exception :CantAcceptBlock,
17
+ "Can't accept block"
18
+ def_exception :NodeNotArrived,
19
+ "Node don't arrived host(%s)"
20
+ def_exception :NoExistProcessorWithObject,
21
+ "No Exists Processor within object(%s)"
22
+
23
+ def_exception :NoSuchMode,
24
+ "No such mode(%s)"
25
+ def_exception :UnrecognizedOption,
26
+ "Unrecognized option(%s)"
27
+
28
+ def_exception :AlreadyAssignedVarriable,
29
+ "Already assigned varriable(%s)"
30
+
31
+ def_exception :NoAssignedVarriable,
32
+ "No assigned varriable(%s)"
33
+
34
+ def_exception :NoSupportClass,
35
+ "No support class(%s)"
36
+
37
+ def_exception :NoVFile,
38
+ "Not a vfile(%s)"
39
+
40
+ def_exception :IllegalVFile,
41
+ "Illegal vfile"
42
+
43
+ def_exception :NoImpliment,
44
+ "Yet, no impliment(%s)"
45
+
46
+ def_exception :NoSupportRubyEncoding,
47
+ "Ruby(%s) isn't support Encoding"
48
+
49
+ def_exception :NoTmpDir,
50
+ "No exists fairy tmp dir(CONF.TMP_DIR=%s)"
51
+
52
+ def_exception :NoLogDir,
53
+ "No exists fairy log dir(CONF.LOG_FILE=%s)"
54
+
55
+ def_exception :CantExecSubcmd,
56
+ "Can't execute subcommand(%s)"
57
+
58
+ module INTERNAL
59
+ extend Exception2MessageMapper
60
+
61
+ def_exception :NoSuchDefiledUserLevelFilter,
62
+ "No such defined user level filter(%s)"
63
+
64
+ def_exception :CantDefExport,
65
+ "Should have Service name except class(%s)"
66
+ def_exception :NoRegisterService,
67
+ "No register service(%s)"
68
+
69
+ def_exception :UndefinedPolicy, "Undefined policy(%s)"
70
+
71
+ def_exception :UndefinedBackendClass, "Undefined Backend Class"
72
+ def_exception :UndefinedNodeClass, "Undefined Node Class"
73
+
74
+ def_exception :ShouldDefineSubclass, "Should define subclass"
75
+
76
+ def_exception :ShouldNotSetInput, "Should not set input(%s)"
77
+
78
+ def_exception :MarshalQueueNotEmpty, "Marshal queue no empty"
79
+ end
80
+ end
81
+
82
+ end
@@ -0,0 +1,81 @@
1
+ # -*- coding: utf-8 -*-
2
+ # encoding: UTF-8
3
+ #
4
+ # Copyright (C) 2007-2010 Rakuten, Inc.
5
+ #
6
+
7
+ require "e2mmap"
8
+
9
+ module Fairy
10
+ extend Exception2MessageMapper
11
+
12
+ class BreakCreateNode<Exception;end
13
+ class AbortCreateNode<Exception;end
14
+
15
+ module ERR
16
+ extend Exception2MessageMapper
17
+
18
+ def_exception :CantAcceptBlock,
19
+ "ブロックは受け付けられません"
20
+ def_exception :NodeNotArrived,
21
+ "%s のホスト上でnodeが立ち上がっていません"
22
+ def_exception :NoExistProcessorWithObject,
23
+ "%s の存在するプロセッサは存在しません"
24
+ def_exception :NoSuchMode,
25
+ "そのモードはありません(%s)"
26
+
27
+ def_exception :UnrecognizedOption,
28
+ "そのオプションは分かりません(%s)"
29
+
30
+ def_exception :AlreadyAssignedVarriable,
31
+ "すでに変数(%s)は登録されています"
32
+ def_exception :NoAssignedVarriable,
33
+ "すでに変数(%s)は登録されていません"
34
+
35
+ def_exception :NoSupportClass,
36
+ "そのクラスはサポートしていません(%s)"
37
+
38
+ def_exception :NoVFile,
39
+ "VFileではありません(%s)"
40
+ def_exception :IllegalVFile,
41
+ "指定が間違っています"
42
+
43
+ def_exception :NoImpliment,
44
+ "まだ出来ていません(%s)"
45
+
46
+ def_exception :NoSupportRubyEncoding,
47
+ "Ruby(%s)ではエンコーディングの指定はできません"
48
+
49
+ def_exception :NoTmpDir,
50
+ "fairy用のテンポラリディレクトリが存在しません(CONF.TMP_DIR=%s)"
51
+
52
+ def_exception :NoLogDir,
53
+ "fairy用のログディレクトリが存在しません(CONF.LOG_FILE=%s)"
54
+
55
+ def_exception :CantExecSubcmd,
56
+ "サブコマンドが実行できません(%s)"
57
+
58
+ module INTERNAL
59
+ extend Exception2MessageMapper
60
+
61
+ def_exception :NoSuchDefiledUserLevelFilter,
62
+ "ユーザーレベルフィルタ(%s)は定義されていません"
63
+ def_exception :CantDefExport,
64
+ "クラス以外を登録するときにはサービス名が必要です(%s)"
65
+ def_exception :NoRegisterService,
66
+ "サービス名が登録されていません(%s)"
67
+
68
+ def_exception :UndefinedPolicy, "未サポートのポリシー(%s)"
69
+
70
+ def_exception :UndefinedBackendClass, "Backend Classが定義されていません"
71
+ def_exception :UndefinedNodeClass, "Node Classが定義されていません"
72
+
73
+ def_exception :ShouldDefineSubclass, "サブクラスで定義してください"
74
+
75
+ def_exception :ShouldNotSetInput, "インプットフィルタ(%s)にはinputを設定出来ません"
76
+
77
+ def_exception :MarshalQueueNotEmpty, "Marshal queue は Emptyでなくてはなりません"
78
+ end
79
+ end
80
+
81
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ begin
7
+ require 'irb/src_encoding'
8
+ require "irb/magic-file"
9
+ rescue LoadError
10
+ end
11
+ require "irb/locale"
12
+
13
+ module Fairy
14
+ LC_MESSAGES = IRB::Locale.new
15
+ LC_MESSAGES.load(CONF.LIB+"/fairy/share/exceptions.rb")
16
+ end
17
+
@@ -0,0 +1,215 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "thread"
7
+ require "stringio"
8
+
9
+ require "forwardable"
10
+
11
+ require "deep-connect/future"
12
+
13
+ module Fairy
14
+ class Log
15
+
16
+ LEVELS = [:FATAL, :ERROR, :WARN, :INFO, :VERBOSE, :DEBUG]
17
+ MESSAGE_LEVEL = CONF.LOG_LEVEL
18
+
19
+ def initialize
20
+ @logger = nil
21
+ @host = `hostname`.chomp
22
+ @type = $0
23
+ @pid = nil
24
+
25
+ @export_thread = nil
26
+
27
+ @mutex = Mutex.new
28
+
29
+ @puts_mutex = Mutex.new
30
+
31
+ @buffer = []
32
+ @buffer_mutex = Mutex.new
33
+ @buffer_cv = ConditionVariable.new
34
+
35
+ set_local_output_dev
36
+
37
+ start_exporter
38
+ end
39
+
40
+ def start_exporter
41
+ @export_thread = Thread.start {
42
+ loop do
43
+ buf = nil
44
+ @buffer_mutex.synchronize do
45
+ while @buffer.empty?
46
+ @buffer_cv.wait(@buffer_mutex)
47
+ end
48
+ buf = @buffer.dup
49
+ @buffer.clear
50
+ end
51
+ @logger.messages(buf)
52
+ end
53
+ }
54
+ end
55
+
56
+ def set_local_output_dev(dev = CONF.LOG_LOCAL_OUTPUT_DEV)
57
+ case dev
58
+ when nil
59
+ @LOCAL_OUTPUT_DEV = nil
60
+ when String, Symbol
61
+ begin
62
+ @LOCAL_OUTPUT_DEV = eval(dev.to_s)
63
+ rescue
64
+ Log::warn(self, "Can't set local output dev")
65
+ Log::warn(self, "Use old local output dev")
66
+ end
67
+ else
68
+ @LOCAL_OUTPUT_DEV = dev
69
+ end
70
+ end
71
+
72
+ @the_log = Log.new unless @the_log
73
+
74
+ class<<self
75
+ extend Forwardable
76
+
77
+ def_delegator :@the_log, :set_local_output_dev
78
+
79
+ def method_added(method)
80
+ (class<<self;self;end).def_delegator :@the_log, method
81
+ end
82
+ end
83
+
84
+ attr_accessor :logger
85
+ attr_reader :host
86
+ attr_accessor :type
87
+ attr_accessor :pid
88
+ attr_accessor :LOCAL_OUTPUT_DEV
89
+
90
+ def stop_export
91
+ @export_thread.exit
92
+ end
93
+
94
+ def log(sender, str = nil, &block)
95
+ bt = caller(0).select{|l| /fairy.*(share\/log)|__FORWARDABLE__|forwardable/ !~ l}
96
+ bt.first =~ /\/([^\/]*\.rb):([0-9]+):in `(.*)'$/
97
+ file_name = $1
98
+ line_no = $2
99
+ method = $3
100
+
101
+ if sender.kind_of?(String)
102
+ str = sender
103
+ sender_type = "[UNDEF]"
104
+ else
105
+ begin
106
+ sender_type = sender.log_id
107
+ rescue
108
+ sender_type = sender.class.name.sub(/Fairy::/, "")
109
+ end
110
+ end
111
+
112
+ time = Time.now
113
+ prefix = time.strftime("%Y/%m/%d %H:%M:%S")
114
+ prefix.concat sprintf(".%06d %s ", time.usec, @host)
115
+ mes = sprintf("%s%s%s %s[%s] %s#%s: ",
116
+ @type,
117
+ @pid ? "\##{@pid}": "",
118
+ Thread.current["name"] ? Thread.current["name"]: "",
119
+ file_name, line_no,
120
+ sender_type, method)
121
+ if block_given?
122
+ sio = StringIO.new(mes, "a+")
123
+ yield sio
124
+ else
125
+ mes.concat str
126
+ end
127
+ mes.chomp!
128
+
129
+ if @LOCAL_OUTPUT_DEV
130
+ @puts_mutex.synchronize do
131
+ begin
132
+ @LOCAL_OUTPUT_DEV.local_stdout.puts mes
133
+ rescue
134
+ @LOCAL_OUTPUT_DEV.puts mes
135
+ end
136
+ end
137
+ end
138
+
139
+ if @logger
140
+ @buffer_mutex.synchronize do
141
+ @buffer.push prefix+mes
142
+ @buffer_cv.signal
143
+ end
144
+ else
145
+ $stdout.puts "****Loggerが設定されていません****"
146
+ end
147
+ end
148
+ #alias stdout_puts puts
149
+ alias puts log
150
+
151
+ # Log::log(sender, format, args...)
152
+ # Log::log(format, args,...)
153
+ def logf(sender, format=nil, *args)
154
+ log(sender, sprintf(format, *args))
155
+ end
156
+ alias printf logf
157
+
158
+ # Log::log_exception(sender, exception, level = :WARN)
159
+ # Log::log_exception(exception, level = :WARN)
160
+ def log_exception(sender = $!, exception=$!)
161
+ if sender.kind_of?(Exception)
162
+ exception = sender
163
+ sender = "UNDEF"
164
+ end
165
+ log(sender) do |sio|
166
+ sio.puts "#{exception.message}: #{exception.class}"
167
+ for l in exception.backtrace
168
+ sio.puts l
169
+ end
170
+ end
171
+ end
172
+
173
+ def log_backtrace(sender = nil)
174
+ log(sender) do |sio|
175
+ for l in caller(0)
176
+ sio.puts l
177
+ end
178
+ end
179
+ end
180
+
181
+ def nop(*args); end
182
+
183
+ range = LEVELS[0..LEVELS.index(MESSAGE_LEVEL)]
184
+ if range
185
+ for level in range
186
+ method = level.id2name.downcase
187
+ alias_method method, :log
188
+ alias_method method+"f", :logf
189
+ alias_method method+"_exception", :log_exception
190
+ alias_method method+"_backtrace", :log_backtrace
191
+ end
192
+ end
193
+
194
+ range = LEVELS[LEVELS.index(MESSAGE_LEVEL)+1.. -1]
195
+ if range
196
+ for level in range
197
+ method = level.id2name.downcase
198
+ alias_method method, :nop
199
+ alias_method method+"f", :nop
200
+ alias_method method+"_exception", :nop
201
+ alias_method method+"_backtrace", :nop
202
+ end
203
+ end
204
+
205
+ if MESSAGE_LEVEL == :DEBUG
206
+ def debug_p(*objs)
207
+ for o in objs
208
+ log(self, o.inspect)
209
+ end
210
+ end
211
+ else
212
+ def debug_p(*args);end
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ module Fairy
7
+ class PoolDictionary
8
+
9
+ def initialize
10
+ @pool = {}
11
+ @pool_mutex = Mutex.new
12
+ @pool_cv = ConditionVariable.new
13
+ end
14
+
15
+ attr_reader :pool_mutex
16
+ attr_reader :pool_cv
17
+
18
+ def def_variable(vname, value = nil)
19
+ @pool_mutex.synchronize do
20
+ if @pool.key?(vname)
21
+ ERR::Raise ERR::AlreadyAssignedVarriable, vname
22
+ end
23
+ case value
24
+ when DeepConnect::Reference
25
+ @pool[vname] = value.dc_deep_copy
26
+ else
27
+ @pool[vname] = value
28
+ end
29
+
30
+ instance_eval "def #{vname}; self[:#{vname}]; end"
31
+ instance_eval "def #{vname}=(v); self[:#{vname}]=v; end"
32
+ end
33
+ end
34
+ def [](name)
35
+ @pool_mutex.synchronize do
36
+ ERR::Raise NoAssignedVarriable, name unless @pool.key?(name)
37
+ @pool[name]
38
+ end
39
+ end
40
+
41
+ def []=(name, value)
42
+ @pool_mutex.synchronize do
43
+ ERR::Raise NoAssignedVarriable, name unless @pool.key?(name)
44
+ case value
45
+ when DeepConnect::Reference
46
+ @pool[name] = value.dc_deep_copy
47
+ else
48
+ @pool[name] = value
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end