From ace77411ec9351384f5c7311a8c04784e8573706 Mon Sep 17 00:00:00 2001 From: Kye Wei Date: Thu, 12 Nov 2015 19:28:43 +0000 Subject: [PATCH 1/6] Proposed SysV structures and Mixin functionality --- lib/semian.rb | 7 +++- lib/semian/circuit_breaker.rb | 12 ++++-- lib/semian/simple_integer.rb | 2 +- lib/semian/simple_sliding_window.rb | 4 +- lib/semian/simple_state.rb | 2 +- lib/semian/sysv_integer.rb | 12 ++++++ lib/semian/sysv_shared_memory.rb | 60 +++++++++++++++++++++++++++++ lib/semian/sysv_sliding_window.rb | 12 ++++++ lib/semian/sysv_state.rb | 59 ++++++++++++++++++++++++++++ test/simple_state_test.rb | 2 +- 10 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 lib/semian/sysv_integer.rb create mode 100644 lib/semian/sysv_shared_memory.rb create mode 100644 lib/semian/sysv_sliding_window.rb create mode 100644 lib/semian/sysv_state.rb diff --git a/lib/semian.rb b/lib/semian.rb index 9d4076e0..aa5efde3 100644 --- a/lib/semian.rb +++ b/lib/semian.rb @@ -124,7 +124,8 @@ def register(name, tickets:, permissions: 0660, timeout: 0, error_threshold:, er error_threshold: error_threshold, error_timeout: error_timeout, exceptions: Array(exceptions) + [::Semian::BaseError], - implementation: ::Semian::Simple, + permissions: permissions, + implementation: ::Semian::SysV, ) resource = Resource.new(name, tickets: tickets, permissions: permissions, timeout: timeout) resources[name] = ProtectedResource.new(resource, circuit_breaker) @@ -159,6 +160,10 @@ def resources require 'semian/simple_sliding_window' require 'semian/simple_integer' require 'semian/simple_state' +require 'semian/sysv_shared_memory' +require 'semian/sysv_sliding_window' +require 'semian/sysv_integer' +require 'semian/sysv_state' if Semian.semaphores_enabled? require 'semian/semian' else diff --git a/lib/semian/circuit_breaker.rb b/lib/semian/circuit_breaker.rb index f732ceb7..dfd89a19 100644 --- a/lib/semian/circuit_breaker.rb +++ b/lib/semian/circuit_breaker.rb @@ -2,16 +2,20 @@ module Semian class CircuitBreaker #:nodoc: extend Forwardable - def initialize(name, exceptions:, success_threshold:, error_threshold:, error_timeout:, implementation:) + def initialize(name, exceptions:, success_threshold:, error_threshold:, error_timeout:, permissions:, implementation:) @name = name.to_sym @success_count_threshold = success_threshold @error_count_threshold = error_threshold @error_timeout = error_timeout @exceptions = exceptions - @errors = implementation::SlidingWindow.new(max_size: @error_count_threshold) - @successes = implementation::Integer.new - @state = implementation::State.new + @errors = implementation::SlidingWindow.new(max_size: @error_count_threshold, + name: "#{name}_sysv_sliding_window", + permissions: permissions) + @successes = implementation::Integer.new(name: "#{name}_sysv_integer", + permissions: permissions) + @state = implementation::State.new(name: "#{name}_sysv_state", + permissions: permissions) end def acquire diff --git a/lib/semian/simple_integer.rb b/lib/semian/simple_integer.rb index aff73220..d2814aec 100644 --- a/lib/semian/simple_integer.rb +++ b/lib/semian/simple_integer.rb @@ -3,7 +3,7 @@ module Simple class Integer #:nodoc: attr_accessor :value - def initialize + def initialize(**_) reset end diff --git a/lib/semian/simple_sliding_window.rb b/lib/semian/simple_sliding_window.rb index 2507bfb8..e3de9978 100644 --- a/lib/semian/simple_sliding_window.rb +++ b/lib/semian/simple_sliding_window.rb @@ -1,3 +1,5 @@ +require 'forwardable' + module Semian module Simple class SlidingWindow #:nodoc: @@ -10,7 +12,7 @@ class SlidingWindow #:nodoc: # like this: if @max_size = 4, current time is 10, @window =[5,7,9,10]. # Another push of (11) at 11 sec would make @window [7,9,10,11], shifting off 5. - def initialize(max_size:) + def initialize(max_size:, **_) @max_size = max_size @window = [] end diff --git a/lib/semian/simple_state.rb b/lib/semian/simple_state.rb index d97f4960..e8880d48 100644 --- a/lib/semian/simple_state.rb +++ b/lib/semian/simple_state.rb @@ -1,7 +1,7 @@ module Semian module Simple class State #:nodoc: - def initialize + def initialize(**_) reset end diff --git a/lib/semian/sysv_integer.rb b/lib/semian/sysv_integer.rb new file mode 100644 index 00000000..72554cc7 --- /dev/null +++ b/lib/semian/sysv_integer.rb @@ -0,0 +1,12 @@ +module Semian + module SysV + class Integer < Semian::Simple::Integer #:nodoc: + include SysVSharedMemory + + def initialize(name:, permissions:) + data_layout = [:int] + super() unless acquire_memory_object(name, data_layout, permissions) + end + end + end +end diff --git a/lib/semian/sysv_shared_memory.rb b/lib/semian/sysv_shared_memory.rb new file mode 100644 index 00000000..07b896ae --- /dev/null +++ b/lib/semian/sysv_shared_memory.rb @@ -0,0 +1,60 @@ +module Semian + module SysVSharedMemory #:nodoc: + @type_size = {} + def self.sizeof(type) + size = (@type_size[type.to_sym] ||= (respond_to?(:_sizeof) ? _sizeof(type.to_sym) : 0)) + raise TypeError.new("#{type} is not a valid C type") if size <= 0 + size + end + + def semid + -1 + end + + def shmid + -1 + end + + def synchronize(&proc) + if respond_to?(:_synchronize) && @using_shared_memory + return _synchronize(&proc) + else + yield if block_given? + end + end + + alias_method :transaction, :synchronize + + def destroy + if respond_to?(:_destroy) && @using_shared_memory + _destroy + else + super + end + end + + private + + def shared? + @using_shared_memory + end + + def acquire_memory_object(name, data_layout, permissions) + return @using_shared_memory = false unless Semian.semaphores_enabled? && respond_to?(:_acquire) + + byte_size = data_layout.inject(0) { |sum, type| sum + ::Semian::SysVSharedMemory.sizeof(type) } + raise TypeError.new("Given data layout is 0 bytes: #{data_layout.inspect}") if byte_size <= 0 + # Calls C layer to acquire/create a memory block, calling #bind_init_fn in the process, see below + _acquire(name, byte_size, permissions) + @using_shared_memory = true + end + + def bind_init_fn + # Concrete classes must implement this in a subclass in C to bind a callback function of type + # void (*object_init_fn)(size_t byte_size, void *dest, void *prev_data, size_t prev_data_byte_size); + # to location ptr->object_init_fn, where ptr is a semian_shm_object* + # It is called when memory needs to be initialized or resized, possibly using previous memory + raise NotImplementedError + end + end +end diff --git a/lib/semian/sysv_sliding_window.rb b/lib/semian/sysv_sliding_window.rb new file mode 100644 index 00000000..85089553 --- /dev/null +++ b/lib/semian/sysv_sliding_window.rb @@ -0,0 +1,12 @@ +module Semian + module SysV + class SlidingWindow < Semian::Simple::SlidingWindow #:nodoc: + include SysVSharedMemory + + def initialize(max_size:, name:, permissions:) + data_layout = [:int, :int].concat(Array.new(max_size, :long)) + super(max_size: max_size) unless acquire_memory_object(name, data_layout, permissions) + end + end + end +end diff --git a/lib/semian/sysv_state.rb b/lib/semian/sysv_state.rb new file mode 100644 index 00000000..0cd267c0 --- /dev/null +++ b/lib/semian/sysv_state.rb @@ -0,0 +1,59 @@ +require 'forwardable' + +module Semian + module SysV + class State < Semian::Simple::State #:nodoc: + include SysVSharedMemory + extend Forwardable + + def_delegators :@integer, :semid, :shmid, :synchronize, :transaction, + :shared?, :acquire_memory_object, :bind_init_fn + private :shared?, :acquire_memory_object, :bind_init_fn + + def initialize(name:, permissions:) + @integer = Semian::SysV::Integer.new(name: name, permissions: permissions) + initialize_lookup([:closed, :open, :half_open]) + end + + def open + self.value = :open + end + + def close + self.value = :closed + end + + def half_open + self.value = :half_open + end + + def reset + close + end + + def destroy + reset + @integer.destroy + end + + def value + @num_to_sym.fetch(@integer.value) { raise ArgumentError } + end + + private + + def value=(sym) + @integer.value = @sym_to_num.fetch(sym) { raise ArgumentError } + end + + def initialize_lookup(symbol_list) + # Assume symbol_list[0] is mapped to 0 + # Cannot just use #object_id since #object_id for symbols is different in every run + # For now, implement a C-style enum type backed by integers + + @sym_to_num = Hash[symbol_list.each_with_index.to_a] + @num_to_sym = @sym_to_num.invert + end + end + end +end diff --git a/test/simple_state_test.rb b/test/simple_state_test.rb index 6f629744..edab7c22 100644 --- a/test/simple_state_test.rb +++ b/test/simple_state_test.rb @@ -1,6 +1,6 @@ require 'test_helper' -class TestSimpleEnum < MiniTest::Unit::TestCase +class TestSimpleState < MiniTest::Unit::TestCase CLASS = ::Semian::Simple::State def setup From bcb187dd598a87db6efb9cb1b855ce8d1e4a13e5 Mon Sep 17 00:00:00 2001 From: Kye Wei Date: Fri, 13 Nov 2015 15:52:29 +0000 Subject: [PATCH 2/6] Stub tests that test fallback not-shared functionality --- lib/semian/sysv_shared_memory.rb | 19 +++++++++++++++-- test/sysv_integer_test.rb | 16 +++++++++++++++ test/sysv_sliding_window_test.rb | 22 ++++++++++++++++++++ test/sysv_state_test.rb | 35 ++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 test/sysv_integer_test.rb create mode 100644 test/sysv_sliding_window_test.rb create mode 100644 test/sysv_state_test.rb diff --git a/lib/semian/sysv_shared_memory.rb b/lib/semian/sysv_shared_memory.rb index 07b896ae..d879a710 100644 --- a/lib/semian/sysv_shared_memory.rb +++ b/lib/semian/sysv_shared_memory.rb @@ -7,6 +7,21 @@ def self.sizeof(type) size end + def self.included(base) + def base.do_with_sync(*names) + names.each do |name| + new_name = "#{name}_inner".freeze.to_sym + alias_method new_name, name + private new_name + define_method(name) do |*args, &block| + synchronize do + method(new_name).call(*args, &block) + end + end + end + end + end + def semid -1 end @@ -15,9 +30,9 @@ def shmid -1 end - def synchronize(&proc) + def synchronize(&block) if respond_to?(:_synchronize) && @using_shared_memory - return _synchronize(&proc) + return _synchronize(&block) else yield if block_given? end diff --git a/test/sysv_integer_test.rb b/test/sysv_integer_test.rb new file mode 100644 index 00000000..8e1f72f5 --- /dev/null +++ b/test/sysv_integer_test.rb @@ -0,0 +1,16 @@ +require 'test_helper' + +class TestSysVInteger < MiniTest::Unit::TestCase + CLASS = ::Semian::SysV::Integer + + def setup + @integer = CLASS.new(name: 'TestSysVInteger', permissions: 0660) + @integer.reset + end + + def teardown + @integer.destroy + end + + include TestSimpleInteger::IntegerTestCases +end diff --git a/test/sysv_sliding_window_test.rb b/test/sysv_sliding_window_test.rb new file mode 100644 index 00000000..4543f5f5 --- /dev/null +++ b/test/sysv_sliding_window_test.rb @@ -0,0 +1,22 @@ +require 'test_helper' + +class TestSysVSlidingWindow < MiniTest::Unit::TestCase + CLASS = ::Semian::SysV::SlidingWindow + + def setup + @sliding_window = CLASS.new(max_size: 6, + name: 'TestSysVSlidingWindow', + permissions: 0660) + @sliding_window.clear + end + + def teardown + @sliding_window.destroy + end + + include TestSimpleSlidingWindow::SlidingWindowTestCases + + private + + include TestSimpleSlidingWindow::SlidingWindowUtilityMethods +end diff --git a/test/sysv_state_test.rb b/test/sysv_state_test.rb new file mode 100644 index 00000000..a8d7cad9 --- /dev/null +++ b/test/sysv_state_test.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +class TestSysVState < MiniTest::Unit::TestCase + CLASS = ::Semian::SysV::State + + def setup + @state = CLASS.new(name: 'TestSysVState', + permissions: 0660) + @state.reset + end + + def teardown + @state.destroy + end + + include TestSimpleState::StateTestCases + + def test_will_throw_error_when_invalid_symbol_given + # May occur if underlying integer gets into bad state + integer = @state.instance_eval "@integer" + integer.value = 100 + assert_raises ArgumentError do + @state.value + end + assert_raises ArgumentError do + @state.open? + end + assert_raises ArgumentError do + @state.half_open? + end + assert_raises ArgumentError do + @state.closed? + end + end +end From 144e8eaa70677b0582b053544a28e6297152cdde Mon Sep 17 00:00:00 2001 From: Kye Wei Date: Mon, 16 Nov 2015 20:00:14 +0000 Subject: [PATCH 3/6] Naming and nit-pick --- lib/semian/simple_integer.rb | 2 +- lib/semian/simple_sliding_window.rb | 2 +- lib/semian/simple_state.rb | 2 +- lib/semian/sysv_shared_memory.rb | 8 ++++---- lib/semian/sysv_sliding_window.rb | 2 +- lib/semian/sysv_state.rb | 10 +++++----- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/semian/simple_integer.rb b/lib/semian/simple_integer.rb index d2814aec..cb4403e9 100644 --- a/lib/semian/simple_integer.rb +++ b/lib/semian/simple_integer.rb @@ -3,7 +3,7 @@ module Simple class Integer #:nodoc: attr_accessor :value - def initialize(**_) + def initialize(**) reset end diff --git a/lib/semian/simple_sliding_window.rb b/lib/semian/simple_sliding_window.rb index e3de9978..bfd57e54 100644 --- a/lib/semian/simple_sliding_window.rb +++ b/lib/semian/simple_sliding_window.rb @@ -12,7 +12,7 @@ class SlidingWindow #:nodoc: # like this: if @max_size = 4, current time is 10, @window =[5,7,9,10]. # Another push of (11) at 11 sec would make @window [7,9,10,11], shifting off 5. - def initialize(max_size:, **_) + def initialize(max_size:, **) @max_size = max_size @window = [] end diff --git a/lib/semian/simple_state.rb b/lib/semian/simple_state.rb index e8880d48..cefea9dd 100644 --- a/lib/semian/simple_state.rb +++ b/lib/semian/simple_state.rb @@ -1,7 +1,7 @@ module Semian module Simple class State #:nodoc: - def initialize(**_) + def initialize(**) reset end diff --git a/lib/semian/sysv_shared_memory.rb b/lib/semian/sysv_shared_memory.rb index d879a710..8679af91 100644 --- a/lib/semian/sysv_shared_memory.rb +++ b/lib/semian/sysv_shared_memory.rb @@ -59,15 +59,15 @@ def acquire_memory_object(name, data_layout, permissions) byte_size = data_layout.inject(0) { |sum, type| sum + ::Semian::SysVSharedMemory.sizeof(type) } raise TypeError.new("Given data layout is 0 bytes: #{data_layout.inspect}") if byte_size <= 0 - # Calls C layer to acquire/create a memory block, calling #bind_init_fn in the process, see below + # Calls C layer to acquire/create a memory block, calling #bind_initialize_memory_callback in the process, see below _acquire(name, byte_size, permissions) @using_shared_memory = true end - def bind_init_fn + def bind_initialize_memory_callback # Concrete classes must implement this in a subclass in C to bind a callback function of type - # void (*object_init_fn)(size_t byte_size, void *dest, void *prev_data, size_t prev_data_byte_size); - # to location ptr->object_init_fn, where ptr is a semian_shm_object* + # void (*initialize_memory)(size_t byte_size, void *dest, void *prev_data, size_t prev_data_byte_size); + # to location ptr->initialize_memory, where ptr is a semian_shm_object* # It is called when memory needs to be initialized or resized, possibly using previous memory raise NotImplementedError end diff --git a/lib/semian/sysv_sliding_window.rb b/lib/semian/sysv_sliding_window.rb index 85089553..4c54c022 100644 --- a/lib/semian/sysv_sliding_window.rb +++ b/lib/semian/sysv_sliding_window.rb @@ -4,7 +4,7 @@ class SlidingWindow < Semian::Simple::SlidingWindow #:nodoc: include SysVSharedMemory def initialize(max_size:, name:, permissions:) - data_layout = [:int, :int].concat(Array.new(max_size, :long)) + data_layout = [:int, :int] + [:long] * max_size super(max_size: max_size) unless acquire_memory_object(name, data_layout, permissions) end end diff --git a/lib/semian/sysv_state.rb b/lib/semian/sysv_state.rb index 0cd267c0..8d228a3c 100644 --- a/lib/semian/sysv_state.rb +++ b/lib/semian/sysv_state.rb @@ -7,12 +7,12 @@ class State < Semian::Simple::State #:nodoc: extend Forwardable def_delegators :@integer, :semid, :shmid, :synchronize, :transaction, - :shared?, :acquire_memory_object, :bind_init_fn - private :shared?, :acquire_memory_object, :bind_init_fn + :shared?, :acquire_memory_object, :bind_initialize_memory_callback + private :shared?, :acquire_memory_object, :bind_initialize_memory_callback def initialize(name:, permissions:) @integer = Semian::SysV::Integer.new(name: name, permissions: permissions) - initialize_lookup([:closed, :open, :half_open]) + initialize_lookup end def open @@ -46,12 +46,12 @@ def value=(sym) @integer.value = @sym_to_num.fetch(sym) { raise ArgumentError } end - def initialize_lookup(symbol_list) + def initialize_lookup # Assume symbol_list[0] is mapped to 0 # Cannot just use #object_id since #object_id for symbols is different in every run # For now, implement a C-style enum type backed by integers - @sym_to_num = Hash[symbol_list.each_with_index.to_a] + @sym_to_num = {closed: 0, open: 1, half_open: 2} @num_to_sym = @sym_to_num.invert end end From 9d117e2fa662e948e7b3e6ef48cbed4bbca68668 Mon Sep 17 00:00:00 2001 From: Kye Wei Date: Tue, 17 Nov 2015 20:17:42 +0000 Subject: [PATCH 4/6] More nitpick --- lib/semian/circuit_breaker.rb | 6 +++--- lib/semian/simple_state.rb | 9 +++++---- lib/semian/sysv_state.rb | 18 +----------------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/lib/semian/circuit_breaker.rb b/lib/semian/circuit_breaker.rb index dfd89a19..349dab98 100644 --- a/lib/semian/circuit_breaker.rb +++ b/lib/semian/circuit_breaker.rb @@ -10,11 +10,11 @@ def initialize(name, exceptions:, success_threshold:, error_threshold:, error_ti @exceptions = exceptions @errors = implementation::SlidingWindow.new(max_size: @error_count_threshold, - name: "#{name}_sysv_sliding_window", + name: "#{name}_sliding_window", permissions: permissions) - @successes = implementation::Integer.new(name: "#{name}_sysv_integer", + @successes = implementation::Integer.new(name: "#{name}_integer", permissions: permissions) - @state = implementation::State.new(name: "#{name}_sysv_state", + @state = implementation::State.new(name: "#{name}_state", permissions: permissions) end diff --git a/lib/semian/simple_state.rb b/lib/semian/simple_state.rb index cefea9dd..eff76a98 100644 --- a/lib/semian/simple_state.rb +++ b/lib/semian/simple_state.rb @@ -5,7 +5,8 @@ def initialize(**) reset end - attr_reader :value + attr_accessor :value + private :value= def open? value == :open @@ -20,15 +21,15 @@ def half_open? end def open - @value = :open + self.value = :open end def close - @value = :closed + self.value = :closed end def half_open - @value = :half_open + self.value = :half_open end def reset diff --git a/lib/semian/sysv_state.rb b/lib/semian/sysv_state.rb index 8d228a3c..c4225d1c 100644 --- a/lib/semian/sysv_state.rb +++ b/lib/semian/sysv_state.rb @@ -15,24 +15,8 @@ def initialize(name:, permissions:) initialize_lookup end - def open - self.value = :open - end - - def close - self.value = :closed - end - - def half_open - self.value = :half_open - end - - def reset - close - end - def destroy - reset + super @integer.destroy end From 89075a2aa00d3fe6cbd87074e125171cb3304c6a Mon Sep 17 00:00:00 2001 From: Kye Wei Date: Fri, 20 Nov 2015 21:12:12 +0000 Subject: [PATCH 5/6] Made SysV override on boot-up --- lib/semian/sysv_shared_memory.rb | 39 ++++++-------------------------- lib/semian/sysv_state.rb | 28 +++++++---------------- 2 files changed, 15 insertions(+), 52 deletions(-) diff --git a/lib/semian/sysv_shared_memory.rb b/lib/semian/sysv_shared_memory.rb index 8679af91..58abe7ee 100644 --- a/lib/semian/sysv_shared_memory.rb +++ b/lib/semian/sysv_shared_memory.rb @@ -1,12 +1,5 @@ module Semian module SysVSharedMemory #:nodoc: - @type_size = {} - def self.sizeof(type) - size = (@type_size[type.to_sym] ||= (respond_to?(:_sizeof) ? _sizeof(type.to_sym) : 0)) - raise TypeError.new("#{type} is not a valid C type") if size <= 0 - size - end - def self.included(base) def base.do_with_sync(*names) names.each do |name| @@ -30,38 +23,20 @@ def shmid -1 end - def synchronize(&block) - if respond_to?(:_synchronize) && @using_shared_memory - return _synchronize(&block) - else - yield if block_given? - end + def synchronize + yield if block_given? end - alias_method :transaction, :synchronize - def destroy - if respond_to?(:_destroy) && @using_shared_memory - _destroy - else - super - end + super end private - def shared? - @using_shared_memory - end - - def acquire_memory_object(name, data_layout, permissions) - return @using_shared_memory = false unless Semian.semaphores_enabled? && respond_to?(:_acquire) - - byte_size = data_layout.inject(0) { |sum, type| sum + ::Semian::SysVSharedMemory.sizeof(type) } - raise TypeError.new("Given data layout is 0 bytes: #{data_layout.inspect}") if byte_size <= 0 - # Calls C layer to acquire/create a memory block, calling #bind_initialize_memory_callback in the process, see below - _acquire(name, byte_size, permissions) - @using_shared_memory = true + def acquire_memory_object(*) + # Concrete classes must call this method before accessing shared memory + # If SysV is enabled, a C method overrides this stub and returns true if acquiring succeeds + false end def bind_initialize_memory_callback diff --git a/lib/semian/sysv_state.rb b/lib/semian/sysv_state.rb index c4225d1c..fc338a9a 100644 --- a/lib/semian/sysv_state.rb +++ b/lib/semian/sysv_state.rb @@ -6,37 +6,25 @@ class State < Semian::Simple::State #:nodoc: include SysVSharedMemory extend Forwardable - def_delegators :@integer, :semid, :shmid, :synchronize, :transaction, - :shared?, :acquire_memory_object, :bind_initialize_memory_callback - private :shared?, :acquire_memory_object, :bind_initialize_memory_callback + SYM_TO_NUM = {closed: 0, open: 1, half_open: 2}.freeze + NUM_TO_SYM = SYM_TO_NUM.invert.freeze + + def_delegators :@integer, :semid, :shmid, :synchronize, :acquire_memory_object, + :bind_initialize_memory_callback, :destroy + private :acquire_memory_object, :bind_initialize_memory_callback def initialize(name:, permissions:) @integer = Semian::SysV::Integer.new(name: name, permissions: permissions) - initialize_lookup - end - - def destroy - super - @integer.destroy end def value - @num_to_sym.fetch(@integer.value) { raise ArgumentError } + NUM_TO_SYM.fetch(@integer.value) { raise ArgumentError } end private def value=(sym) - @integer.value = @sym_to_num.fetch(sym) { raise ArgumentError } - end - - def initialize_lookup - # Assume symbol_list[0] is mapped to 0 - # Cannot just use #object_id since #object_id for symbols is different in every run - # For now, implement a C-style enum type backed by integers - - @sym_to_num = {closed: 0, open: 1, half_open: 2} - @num_to_sym = @sym_to_num.invert + @integer.value = SYM_TO_NUM.fetch(sym) { raise ArgumentError } end end end From 8c6f6ddd5b515273f4b7324ff89a8fe11b01be65 Mon Sep 17 00:00:00 2001 From: Kye Wei Date: Mon, 23 Nov 2015 15:42:15 +0000 Subject: [PATCH 6/6] Small changes --- lib/semian.rb | 10 +++++----- test/sysv_integer_test.rb | 4 ++-- test/sysv_sliding_window_test.rb | 4 ++-- test/sysv_state_test.rb | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/semian.rb b/lib/semian.rb index aa5efde3..a8865131 100644 --- a/lib/semian.rb +++ b/lib/semian.rb @@ -125,7 +125,7 @@ def register(name, tickets:, permissions: 0660, timeout: 0, error_threshold:, er error_timeout: error_timeout, exceptions: Array(exceptions) + [::Semian::BaseError], permissions: permissions, - implementation: ::Semian::SysV, + implementation: Semian.semaphores_enabled? ? ::Semian::SysV : ::Semian::Simple, ) resource = Resource.new(name, tickets: tickets, permissions: permissions, timeout: timeout) resources[name] = ProtectedResource.new(resource, circuit_breaker) @@ -160,11 +160,11 @@ def resources require 'semian/simple_sliding_window' require 'semian/simple_integer' require 'semian/simple_state' -require 'semian/sysv_shared_memory' -require 'semian/sysv_sliding_window' -require 'semian/sysv_integer' -require 'semian/sysv_state' if Semian.semaphores_enabled? + require 'semian/sysv_shared_memory' + require 'semian/sysv_sliding_window' + require 'semian/sysv_integer' + require 'semian/sysv_state' require 'semian/semian' else Semian::MAX_TICKETS = 0 diff --git a/test/sysv_integer_test.rb b/test/sysv_integer_test.rb index 8e1f72f5..afbdf5ea 100644 --- a/test/sysv_integer_test.rb +++ b/test/sysv_integer_test.rb @@ -1,10 +1,10 @@ require 'test_helper' class TestSysVInteger < MiniTest::Unit::TestCase - CLASS = ::Semian::SysV::Integer + KLASS = ::Semian::SysV::Integer def setup - @integer = CLASS.new(name: 'TestSysVInteger', permissions: 0660) + @integer = KLASS.new(name: 'TestSysVInteger', permissions: 0660) @integer.reset end diff --git a/test/sysv_sliding_window_test.rb b/test/sysv_sliding_window_test.rb index 4543f5f5..ebedfb1f 100644 --- a/test/sysv_sliding_window_test.rb +++ b/test/sysv_sliding_window_test.rb @@ -1,10 +1,10 @@ require 'test_helper' class TestSysVSlidingWindow < MiniTest::Unit::TestCase - CLASS = ::Semian::SysV::SlidingWindow + KLASS = ::Semian::SysV::SlidingWindow def setup - @sliding_window = CLASS.new(max_size: 6, + @sliding_window = KLASS.new(max_size: 6, name: 'TestSysVSlidingWindow', permissions: 0660) @sliding_window.clear diff --git a/test/sysv_state_test.rb b/test/sysv_state_test.rb index a8d7cad9..a2f8496e 100644 --- a/test/sysv_state_test.rb +++ b/test/sysv_state_test.rb @@ -1,10 +1,10 @@ require 'test_helper' class TestSysVState < MiniTest::Unit::TestCase - CLASS = ::Semian::SysV::State + KLASS = ::Semian::SysV::State def setup - @state = CLASS.new(name: 'TestSysVState', + @state = KLASS.new(name: 'TestSysVState', permissions: 0660) @state.reset end