pione 0.1.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.
- data/.gitignore +14 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +94 -0
- data/Rakefile +118 -0
- data/bin/pione-broker +5 -0
- data/bin/pione-clean +5 -0
- data/bin/pione-client +5 -0
- data/bin/pione-eval +111 -0
- data/bin/pione-relay +5 -0
- data/bin/pione-relay-account-db +5 -0
- data/bin/pione-relay-client-db +5 -0
- data/bin/pione-search-log +30 -0
- data/bin/pione-syntax-checker +5 -0
- data/bin/pione-task-worker +5 -0
- data/bin/pione-tuple-space-provider +5 -0
- data/bin/pione-tuple-space-receiver +5 -0
- data/bin/pione-tuple-space-viewer +5 -0
- data/demo/demo.rb +311 -0
- data/demo/public/base.css +94 -0
- data/demo/public/demo.js +107 -0
- data/demo/public/index.html +91 -0
- data/demo/public/jquery-1.8.3.min.js +2 -0
- data/example/CountChar/CountChar.pione +64 -0
- data/example/CountChar/misc/CountChar.rb +22 -0
- data/example/CountChar/text/aidokushono_insho.txt +32 -0
- data/example/CountChar/text/aikokuka_shokan.txt +108 -0
- data/example/CountChar/text/carlyle_hakubutsukan.txt +58 -0
- data/example/CountChar/text/dark_minister.txt +2440 -0
- data/example/CountChar/text/kaikano_otto.txt +61 -0
- data/example/CountChar/text/kaikon.txt +30 -0
- data/example/CountChar/text/nagashimano_shi.txt +45 -0
- data/example/CountChar/text/saikachibuchi.txt +80 -0
- data/example/CountChar/text/saikonihonno_josei.txt +91 -0
- data/example/CountChar/text/taishojugonenno_bundan.txt +21 -0
- data/example/FeatureExample/FeatureExample.pione +7 -0
- data/example/Fib/Fib.pione +56 -0
- data/example/Fib/FibBC.pione +56 -0
- data/example/HelloWorld/HelloWorld.pione +5 -0
- data/example/LucasNumber/LucasNumber.pione +64 -0
- data/example/MakePair/MakePair.pione +14 -0
- data/example/MakePair/data/1.i +0 -0
- data/example/MakePair/data/2.i +0 -0
- data/example/MakePair/data/3.i +0 -0
- data/example/MakePair/data/4.i +0 -0
- data/example/MakePair/data/5.i +0 -0
- data/example/SieveOfEratosthenes/SieveOfEratosthenes.pione +61 -0
- data/example/SingleParticlesWithRef/Makefile +289 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.Makefile +153 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.pione +116 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRefFull.pione +400 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift.pdb +3381 -0
- data/example/SingleParticlesWithRef/data/all.ref2d +0 -0
- data/example/SingleParticlesWithRef/data/all.ref3d +0 -0
- data/example/Sum/Sum.pione +52 -0
- data/example/SyntaxError/call_rule_error.pione +6 -0
- data/example/SyntaxError/feature_line_error.pione +7 -0
- data/example/SyntaxError/flow_block_error.pione +5 -0
- data/example/SyntaxError/input_line_error.pione +6 -0
- data/example/SyntaxError/invalid_rule_name.pione +6 -0
- data/example/SyntaxError/param_line_error.pione +7 -0
- data/example/SyntaxError/variable-binding-error.pione +11 -0
- data/lib/pione.rb +241 -0
- data/lib/pione/agent/basic-agent.rb +333 -0
- data/lib/pione/agent/broker.rb +274 -0
- data/lib/pione/agent/command-listener.rb +47 -0
- data/lib/pione/agent/input-generator.rb +194 -0
- data/lib/pione/agent/logger.rb +65 -0
- data/lib/pione/agent/process-manager.rb +38 -0
- data/lib/pione/agent/rule-provider.rb +64 -0
- data/lib/pione/agent/task-worker.rb +274 -0
- data/lib/pione/agent/trivial-routine-worker.rb +28 -0
- data/lib/pione/agent/tuple-space-client.rb +146 -0
- data/lib/pione/agent/tuple-space-server-client-life-checker.rb +29 -0
- data/lib/pione/command-option/basic-option.rb +42 -0
- data/lib/pione/command-option/child-process-option.rb +17 -0
- data/lib/pione/command-option/common-option.rb +29 -0
- data/lib/pione/command-option/daemon-option.rb +12 -0
- data/lib/pione/command-option/presence-notifier-option.rb +15 -0
- data/lib/pione/command-option/task-worker-owner-option.rb +17 -0
- data/lib/pione/command-option/tuple-space-provider-option.rb +26 -0
- data/lib/pione/command-option/tuple-space-provider-owner-option.rb +16 -0
- data/lib/pione/command-option/tuple-space-receiver-option.rb +12 -0
- data/lib/pione/command/basic-command.rb +126 -0
- data/lib/pione/command/child-process.rb +43 -0
- data/lib/pione/command/daemon-process.rb +18 -0
- data/lib/pione/command/front-owner-command.rb +37 -0
- data/lib/pione/command/pione-broker.rb +53 -0
- data/lib/pione/command/pione-clean.rb +16 -0
- data/lib/pione/command/pione-client.rb +273 -0
- data/lib/pione/command/pione-relay-account-db.rb +85 -0
- data/lib/pione/command/pione-relay-client-db.rb +80 -0
- data/lib/pione/command/pione-relay.rb +47 -0
- data/lib/pione/command/pione-syntax-checker.rb +103 -0
- data/lib/pione/command/pione-task-worker.rb +123 -0
- data/lib/pione/command/pione-tuple-space-provider.rb +87 -0
- data/lib/pione/command/pione-tuple-space-receiver.rb +55 -0
- data/lib/pione/command/pione-tuple-space-viewer.rb +151 -0
- data/lib/pione/command/tuple-space-provider-owner.rb +6 -0
- data/lib/pione/front/basic-front.rb +64 -0
- data/lib/pione/front/broker-front.rb +30 -0
- data/lib/pione/front/client-front.rb +28 -0
- data/lib/pione/front/relay-front.rb +19 -0
- data/lib/pione/front/task-worker-front.rb +16 -0
- data/lib/pione/front/task-worker-owner.rb +42 -0
- data/lib/pione/front/tuple-space-provider-front.rb +22 -0
- data/lib/pione/front/tuple-space-provider-owner.rb +11 -0
- data/lib/pione/front/tuple-space-receiver-front.rb +18 -0
- data/lib/pione/model/assignment.rb +89 -0
- data/lib/pione/model/basic-model.rb +395 -0
- data/lib/pione/model/binary-operator.rb +80 -0
- data/lib/pione/model/block.rb +233 -0
- data/lib/pione/model/boolean.rb +138 -0
- data/lib/pione/model/call-rule.rb +69 -0
- data/lib/pione/model/data-expr.rb +360 -0
- data/lib/pione/model/feature-expr.rb +794 -0
- data/lib/pione/model/float.rb +107 -0
- data/lib/pione/model/integer.rb +140 -0
- data/lib/pione/model/list.rb +104 -0
- data/lib/pione/model/message.rb +80 -0
- data/lib/pione/model/package.rb +48 -0
- data/lib/pione/model/parameters.rb +282 -0
- data/lib/pione/model/rule-expr.rb +120 -0
- data/lib/pione/model/rule-io.rb +166 -0
- data/lib/pione/model/rule.rb +294 -0
- data/lib/pione/model/string.rb +111 -0
- data/lib/pione/model/undefined-value.rb +24 -0
- data/lib/pione/model/variable-table.rb +315 -0
- data/lib/pione/model/variable.rb +87 -0
- data/lib/pione/parser/block-parser.rb +83 -0
- data/lib/pione/parser/common-parser.rb +145 -0
- data/lib/pione/parser/document-parser.rb +58 -0
- data/lib/pione/parser/error-message.yml +4 -0
- data/lib/pione/parser/expr-parser.rb +266 -0
- data/lib/pione/parser/feature-expr-parser.rb +105 -0
- data/lib/pione/parser/flow-element-parser.rb +181 -0
- data/lib/pione/parser/literal-parser.rb +182 -0
- data/lib/pione/parser/rule-definition-parser.rb +163 -0
- data/lib/pione/parser/syntax-error.rb +61 -0
- data/lib/pione/patch/array-patch.rb +3 -0
- data/lib/pione/patch/drb-patch.rb +467 -0
- data/lib/pione/patch/monitor-patch.rb +16 -0
- data/lib/pione/patch/rinda-patch.rb +759 -0
- data/lib/pione/patch/uri-patch.rb +66 -0
- data/lib/pione/relay/receiver-socket.rb +69 -0
- data/lib/pione/relay/relay-account-db.rb +55 -0
- data/lib/pione/relay/relay-client-db.rb +53 -0
- data/lib/pione/relay/relay-socket.rb +215 -0
- data/lib/pione/relay/trampoline.rb +22 -0
- data/lib/pione/relay/transmitter-socket.rb +167 -0
- data/lib/pione/resource/basic-resource.rb +92 -0
- data/lib/pione/resource/dropbox-resource.rb +106 -0
- data/lib/pione/resource/ftp.rb +84 -0
- data/lib/pione/resource/local.rb +113 -0
- data/lib/pione/rule-handler/action-handler.rb +184 -0
- data/lib/pione/rule-handler/basic-handler.rb +217 -0
- data/lib/pione/rule-handler/flow-handler.rb +339 -0
- data/lib/pione/rule-handler/root-handler.rb +23 -0
- data/lib/pione/rule-handler/system-handler.rb +13 -0
- data/lib/pione/system/common.rb +22 -0
- data/lib/pione/system/config.rb +20 -0
- data/lib/pione/system/document.rb +81 -0
- data/lib/pione/system/file-cache.rb +150 -0
- data/lib/pione/system/global.rb +346 -0
- data/lib/pione/system/identifier.rb +61 -0
- data/lib/pione/system/init.rb +16 -0
- data/lib/pione/system/object.rb +35 -0
- data/lib/pione/transformer/block-transformer.rb +23 -0
- data/lib/pione/transformer/document-transformer.rb +36 -0
- data/lib/pione/transformer/expr-transformer.rb +89 -0
- data/lib/pione/transformer/feature-expr-transformer.rb +56 -0
- data/lib/pione/transformer/flow-element-transformer.rb +66 -0
- data/lib/pione/transformer/literal-transformer.rb +76 -0
- data/lib/pione/transformer/rule-definition-transformer.rb +62 -0
- data/lib/pione/transformer/transformer-module.rb +37 -0
- data/lib/pione/tuple-space/data-finder.rb +165 -0
- data/lib/pione/tuple-space/presence-notifier.rb +83 -0
- data/lib/pione/tuple-space/relay.rb +9 -0
- data/lib/pione/tuple-space/tuple-space-provider.rb +85 -0
- data/lib/pione/tuple-space/tuple-space-receiver.rb +140 -0
- data/lib/pione/tuple-space/tuple-space-server-interface.rb +60 -0
- data/lib/pione/tuple-space/tuple-space-server.rb +156 -0
- data/lib/pione/tuple-space/update-criteria.rb +96 -0
- data/lib/pione/tuple/agent-tuple.rb +10 -0
- data/lib/pione/tuple/attribute-tuple.rb +7 -0
- data/lib/pione/tuple/base-uri-tuple.rb +9 -0
- data/lib/pione/tuple/basic-tuple.rb +317 -0
- data/lib/pione/tuple/bye-tuple.rb +9 -0
- data/lib/pione/tuple/command-tuple.rb +9 -0
- data/lib/pione/tuple/data-tuple.rb +18 -0
- data/lib/pione/tuple/dry-run-tuple.rb +8 -0
- data/lib/pione/tuple/exception-tuple.rb +11 -0
- data/lib/pione/tuple/finished-tuple.rb +17 -0
- data/lib/pione/tuple/foreground-tuple.rb +7 -0
- data/lib/pione/tuple/log-tuple.rb +14 -0
- data/lib/pione/tuple/process-info-tuple.rb +9 -0
- data/lib/pione/tuple/request-rule-tuple.rb +9 -0
- data/lib/pione/tuple/rule-tuple.rb +10 -0
- data/lib/pione/tuple/shift-tuple.rb +13 -0
- data/lib/pione/tuple/task-tuple.rb +36 -0
- data/lib/pione/tuple/task-worker-resource-tuple.rb +9 -0
- data/lib/pione/tuple/working-tuple.rb +13 -0
- data/lib/pione/uri-scheme/basic-scheme.rb +40 -0
- data/lib/pione/uri-scheme/broadcast-scheme.rb +11 -0
- data/lib/pione/uri-scheme/dropbox-scheme.rb +9 -0
- data/lib/pione/uri-scheme/local-scheme.rb +28 -0
- data/lib/pione/util/error-report.rb +12 -0
- data/lib/pione/util/log.rb +79 -0
- data/lib/pione/util/message.rb +155 -0
- data/lib/pione/util/misc.rb +73 -0
- data/lib/pione/util/terminal.rb +78 -0
- data/lib/pione/util/waiter-table.rb +53 -0
- data/lib/pione/version.rb +3 -0
- data/misc/env.sh +2 -0
- data/misc/test-drb-stop-service.rb +34 -0
- data/misc/test-ensure-and-thread-kill.rb +40 -0
- data/misc/test-many-waiters-client.rb +56 -0
- data/misc/test-many-waiters-server.rb +14 -0
- data/misc/write_and_take_test.png +0 -0
- data/misc/write_and_take_test.rb +36 -0
- data/pione.gemspec +49 -0
- data/test/agent/spec_basic-agent.rb +170 -0
- data/test/agent/spec_broker.rb +36 -0
- data/test/agent/spec_command-listener.rb +30 -0
- data/test/agent/spec_input-generator.rb +123 -0
- data/test/agent/spec_logger.rb +71 -0
- data/test/agent/spec_rule-provider.rb +65 -0
- data/test/agent/spec_task-worker.rb +307 -0
- data/test/agent/spec_tuple-space-client.rb +30 -0
- data/test/model/spec_assignment.rb +51 -0
- data/test/model/spec_binary-operator.rb +39 -0
- data/test/model/spec_block.rb +154 -0
- data/test/model/spec_boolean.rb +115 -0
- data/test/model/spec_call-rule.rb +23 -0
- data/test/model/spec_data-expr.rb +312 -0
- data/test/model/spec_feature-expr.rb +359 -0
- data/test/model/spec_feature-expr.yml +16 -0
- data/test/model/spec_float.rb +141 -0
- data/test/model/spec_integer.rb +141 -0
- data/test/model/spec_list.rb +26 -0
- data/test/model/spec_message.rb +42 -0
- data/test/model/spec_package.rb +15 -0
- data/test/model/spec_parameters.rb +148 -0
- data/test/model/spec_rule-expr.rb +66 -0
- data/test/model/spec_rule-io.rb +32 -0
- data/test/model/spec_rule.rb +158 -0
- data/test/model/spec_string.rb +106 -0
- data/test/model/spec_variable-table.rb +117 -0
- data/test/model/spec_variable.rb +84 -0
- data/test/parser/spec_block-parser.rb +5 -0
- data/test/parser/spec_block-parser.yml +85 -0
- data/test/parser/spec_common-parser.rb +281 -0
- data/test/parser/spec_expr-parser.rb +6 -0
- data/test/parser/spec_expr-parser.yml +82 -0
- data/test/parser/spec_feature-expr-parser.rb +32 -0
- data/test/parser/spec_feature-expr-parser.yml +25 -0
- data/test/parser/spec_flow-element-parser.rb +5 -0
- data/test/parser/spec_flow-element-parser.yml +180 -0
- data/test/parser/spec_literal-parser.rb +5 -0
- data/test/parser/spec_literal-parser.yml +123 -0
- data/test/parser/spec_rule-definition-parser.rb +5 -0
- data/test/parser/spec_rule-definition-parser.yml +93 -0
- data/test/patch/spec_rinda-patch.rb +32 -0
- data/test/patch/spec_uri-patch.rb +23 -0
- data/test/rule-handler/spec_action-handler.rb +135 -0
- data/test/rule-handler/spec_flow-handler.rb +127 -0
- data/test/spec_common.rb +14 -0
- data/test/spec_data-finder.rb +88 -0
- data/test/spec_data-finder.yml +115 -0
- data/test/spec_document.rb +76 -0
- data/test/spec_identifier.rb +29 -0
- data/test/spec_log.rb +52 -0
- data/test/spec_object.rb +20 -0
- data/test/spec_resource.rb +73 -0
- data/test/spec_update-criteria.rb +83 -0
- data/test/test-util.rb +223 -0
- data/test/transformer/spec_block-transformer.rb +26 -0
- data/test/transformer/spec_expr-transformer.rb +106 -0
- data/test/transformer/spec_feature-expr-transformer.rb +21 -0
- data/test/transformer/spec_flow-element-transformer.rb +154 -0
- data/test/transformer/spec_literal-transformer.rb +58 -0
- data/test/transformer/spec_rule-definition-transformer.rb +168 -0
- data/test/tuple-space/spec_tuple-space-provider.rb +36 -0
- data/test/tuple-space/spec_tuple-space-receiver.rb +32 -0
- data/test/tuple-space/spec_tuple-space-server.rb +49 -0
- data/test/tuple/spec_basic-tuple.rb +87 -0
- data/test/tuple/spec_data-tuple.rb +85 -0
- data/test/tuple/spec_finished-tuple.rb +61 -0
- data/test/tuple/spec_task-tuple.rb +127 -0
- data/test/tuple/spec_working-tuple.rb +58 -0
- data/test/uri-scheme/spec_broadcast-scheme.rb +40 -0
- data/test/uri-scheme/spec_dropbox-scheme.rb +31 -0
- data/test/uri-scheme/spec_local-scheme.rb +69 -0
- metadata +660 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Transformer
|
|
3
|
+
module RuleDefinitionTransformer
|
|
4
|
+
include TransformerModule
|
|
5
|
+
|
|
6
|
+
def check_model_type(obj, pione_model_type)
|
|
7
|
+
pione_model_type.match(obj.pione_mode_type)
|
|
8
|
+
end
|
|
9
|
+
module_function :check_model_type
|
|
10
|
+
|
|
11
|
+
# rule_definition
|
|
12
|
+
rule(:rule_definition => {
|
|
13
|
+
:rule_header => simple(:rule_expr),
|
|
14
|
+
:rule_conditions => sequence(:conditions),
|
|
15
|
+
:block => simple(:block) }) {
|
|
16
|
+
inputs = conditions.select{|c| c.type == :input}.map{|c| c.obj}
|
|
17
|
+
outputs = conditions.select{|c| c.type == :output}.map{|c| c.obj}
|
|
18
|
+
params = Parameters.merge(
|
|
19
|
+
*conditions.select{|c| c.type == :param}.map{|c| c.obj}
|
|
20
|
+
)
|
|
21
|
+
features = Feature::AndExpr.new(
|
|
22
|
+
*conditions.select{|c| c.type == :feature}.map{|c| c.obj}
|
|
23
|
+
)
|
|
24
|
+
condition = RuleCondition.new(inputs, outputs, params, features)
|
|
25
|
+
case block
|
|
26
|
+
when ActionBlock
|
|
27
|
+
ActionRule
|
|
28
|
+
when FlowBlock
|
|
29
|
+
FlowRule
|
|
30
|
+
end.new(rule_expr, condition, block)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
ConditionLine = Struct.new(:type, :obj)
|
|
34
|
+
|
|
35
|
+
# input_line
|
|
36
|
+
rule(:input_line => simple(:data_expr)) {
|
|
37
|
+
TypeDataExpr.check(data_expr)
|
|
38
|
+
ConditionLine.new(:input, data_expr)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# output_line
|
|
42
|
+
rule(:output_line => simple(:data_expr)) {
|
|
43
|
+
TypeDataExpr.check(data_expr)
|
|
44
|
+
ConditionLine.new(:output, data_expr)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# param_line
|
|
48
|
+
rule(:param_line => simple(:param)) {
|
|
49
|
+
unless TypeAssignment.match(param) or TypeParameters.match(param)
|
|
50
|
+
raise PioneModelTypeError.new(param, TypeAssignment)
|
|
51
|
+
end
|
|
52
|
+
ConditionLine.new(:param, param)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# feature_line
|
|
56
|
+
rule(:feature_line => simple(:feature)) {
|
|
57
|
+
TypeFeature.check(feature)
|
|
58
|
+
ConditionLine.new(:feature, feature)
|
|
59
|
+
}
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Transformer
|
|
3
|
+
module TransformerModule
|
|
4
|
+
class << self
|
|
5
|
+
def included(mod)
|
|
6
|
+
singleton = class << mod; self; end
|
|
7
|
+
create_pair_by(Parslet, Parslet::Transform).each do |name, orig|
|
|
8
|
+
singleton.__send__(:define_method, name) do |*args, &b|
|
|
9
|
+
orig.__send__(name, *args, &b)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class << mod
|
|
14
|
+
def included(klass)
|
|
15
|
+
name = :@__transform_rules
|
|
16
|
+
klass_rules = klass.instance_variable_get(name)
|
|
17
|
+
klass_rules = klass_rules ? klass_rules + rules : rules
|
|
18
|
+
klass.instance_variable_set(name, klass_rules)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def create_pair_by(*mods)
|
|
26
|
+
mods.inject([]) do |list, mod|
|
|
27
|
+
list += create_pair(mod)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def create_pair(mod)
|
|
32
|
+
(mod.methods.sort - Object.methods.sort).map{|m| [m, mod]}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
# DataFinder finds data tuples from tuple space server.
|
|
3
|
+
class DataFinder < PioneObject
|
|
4
|
+
|
|
5
|
+
# DataFinderResult represents an element of DataFinder#find results. The
|
|
6
|
+
# attribute +combination+ is a rule inputs combination and +variable_table+
|
|
7
|
+
# is a variable table including variables for found date set.
|
|
8
|
+
class DataFinderResult < Struct.new(:combination, :variable_table)
|
|
9
|
+
# Returns true if the combination is empty.
|
|
10
|
+
# @return [Boolean]
|
|
11
|
+
# true if the result is empty
|
|
12
|
+
def empty?
|
|
13
|
+
self[:combination].empty?
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
include TupleSpaceServerInterface
|
|
18
|
+
|
|
19
|
+
# Creates a new finder.
|
|
20
|
+
# @param [TupleSpaceServer] ts_server
|
|
21
|
+
# tuple space server
|
|
22
|
+
# @param [String] domain
|
|
23
|
+
# target data domain to find
|
|
24
|
+
def initialize(ts_server, domain)
|
|
25
|
+
set_tuple_space_server(ts_server)
|
|
26
|
+
@domain = domain
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Find tuple combinations by data expressions from tuple space server.
|
|
30
|
+
# @param [Symbol] type
|
|
31
|
+
# :input if target date is for input or :output
|
|
32
|
+
# @param [DataExpr] exprs
|
|
33
|
+
# data-expr list
|
|
34
|
+
# @param [VariableTable] vtable
|
|
35
|
+
# variabel table
|
|
36
|
+
# @return [DataFinderResult]
|
|
37
|
+
# result data set
|
|
38
|
+
def find(type, exprs, vtable)
|
|
39
|
+
raise ArgumentError.new(vtable) unless vtable.kind_of?(VariableTable)
|
|
40
|
+
|
|
41
|
+
# variable table
|
|
42
|
+
new_vtable = VariableTable.new(vtable)
|
|
43
|
+
case type
|
|
44
|
+
when :input
|
|
45
|
+
# alias for I
|
|
46
|
+
new_vtable.set(Variable.new("INPUT"), Variable.new("I"))
|
|
47
|
+
when :output
|
|
48
|
+
# alias for O
|
|
49
|
+
new_vtable.set(Variable.new("OUTPUT"), Variable.new("O"))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
find_rec(type, exprs, 1, new_vtable)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
# Finds all data tuples by the expression from a tuple space server.
|
|
58
|
+
# @param [DataExpr] expr
|
|
59
|
+
# query expression of data
|
|
60
|
+
# @return [DataFinderResult]
|
|
61
|
+
# query result
|
|
62
|
+
# @api private
|
|
63
|
+
def find_by_expr(expr)
|
|
64
|
+
expr = DataExpr.new(expr) if expr.kind_of?(String)
|
|
65
|
+
query = Tuple[:data].new(name: expr, domain: @domain)
|
|
66
|
+
return tuple_space_server.read_all(query)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Find input tuple combinatioins recursively.
|
|
70
|
+
def find_rec(type, exprs, index, vtable)
|
|
71
|
+
# return empty when we reach the recuirsion end
|
|
72
|
+
return [DataFinderResult.new([], vtable)] if exprs.empty?
|
|
73
|
+
|
|
74
|
+
# expand variables and compile to regular expression
|
|
75
|
+
head = exprs.first.eval(vtable)
|
|
76
|
+
tail = exprs.drop(1)
|
|
77
|
+
|
|
78
|
+
# find an input data by name from tuple space server
|
|
79
|
+
tuples = find_by_expr(head)
|
|
80
|
+
|
|
81
|
+
# make combination results
|
|
82
|
+
prefix = (type == :input ? "I" : "O")
|
|
83
|
+
if head.all?
|
|
84
|
+
# case all modifier
|
|
85
|
+
new_vtable =
|
|
86
|
+
make_auto_variables_by_all(prefix, head, tuples, vtable)
|
|
87
|
+
unless tuples.empty?
|
|
88
|
+
return find_rec_sub(type, tail, index, tuples, new_vtable)
|
|
89
|
+
end
|
|
90
|
+
else
|
|
91
|
+
# case each modifier
|
|
92
|
+
return tuples.map {|tuple|
|
|
93
|
+
args = [prefix, head, tuple, vtable, index]
|
|
94
|
+
new_vtable = make_auto_variables_by_each(*args)
|
|
95
|
+
find_rec_sub(type, tail, index, tuple, new_vtable)
|
|
96
|
+
}.flatten
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# available combinations were not found
|
|
100
|
+
return []
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @api private
|
|
104
|
+
def find_rec_sub(type, tail, index, data, vtable)
|
|
105
|
+
find_rec(type, tail, index+1, vtable).map do |res|
|
|
106
|
+
new_combination = res.combination.unshift(data)
|
|
107
|
+
new_vtable = res.variable_table
|
|
108
|
+
DataFinderResult.new(new_combination, new_vtable)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Make auto-variables by the name modified 'all'.
|
|
113
|
+
# @api private
|
|
114
|
+
def make_auto_variables_by_all(prefix, expr, tuples, vtable)
|
|
115
|
+
# create new table
|
|
116
|
+
new_vtable = VariableTable.new(vtable)
|
|
117
|
+
# variable
|
|
118
|
+
var = Variable.new(prefix)
|
|
119
|
+
|
|
120
|
+
# setup rule-io list
|
|
121
|
+
list = new_vtable.get(var)
|
|
122
|
+
list = RuleIOList.new unless list
|
|
123
|
+
io_list = RuleIOList.new
|
|
124
|
+
new_vtable.set!(var, list.add(io_list))
|
|
125
|
+
|
|
126
|
+
# convert each tuples
|
|
127
|
+
tuples.each do |tuple, i|
|
|
128
|
+
elt = RuleIOElement.new(PioneString.new(tuple.name))
|
|
129
|
+
elt.uri = PioneString.new(tuple.uri)
|
|
130
|
+
elt.match = PioneList.new(
|
|
131
|
+
*expr.match(tuple.name).to_a.map{|m| PioneString.new(m)}
|
|
132
|
+
)
|
|
133
|
+
io_list.add!(elt)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
return new_vtable
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Make auto-variables by the name modified 'each'.
|
|
140
|
+
# @api private
|
|
141
|
+
def make_auto_variables_by_each(prefix, expr, tuple, vtable, index)
|
|
142
|
+
# create new table
|
|
143
|
+
new_vtable = VariableTable.new(vtable)
|
|
144
|
+
# variable
|
|
145
|
+
var = Variable.new(prefix)
|
|
146
|
+
# matched data
|
|
147
|
+
md = expr.match(tuple.name).to_a
|
|
148
|
+
|
|
149
|
+
# setup rule-io list
|
|
150
|
+
list = new_vtable.get(var)
|
|
151
|
+
list = RuleIOList.new unless list
|
|
152
|
+
elt = RuleIOElement.new(PioneString.new(tuple.name))
|
|
153
|
+
elt.uri = PioneString.new(tuple.uri)
|
|
154
|
+
elt.match = PioneList.new(*md.map{|d| PioneString.new(d)})
|
|
155
|
+
new_vtable.set!(var, list.add(elt))
|
|
156
|
+
|
|
157
|
+
# set special variable if index equals 1
|
|
158
|
+
if prefix == 'I' && index == 1
|
|
159
|
+
new_vtable.set(Variable.new("*"), PioneString.new(md[1]))
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
return new_vtable
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module TupleSpace
|
|
3
|
+
class PresenceNotifier < PioneObject
|
|
4
|
+
def self.inherited(subclass)
|
|
5
|
+
subclass.instance_variable_set(:@monitor, Monitor.new)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.command_name
|
|
9
|
+
@command_name
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.set_command_name(name)
|
|
13
|
+
@command_name = name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.notifier_uri
|
|
17
|
+
@notifier_uri.call
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.set_notifier_uri(proc)
|
|
21
|
+
@notifier_uri = proc
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Creates the tuple space provider as new process.
|
|
25
|
+
# @return [BasicFront]
|
|
26
|
+
# tuple space provider or receiver front
|
|
27
|
+
def self.spawn
|
|
28
|
+
user_message "create process for %s" % command_name
|
|
29
|
+
# create provider process
|
|
30
|
+
args = [command_name, '--parent-front', Global.front.uri]
|
|
31
|
+
args << "--debug" if Pione.debug_mode?
|
|
32
|
+
args << "--show-communication" if Global.show_communication
|
|
33
|
+
args << "--show-presence-notifier" if Global.show_presence_notifier
|
|
34
|
+
if self == TupleSpaceReceiver
|
|
35
|
+
args << "--presence-port"
|
|
36
|
+
args << Global.presence_port.to_s
|
|
37
|
+
end
|
|
38
|
+
args << "--my-ip-address"
|
|
39
|
+
args << Global.my_ip_address
|
|
40
|
+
if self == TupleSpaceProvider
|
|
41
|
+
Global.presence_notification_addresses.each do |address|
|
|
42
|
+
args << "--presence-notification-address"
|
|
43
|
+
args << address.to_s
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
pid = Process.spawn(*args)
|
|
47
|
+
thread = Process.detach(pid)
|
|
48
|
+
# wait that the provider starts up
|
|
49
|
+
while thread.alive?
|
|
50
|
+
begin
|
|
51
|
+
front = DRbObject.new_with_uri(notifier_uri)
|
|
52
|
+
break if front.uuid
|
|
53
|
+
rescue
|
|
54
|
+
sleep 0.1
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
if thread.alive?
|
|
58
|
+
return front
|
|
59
|
+
else
|
|
60
|
+
# failed to run pione-tuple-space-provider
|
|
61
|
+
Process.abort("You cannot run %s." % command_name)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Returns the provider instance.
|
|
66
|
+
# @return [PresenceNotifier]
|
|
67
|
+
# tuple space provider or receiver instance as druby object
|
|
68
|
+
def self.instance
|
|
69
|
+
@monitor.synchronize do
|
|
70
|
+
# get provider reference
|
|
71
|
+
begin
|
|
72
|
+
front = DRbObject.new_with_uri(notifier_uri)
|
|
73
|
+
front.uuid
|
|
74
|
+
front
|
|
75
|
+
rescue
|
|
76
|
+
# create new provider
|
|
77
|
+
self.spawn
|
|
78
|
+
end.presence_notifier
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module TupleSpace
|
|
3
|
+
# TupleSpaceProvider provides tuple space server's location to tuple space
|
|
4
|
+
# receivers.
|
|
5
|
+
class TupleSpaceProvider < PresenceNotifier
|
|
6
|
+
include DRbUndumped
|
|
7
|
+
|
|
8
|
+
set_command_name "pione-tuple-space-provider"
|
|
9
|
+
set_notifier_uri Proc.new {Global.tuple_space_provider_uri}
|
|
10
|
+
|
|
11
|
+
attr_accessor :tuple_space_servers
|
|
12
|
+
|
|
13
|
+
# Creatas a new server. This method assumes to be called from
|
|
14
|
+
# pione-tuple-space-provider command only. So you should not initialize
|
|
15
|
+
# server directly.
|
|
16
|
+
def initialize
|
|
17
|
+
super
|
|
18
|
+
|
|
19
|
+
# set variables
|
|
20
|
+
@tuple_space_servers = []
|
|
21
|
+
@terminated = false
|
|
22
|
+
|
|
23
|
+
# start agents
|
|
24
|
+
@keeper = Agent::TrivialRoutineWorker.new(
|
|
25
|
+
Proc.new do
|
|
26
|
+
send_packet
|
|
27
|
+
sleep 5
|
|
28
|
+
end
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def start
|
|
33
|
+
@keeper.start
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def add_tuple_space_server(tuple_space_server)
|
|
37
|
+
@tuple_space_servers << tuple_space_server
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Sends empty tuple space server list.
|
|
41
|
+
def terminate
|
|
42
|
+
return unless @terminated
|
|
43
|
+
@terminated = true
|
|
44
|
+
@keeper_agent.terminate
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def terminated?
|
|
48
|
+
@terminated
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
alias :finalize :terminate
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
|
|
55
|
+
# Sends presence notification to tuple space receivers as UDP packet.
|
|
56
|
+
# @return [void]
|
|
57
|
+
def send_packet
|
|
58
|
+
# setup reference data
|
|
59
|
+
port = /druby:\/\/(.*):(\d+)/.match(Global.front.uri)[2].to_i
|
|
60
|
+
@ref ||= Marshal.dump(port)
|
|
61
|
+
# open a socket
|
|
62
|
+
socket = UDPSocket.open
|
|
63
|
+
# address to send broadcast
|
|
64
|
+
addresses = Global.presence_notification_addresses
|
|
65
|
+
begin
|
|
66
|
+
if Global.show_presence_notifier
|
|
67
|
+
args = [Global.front.uri, addresses.join(", "), Time.now]
|
|
68
|
+
puts "sent presence notifier from %s to %s at %s" % args
|
|
69
|
+
end
|
|
70
|
+
# send packet
|
|
71
|
+
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
|
72
|
+
addresses.each {|addr| socket.send(@ref, 0, addr.host, addr.port)}
|
|
73
|
+
rescue => e
|
|
74
|
+
if Global.show_presence_notifier
|
|
75
|
+
puts "tuple-space-provider: something is bad..."
|
|
76
|
+
Util::ErrorReport.print(e)
|
|
77
|
+
end
|
|
78
|
+
ensure
|
|
79
|
+
# close the socket always
|
|
80
|
+
socket.close
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module TupleSpace
|
|
3
|
+
class TupleSpaceReceiver < PresenceNotifier
|
|
4
|
+
class InstanceError < StandardError; end
|
|
5
|
+
|
|
6
|
+
set_command_name "pione-tuple-space-receiver"
|
|
7
|
+
set_notifier_uri Proc.new {Global.tuple_space_receiver_uri}
|
|
8
|
+
|
|
9
|
+
def self.start(broker)
|
|
10
|
+
instance.register(broker)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_accessor :drb_service
|
|
14
|
+
|
|
15
|
+
def initialize
|
|
16
|
+
@brokers = []
|
|
17
|
+
@tuple_space_servers = {}
|
|
18
|
+
@socket = open_socket
|
|
19
|
+
|
|
20
|
+
# lock
|
|
21
|
+
@tuple_space_server_lock = Mutex.new
|
|
22
|
+
@broker_lock = Mutex.new
|
|
23
|
+
|
|
24
|
+
# subagents
|
|
25
|
+
@tuple_space_server_receiver =
|
|
26
|
+
Agent::TrivialRoutineWorker.new(Proc.new{receive_tuple_space_servers})
|
|
27
|
+
@updater = Agent::TrivialRoutineWorker.new(Proc.new{update_tuple_space_servers})
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Registers the agent.
|
|
31
|
+
def register(agent)
|
|
32
|
+
@broker_lock.synchronize { @brokers << agent }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Start to receive tuple space servers.
|
|
36
|
+
def start
|
|
37
|
+
@tuple_space_server_receiver.start
|
|
38
|
+
@updater.start
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def tuple_space_servers
|
|
42
|
+
@tuple_space_server_lock.synchronize do
|
|
43
|
+
@tuple_space_servers.keys
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Send empty tuple space server list.
|
|
48
|
+
def finalize
|
|
49
|
+
puts "finalize"
|
|
50
|
+
@terminated = true
|
|
51
|
+
@tuple_space_server_receiver.terminate
|
|
52
|
+
@socket.close
|
|
53
|
+
@updater.terminate
|
|
54
|
+
@tuple_space_servers = []
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
alias :terminate :finalize
|
|
58
|
+
|
|
59
|
+
def terminated?
|
|
60
|
+
@terminated
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
# Opens receiver socket.
|
|
66
|
+
# @return [UDPSocket]
|
|
67
|
+
# server socket
|
|
68
|
+
def open_socket
|
|
69
|
+
socket = UDPSocket.open
|
|
70
|
+
socket.bind(Socket::INADDR_ANY, Global.presence_port)
|
|
71
|
+
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
|
72
|
+
return socket
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Receives tuple space servers and updates the table.
|
|
76
|
+
# @return [void]
|
|
77
|
+
def receive_tuple_space_servers
|
|
78
|
+
data, addr = @socket.recvfrom(1024)
|
|
79
|
+
port = Marshal.load(data)
|
|
80
|
+
ip_address = addr[3]
|
|
81
|
+
provider_front = DRbObject.new_with_uri("druby://%s:%s" % [ip_address, port])
|
|
82
|
+
# need return of ping in short time
|
|
83
|
+
Timeout.timeout(1) do
|
|
84
|
+
provider_front.ping
|
|
85
|
+
provider_front.tuple_space_servers.each do |tuple_space_server|
|
|
86
|
+
@tuple_space_server_lock.synchronize do
|
|
87
|
+
@tuple_space_servers[tuple_space_server] = Time.now
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
if Global.show_presence_notifier
|
|
92
|
+
puts "presence notifier was received: %s" % provider_front.__drburi
|
|
93
|
+
end
|
|
94
|
+
rescue DRb::DRbConnError, DRb::ReplyReaderThreadError, IOError => e
|
|
95
|
+
@socket.close
|
|
96
|
+
@socket = open_socket
|
|
97
|
+
if Global.show_presence_notifier
|
|
98
|
+
puts "tuple space receiver disconnected"
|
|
99
|
+
end
|
|
100
|
+
rescue Exception
|
|
101
|
+
# ignore
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def update_tuple_space_servers
|
|
105
|
+
# update tuple space server list
|
|
106
|
+
@tuple_space_server_lock.synchronize do
|
|
107
|
+
@tuple_space_servers.delete_if do |server, time|
|
|
108
|
+
begin
|
|
109
|
+
# ping
|
|
110
|
+
timeout(1) { server.ping }
|
|
111
|
+
# check timespan
|
|
112
|
+
(Time.now - time) > Global.tuple_space_receiver_disconnect_time
|
|
113
|
+
rescue Exception
|
|
114
|
+
true
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# update broker
|
|
120
|
+
@broker_lock.synchronize do
|
|
121
|
+
@brokers.select! do |broker|
|
|
122
|
+
begin
|
|
123
|
+
timeout(1) { broker.ping }
|
|
124
|
+
broker.update_tuple_space_servers(tuple_space_servers)
|
|
125
|
+
true
|
|
126
|
+
rescue Exception => e
|
|
127
|
+
puts "[[[dead server]]]"
|
|
128
|
+
ErrorReport.print(e)
|
|
129
|
+
false
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
sleep 1
|
|
135
|
+
rescue Exception
|
|
136
|
+
# ignore
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|