From 4d822cb771f6fc322447ca1ba8a1f02fda504472 Mon Sep 17 00:00:00 2001 From: BrewTestBot <1589480+BrewTestBot@users.noreply.github.com> Date: Tue, 24 Jan 2023 18:07:34 +0000 Subject: [PATCH] brew vendor-gems: commit updates. --- .../Homebrew/vendor/bundle/bundler/setup.rb | 2 +- .../atomic/abstract_thread_local_var.rb | 66 ------ .../concurrent/atomic/atomic_reference.rb | 205 ------------------ .../atomic/java_thread_local_var.rb | 37 ---- .../atomic/ruby_thread_local_var.rb | 181 ---------------- .../concurrent/atomic/thread_local_var.rb | 104 --------- .../concurrent/concern/logging.rb | 32 --- .../concurrent/concurrent_ruby.jar | Bin 137917 -> 0 bytes .../concurrent/synchronization.rb | 30 --- .../synchronization/jruby_object.rb | 45 ---- .../concurrent/synchronization/mri_object.rb | 44 ---- .../synchronization/rbx_lockable_object.rb | 71 ------ .../concurrent/synchronization/rbx_object.rb | 49 ----- .../synchronization/truffleruby_object.rb | 47 ---- .../concurrent/synchronization/volatile.rb | 36 --- .../thread_safe/synchronized_delegator.rb | 50 ----- .../concurrent/utility/monotonic_time.rb | 90 -------- .../concurrent/utility/processor_counter.rb | 130 ----------- .../lib/concurrent-ruby/concurrent-ruby.rb | 0 .../lib/concurrent-ruby/concurrent.rb | 0 .../lib/concurrent-ruby/concurrent/agent.rb | 3 +- .../lib/concurrent-ruby/concurrent/array.rb | 10 - .../lib/concurrent-ruby/concurrent/async.rb | 0 .../lib/concurrent-ruby/concurrent/atom.rb | 2 +- .../concurrent/atomic/atomic_boolean.rb | 9 +- .../concurrent/atomic/atomic_fixnum.rb | 9 +- .../atomic/atomic_markable_reference.rb | 3 + .../concurrent/atomic/atomic_reference.rb | 135 ++++++++++++ .../concurrent/atomic/count_down_latch.rb | 0 .../concurrent/atomic/cyclic_barrier.rb | 2 +- .../concurrent/atomic/event.rb | 2 +- .../concurrent/atomic/fiber_local_var.rb | 109 ++++++++++ .../atomic/java_count_down_latch.rb | 1 + .../concurrent/atomic/locals.rb | 188 ++++++++++++++++ .../concurrent/atomic/lock_local_var.rb | 28 +++ .../concurrent/atomic/mutex_atomic_boolean.rb | 16 +- .../concurrent/atomic/mutex_atomic_fixnum.rb | 16 +- .../atomic/mutex_count_down_latch.rb | 2 +- .../concurrent/atomic/mutex_semaphore.rb | 2 +- .../concurrent/atomic/read_write_lock.rb | 3 +- .../atomic/reentrant_read_write_lock.rb | 8 +- .../concurrent/atomic/semaphore.rb | 15 +- .../concurrent/atomic/thread_local_var.rb | 111 ++++++++++ .../atomic_reference/atomic_direct_update.rb | 37 ++++ .../atomic_reference/mutex_atomic.rb | 19 +- .../atomic_reference/numeric_cas_wrapper.rb | 0 .../lib/concurrent-ruby/concurrent/atomics.rb | 0 .../collection/copy_on_notify_observer_set.rb | 2 +- .../collection/copy_on_write_observer_set.rb | 2 +- .../java_non_concurrent_priority_queue.rb | 0 .../concurrent/collection/lock_free_stack.rb | 2 + .../map/atomic_reference_map_backend.rb | 0 .../collection/map/mri_map_backend.rb | 0 .../map/non_concurrent_map_backend.rb | 0 .../map/synchronized_map_backend.rb | 0 .../collection/map/truffleruby_map_backend.rb | 0 .../non_concurrent_priority_queue.rb | 0 .../ruby_non_concurrent_priority_queue.rb | 0 .../concurrent/concern/deprecation.rb | 0 .../concurrent/concern/dereferenceable.rb | 0 .../concurrent/concern/logging.rb | 116 ++++++++++ .../concurrent/concern/obligation.rb | 0 .../concurrent/concern/observable.rb | 0 .../concurrent/concurrent_ruby.jar | Bin 0 -> 135855 bytes .../concurrent/configuration.rb | 91 +------- .../concurrent-ruby/concurrent/constants.rb | 0 .../concurrent-ruby/concurrent/dataflow.rb | 0 .../lib/concurrent-ruby/concurrent/delay.rb | 4 +- .../lib/concurrent-ruby/concurrent/errors.rb | 5 + .../concurrent-ruby/concurrent/exchanger.rb | 1 + .../executor/abstract_executor_service.rb | 2 +- .../concurrent/executor/cached_thread_pool.rb | 0 .../concurrent/executor/executor_service.rb | 0 .../concurrent/executor/fixed_thread_pool.rb | 0 .../concurrent/executor/immediate_executor.rb | 0 .../executor/indirect_immediate_executor.rb | 0 .../executor/java_executor_service.rb | 4 +- .../executor/java_single_thread_executor.rb | 0 .../executor/java_thread_pool_executor.rb | 0 .../executor/ruby_executor_service.rb | 0 .../executor/ruby_single_thread_executor.rb | 0 .../executor/ruby_thread_pool_executor.rb | 0 .../concurrent/executor/safe_task_executor.rb | 2 +- .../executor/serial_executor_service.rb | 0 .../executor/serialized_execution.rb | 2 +- .../serialized_execution_delegator.rb | 0 .../executor/simple_executor_service.rb | 5 +- .../executor/single_thread_executor.rb | 0 .../executor/thread_pool_executor.rb | 0 .../concurrent/executor/timer_set.rb | 0 .../concurrent-ruby/concurrent/executors.rb | 0 .../lib/concurrent-ruby/concurrent/future.rb | 0 .../lib/concurrent-ruby/concurrent/hash.rb | 9 - .../concurrent/immutable_struct.rb | 2 +- .../lib/concurrent-ruby/concurrent/ivar.rb | 3 +- .../lib/concurrent-ruby/concurrent/map.rb | 17 +- .../lib/concurrent-ruby/concurrent/maybe.rb | 2 +- .../concurrent/mutable_struct.rb | 2 +- .../lib/concurrent-ruby/concurrent/mvar.rb | 2 +- .../lib/concurrent-ruby/concurrent/options.rb | 0 .../lib/concurrent-ruby/concurrent/promise.rb | 2 +- .../concurrent-ruby/concurrent/promises.rb | 13 +- .../concurrent-ruby/concurrent/re_include.rb | 2 + .../concurrent/scheduled_task.rb | 2 +- .../lib/concurrent-ruby/concurrent/set.rb | 10 - .../concurrent/settable_struct.rb | 4 +- .../concurrent/synchronization.rb | 13 ++ .../abstract_lockable_object.rb | 6 +- .../synchronization/abstract_object.rb | 4 +- .../synchronization/abstract_struct.rb | 0 .../concurrent/synchronization/condition.rb | 2 + .../synchronization/full_memory_barrier.rb | 29 +++ .../synchronization/jruby_lockable_object.rb | 4 +- .../concurrent/synchronization/lock.rb | 2 + .../synchronization/lockable_object.rb | 7 +- .../synchronization/mutex_lockable_object.rb | 11 +- .../concurrent/synchronization/object.rb | 56 +---- .../synchronization/safe_initialization.rb | 36 +++ .../concurrent/synchronization/volatile.rb | 101 +++++++++ .../thread_safe/synchronized_delegator.rb | 47 ++++ .../concurrent/thread_safe/util.rb | 0 .../concurrent/thread_safe/util/adder.rb | 0 .../thread_safe/util/cheap_lockable.rb | 41 +--- .../thread_safe/util/data_structures.rb | 38 +--- .../thread_safe/util/power_of_two_tuple.rb | 0 .../concurrent/thread_safe/util/striped64.rb | 0 .../concurrent/thread_safe/util/volatile.rb | 0 .../thread_safe/util/xor_shift_random.rb | 0 .../concurrent-ruby/concurrent/timer_task.rb | 0 .../lib/concurrent-ruby/concurrent/tuple.rb | 6 +- .../lib/concurrent-ruby/concurrent/tvar.rb | 3 +- .../concurrent/utility/engine.rb | 21 +- .../concurrent/utility/monotonic_time.rb | 19 ++ .../utility/native_extension_loader.rb | 18 +- .../concurrent/utility/native_integer.rb | 1 + .../concurrent/utility/processor_counter.rb | 110 ++++++++++ .../lib/concurrent-ruby/concurrent/version.rb | 2 +- 137 files changed, 1261 insertions(+), 1573 deletions(-) delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/logging.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concurrent_ruby.jar delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/jruby_object.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/mri_object.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/rbx_lockable_object.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/rbx_object.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/truffleruby_object.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/volatile.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb delete mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/processor_counter.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent-ruby.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/agent.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/array.rb (85%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/async.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atom.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb (94%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb (95%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb (98%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/event.rb (98%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb (95%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/locals.rb create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/lock_local_var.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb (79%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb (83%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb (94%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic/semaphore.rb (95%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/atomic_direct_update.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb (72%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/atomics.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/map/truffleruby_map_backend.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/concern/deprecation.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb (100%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/logging.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/concern/obligation.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/concern/observable.rb (100%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concurrent_ruby.jar rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/configuration.rb (53%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/constants.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/dataflow.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/delay.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/errors.rb (90%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/exchanger.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/executor_service.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb (94%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb (93%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executor/timer_set.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/executors.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/future.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/hash.rb (83%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/immutable_struct.rb (97%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/ivar.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/map.rb (95%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/maybe.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/mutable_struct.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/mvar.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/options.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/promise.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/promises.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/re_include.rb (97%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/scheduled_task.rb (99%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/set.rb (87%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/settable_struct.rb (98%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb (93%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb (80%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/condition.rb (96%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/full_memory_barrier.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb (65%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/lock.rb (92%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb (92%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb (91%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/synchronization/object.rb (73%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/safe_initialization.rb create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/volatile.rb create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb (65%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb (57%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/timer_task.rb (100%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/tuple.rb (94%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/tvar.rb (98%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/utility/engine.rb (73%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb (90%) rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/utility/native_integer.rb (98%) create mode 100644 Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/processor_counter.rb rename Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/{concurrent-ruby-1.1.10 => concurrent-ruby-1.2.0}/lib/concurrent-ruby/concurrent/version.rb (51%) diff --git a/Library/Homebrew/vendor/bundle/bundler/setup.rb b/Library/Homebrew/vendor/bundle/bundler/setup.rb index f84046358b..9640948085 100644 --- a/Library/Homebrew/vendor/bundle/bundler/setup.rb +++ b/Library/Homebrew/vendor/bundle/bundler/setup.rb @@ -23,7 +23,7 @@ kernel = (class << ::Kernel; self; end) k.send(:private, :require) if private_require end end -$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/i18n-1.12.0/lib") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/minitest-5.17.0/lib") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/tzinfo-2.0.5/lib") diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb deleted file mode 100644 index fcdeed7f85..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb +++ /dev/null @@ -1,66 +0,0 @@ -require 'concurrent/constants' - -module Concurrent - - # @!macro thread_local_var - # @!macro internal_implementation_note - # @!visibility private - class AbstractThreadLocalVar - - # @!macro thread_local_var_method_initialize - def initialize(default = nil, &default_block) - if default && block_given? - raise ArgumentError, "Cannot use both value and block as default value" - end - - if block_given? - @default_block = default_block - @default = nil - else - @default_block = nil - @default = default - end - - allocate_storage - end - - # @!macro thread_local_var_method_get - def value - raise NotImplementedError - end - - # @!macro thread_local_var_method_set - def value=(value) - raise NotImplementedError - end - - # @!macro thread_local_var_method_bind - def bind(value, &block) - if block_given? - old_value = self.value - begin - self.value = value - yield - ensure - self.value = old_value - end - end - end - - protected - - # @!visibility private - def allocate_storage - raise NotImplementedError - end - - # @!visibility private - def default - if @default_block - self.value = @default_block.call - else - @default - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb deleted file mode 100644 index 674f866d05..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb +++ /dev/null @@ -1,205 +0,0 @@ -require 'concurrent/synchronization' -require 'concurrent/utility/engine' -require 'concurrent/atomic_reference/numeric_cas_wrapper' - -# Shim for TruffleRuby::AtomicReference -if Concurrent.on_truffleruby? && !defined?(TruffleRuby::AtomicReference) - # @!visibility private - module TruffleRuby - AtomicReference = Truffle::AtomicReference - end -end - -module Concurrent - - # Define update methods that use direct paths - # - # @!visibility private - # @!macro internal_implementation_note - module AtomicDirectUpdate - - # @!macro atomic_reference_method_update - # - # Pass the current value to the given block, replacing it - # with the block's result. May retry if the value changes - # during the block's execution. - # - # @yield [Object] Calculate a new value for the atomic reference using - # given (old) value - # @yieldparam [Object] old_value the starting value of the atomic reference - # @return [Object] the new value - def update - true until compare_and_set(old_value = get, new_value = yield(old_value)) - new_value - end - - # @!macro atomic_reference_method_try_update - # - # Pass the current value to the given block, replacing it - # with the block's result. Return nil if the update fails. - # - # @yield [Object] Calculate a new value for the atomic reference using - # given (old) value - # @yieldparam [Object] old_value the starting value of the atomic reference - # @note This method was altered to avoid raising an exception by default. - # Instead, this method now returns `nil` in case of failure. For more info, - # please see: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 - # @return [Object] the new value, or nil if update failed - def try_update - old_value = get - new_value = yield old_value - - return unless compare_and_set old_value, new_value - - new_value - end - - # @!macro atomic_reference_method_try_update! - # - # Pass the current value to the given block, replacing it - # with the block's result. Raise an exception if the update - # fails. - # - # @yield [Object] Calculate a new value for the atomic reference using - # given (old) value - # @yieldparam [Object] old_value the starting value of the atomic reference - # @note This behavior mimics the behavior of the original - # `AtomicReference#try_update` API. The reason this was changed was to - # avoid raising exceptions (which are inherently slow) by default. For more - # info: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 - # @return [Object] the new value - # @raise [Concurrent::ConcurrentUpdateError] if the update fails - def try_update! - old_value = get - new_value = yield old_value - unless compare_and_set(old_value, new_value) - if $VERBOSE - raise ConcurrentUpdateError, "Update failed" - else - raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE - end - end - new_value - end - end - - require 'concurrent/atomic_reference/mutex_atomic' - - # @!macro atomic_reference - # - # An object reference that may be updated atomically. All read and write - # operations have java volatile semantic. - # - # @!macro thread_safe_variable_comparison - # - # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html - # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html - # - # @!method initialize(value = nil) - # @!macro atomic_reference_method_initialize - # @param [Object] value The initial value. - # - # @!method get - # @!macro atomic_reference_method_get - # Gets the current value. - # @return [Object] the current value - # - # @!method set(new_value) - # @!macro atomic_reference_method_set - # Sets to the given value. - # @param [Object] new_value the new value - # @return [Object] the new value - # - # @!method get_and_set(new_value) - # @!macro atomic_reference_method_get_and_set - # Atomically sets to the given value and returns the old value. - # @param [Object] new_value the new value - # @return [Object] the old value - # - # @!method compare_and_set(old_value, new_value) - # @!macro atomic_reference_method_compare_and_set - # - # Atomically sets the value to the given updated value if - # the current value == the expected value. - # - # @param [Object] old_value the expected value - # @param [Object] new_value the new value - # - # @return [Boolean] `true` if successful. A `false` return indicates - # that the actual value was not equal to the expected value. - # - # @!method update - # @!macro atomic_reference_method_update - # - # @!method try_update - # @!macro atomic_reference_method_try_update - # - # @!method try_update! - # @!macro atomic_reference_method_try_update! - - - # @!macro internal_implementation_note - class ConcurrentUpdateError < ThreadError - # frozen pre-allocated backtrace to speed ConcurrentUpdateError - CONC_UP_ERR_BACKTRACE = ['backtrace elided; set verbose to enable'].freeze - end - - # @!macro internal_implementation_note - AtomicReferenceImplementation = case - when Concurrent.on_cruby? && Concurrent.c_extensions_loaded? - # @!visibility private - # @!macro internal_implementation_note - class CAtomicReference - include AtomicDirectUpdate - include AtomicNumericCompareAndSetWrapper - alias_method :compare_and_swap, :compare_and_set - end - CAtomicReference - when Concurrent.on_jruby? - # @!visibility private - # @!macro internal_implementation_note - class JavaAtomicReference - include AtomicDirectUpdate - end - JavaAtomicReference - when Concurrent.on_truffleruby? - class TruffleRubyAtomicReference < TruffleRuby::AtomicReference - include AtomicDirectUpdate - alias_method :value, :get - alias_method :value=, :set - alias_method :compare_and_swap, :compare_and_set - alias_method :swap, :get_and_set - end - TruffleRubyAtomicReference - when Concurrent.on_rbx? - # @note Extends `Rubinius::AtomicReference` version adding aliases - # and numeric logic. - # - # @!visibility private - # @!macro internal_implementation_note - class RbxAtomicReference < Rubinius::AtomicReference - alias_method :_compare_and_set, :compare_and_set - include AtomicDirectUpdate - include AtomicNumericCompareAndSetWrapper - alias_method :value, :get - alias_method :value=, :set - alias_method :swap, :get_and_set - alias_method :compare_and_swap, :compare_and_set - end - RbxAtomicReference - else - MutexAtomicReference - end - private_constant :AtomicReferenceImplementation - - # @!macro atomic_reference - class AtomicReference < AtomicReferenceImplementation - - # @return [String] Short string representation. - def to_s - format '%s value:%s>', super[0..-2], get - end - - alias_method :inspect, :to_s - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb deleted file mode 100644 index b41018ffed..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'concurrent/atomic/abstract_thread_local_var' - -if Concurrent.on_jruby? - - module Concurrent - - # @!visibility private - # @!macro internal_implementation_note - class JavaThreadLocalVar < AbstractThreadLocalVar - - # @!macro thread_local_var_method_get - def value - value = @var.get - - if value.nil? - default - elsif value == NULL - nil - else - value - end - end - - # @!macro thread_local_var_method_set - def value=(value) - @var.set(value) - end - - protected - - # @!visibility private - def allocate_storage - @var = java.lang.ThreadLocal.new - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb deleted file mode 100644 index 9a51eb288b..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb +++ /dev/null @@ -1,181 +0,0 @@ -require 'thread' -require 'concurrent/atomic/abstract_thread_local_var' - -module Concurrent - - # @!visibility private - # @!macro internal_implementation_note - class RubyThreadLocalVar < AbstractThreadLocalVar - - # Each thread has a (lazily initialized) array of thread-local variable values - # Each time a new thread-local var is created, we allocate an "index" for it - # For example, if the allocated index is 1, that means slot #1 in EVERY - # thread's thread-local array will be used for the value of that TLV - # - # The good thing about using a per-THREAD structure to hold values, rather - # than a per-TLV structure, is that no synchronization is needed when - # reading and writing those values (since the structure is only ever - # accessed by a single thread) - # - # Of course, when a TLV is GC'd, 1) we need to recover its index for use - # by other new TLVs (otherwise the thread-local arrays could get bigger - # and bigger with time), and 2) we need to null out all the references - # held in the now-unused slots (both to avoid blocking GC of those objects, - # and also to prevent "stale" values from being passed on to a new TLV - # when the index is reused) - # Because we need to null out freed slots, we need to keep references to - # ALL the thread-local arrays -- ARRAYS is for that - # But when a Thread is GC'd, we need to drop the reference to its thread-local - # array, so we don't leak memory - - FREE = [] - LOCK = Mutex.new - THREAD_LOCAL_ARRAYS = {} # used as a hash set - - # synchronize when not on MRI - # on MRI using lock in finalizer leads to "can't be called from trap context" error - # so the code is carefully written to be tread-safe on MRI relying on GIL - - if Concurrent.on_cruby? - # @!visibility private - def self.semi_sync(&block) - block.call - end - else - # @!visibility private - def self.semi_sync(&block) - LOCK.synchronize(&block) - end - end - - private_constant :FREE, :LOCK, :THREAD_LOCAL_ARRAYS - - # @!macro thread_local_var_method_get - def value - if (array = get_threadlocal_array) - value = array[@index] - if value.nil? - default - elsif value.equal?(NULL) - nil - else - value - end - else - default - end - end - - # @!macro thread_local_var_method_set - def value=(value) - me = Thread.current - # We could keep the thread-local arrays in a hash, keyed by Thread - # But why? That would require locking - # Using Ruby's built-in thread-local storage is faster - unless (array = get_threadlocal_array(me)) - array = set_threadlocal_array([], me) - self.class.semi_sync { THREAD_LOCAL_ARRAYS[array.object_id] = array } - ObjectSpace.define_finalizer(me, self.class.thread_finalizer(array.object_id)) - end - array[@index] = (value.nil? ? NULL : value) - value - end - - protected - - # @!visibility private - def allocate_storage - @index = FREE.pop || next_index - - ObjectSpace.define_finalizer(self, self.class.thread_local_finalizer(@index)) - end - - # @!visibility private - def self.thread_local_finalizer(index) - proc do - semi_sync do - # The cost of GC'ing a TLV is linear in the number of threads using TLVs - # But that is natural! More threads means more storage is used per TLV - # So naturally more CPU time is required to free more storage - # - # DO NOT use each_value which might conflict with new pair assignment - # into the hash in #value= method - THREAD_LOCAL_ARRAYS.values.each { |array| array[index] = nil } - # free index has to be published after the arrays are cleared - FREE.push(index) - end - end - end - - # @!visibility private - def self.thread_finalizer(id) - proc do - semi_sync do - # The thread which used this thread-local array is now gone - # So don't hold onto a reference to the array (thus blocking GC) - THREAD_LOCAL_ARRAYS.delete(id) - end - end - end - - private - - # noinspection RubyClassVariableUsageInspection - @@next = 0 - # noinspection RubyClassVariableUsageInspection - def next_index - LOCK.synchronize do - result = @@next - @@next += 1 - result - end - end - - if Thread.instance_methods.include?(:thread_variable_get) - - def get_threadlocal_array(thread = Thread.current) - thread.thread_variable_get(:__threadlocal_array__) - end - - def set_threadlocal_array(array, thread = Thread.current) - thread.thread_variable_set(:__threadlocal_array__, array) - end - - else - - def get_threadlocal_array(thread = Thread.current) - thread[:__threadlocal_array__] - end - - def set_threadlocal_array(array, thread = Thread.current) - thread[:__threadlocal_array__] = array - end - end - - # This exists only for use in testing - # @!visibility private - def value_for(thread) - if (array = get_threadlocal_array(thread)) - value = array[@index] - if value.nil? - get_default - elsif value.equal?(NULL) - nil - else - value - end - else - get_default - end - end - - # @!visibility private - def get_default - if @default_block - raise "Cannot use default_for with default block" - else - @default - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb deleted file mode 100644 index 100cc8de8f..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb +++ /dev/null @@ -1,104 +0,0 @@ -require 'concurrent/utility/engine' -require 'concurrent/atomic/ruby_thread_local_var' -require 'concurrent/atomic/java_thread_local_var' - -module Concurrent - - ################################################################### - - # @!macro thread_local_var_method_initialize - # - # Creates a thread local variable. - # - # @param [Object] default the default value when otherwise unset - # @param [Proc] default_block Optional block that gets called to obtain the - # default value for each thread - - # @!macro thread_local_var_method_get - # - # Returns the value in the current thread's copy of this thread-local variable. - # - # @return [Object] the current value - - # @!macro thread_local_var_method_set - # - # Sets the current thread's copy of this thread-local variable to the specified value. - # - # @param [Object] value the value to set - # @return [Object] the new value - - # @!macro thread_local_var_method_bind - # - # Bind the given value to thread local storage during - # execution of the given block. - # - # @param [Object] value the value to bind - # @yield the operation to be performed with the bound variable - # @return [Object] the value - - - ################################################################### - - # @!macro thread_local_var_public_api - # - # @!method initialize(default = nil, &default_block) - # @!macro thread_local_var_method_initialize - # - # @!method value - # @!macro thread_local_var_method_get - # - # @!method value=(value) - # @!macro thread_local_var_method_set - # - # @!method bind(value, &block) - # @!macro thread_local_var_method_bind - - ################################################################### - - # @!visibility private - # @!macro internal_implementation_note - ThreadLocalVarImplementation = case - when Concurrent.on_jruby? - JavaThreadLocalVar - else - RubyThreadLocalVar - end - private_constant :ThreadLocalVarImplementation - - # @!macro thread_local_var - # - # A `ThreadLocalVar` is a variable where the value is different for each thread. - # Each variable may have a default value, but when you modify the variable only - # the current thread will ever see that change. - # - # @!macro thread_safe_variable_comparison - # - # @example - # v = ThreadLocalVar.new(14) - # v.value #=> 14 - # v.value = 2 - # v.value #=> 2 - # - # @example - # v = ThreadLocalVar.new(14) - # - # t1 = Thread.new do - # v.value #=> 14 - # v.value = 1 - # v.value #=> 1 - # end - # - # t2 = Thread.new do - # v.value #=> 14 - # v.value = 2 - # v.value #=> 2 - # end - # - # v.value #=> 14 - # - # @see https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html Java ThreadLocal - # - # @!macro thread_local_var_public_api - class ThreadLocalVar < ThreadLocalVarImplementation - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/logging.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/logging.rb deleted file mode 100644 index 2c749996f9..0000000000 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/logging.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'logger' - -module Concurrent - module Concern - - # Include where logging is needed - # - # @!visibility private - module Logging - include Logger::Severity - - # Logs through {Concurrent.global_logger}, it can be overridden by setting @logger - # @param [Integer] level one of Logger::Severity constants - # @param [String] progname e.g. a path of an Actor - # @param [String, nil] message when nil block is used to generate the message - # @yieldreturn [String] a message - def log(level, progname, message = nil, &block) - #NOTE: Cannot require 'concurrent/configuration' above due to circular references. - # Assume that the gem has been initialized if we've gotten this far. - logger = if defined?(@logger) && @logger - @logger - else - Concurrent.global_logger - end - logger.call level, progname, message, &block - rescue => error - $stderr.puts "`Concurrent.configuration.logger` failed to log #{[level, progname, message, block]}\n" + - "#{error.message} (#{error.class})\n#{error.backtrace.join "\n"}" - end - end - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concurrent_ruby.jar b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concurrent_ruby.jar deleted file mode 100644 index e0d30ecb0f9daeae3e453e71a51581cf98424a44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137917 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

~yHC{cYaGgHR1=3AR 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 0 ? ppc : processor_count - rescue - return 1 - end - end - end - - # create the default ProcessorCounter on load - @processor_counter = Utility::ProcessorCounter.new - singleton_class.send :attr_reader, :processor_counter - - def self.processor_count - processor_counter.processor_count - end - - def self.physical_processor_count - processor_counter.physical_processor_count - end -end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent-ruby.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent-ruby.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent-ruby.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent-ruby.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/agent.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/agent.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/agent.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/agent.rb index 815dca008c..2d32926ba1 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/agent.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/agent.rb @@ -1,9 +1,10 @@ require 'concurrent/configuration' require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/count_down_latch' require 'concurrent/atomic/thread_local_var' require 'concurrent/collection/copy_on_write_observer_set' require 'concurrent/concern/observable' -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/array.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/array.rb similarity index 85% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/array.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/array.rb index 60e5b5689d..96434a288d 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/array.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/array.rb @@ -34,16 +34,6 @@ module Concurrent end JRubyArray - when Concurrent.on_rbx? - require 'monitor' - require 'concurrent/thread_safe/util/data_structures' - - class RbxArray < ::Array - end - - ThreadSafe::Util.make_synchronized_on_rbx RbxArray - RbxArray - when Concurrent.on_truffleruby? require 'concurrent/thread_safe/util/data_structures' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/async.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/async.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/async.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/async.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atom.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atom.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atom.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atom.rb index 8a45730082..1074006d76 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atom.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atom.rb @@ -1,7 +1,7 @@ require 'concurrent/atomic/atomic_reference' require 'concurrent/collection/copy_on_notify_observer_set' require 'concurrent/concern/observable' -require 'concurrent/synchronization' +require 'concurrent/synchronization/object' # @!macro thread_safe_variable_comparison # diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb similarity index 94% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb index 0b0373dc29..f775691a2a 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb @@ -1,5 +1,6 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first + require 'concurrent/atomic/mutex_atomic_boolean' -require 'concurrent/synchronization' module Concurrent @@ -79,10 +80,10 @@ module Concurrent # @!visibility private # @!macro internal_implementation_note AtomicBooleanImplementation = case - when defined?(JavaAtomicBoolean) - JavaAtomicBoolean - when defined?(CAtomicBoolean) + when Concurrent.on_cruby? && Concurrent.c_extensions_loaded? CAtomicBoolean + when Concurrent.on_jruby? + JavaAtomicBoolean else MutexAtomicBoolean end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb similarity index 95% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb index c67166d833..26cd05d869 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb @@ -1,5 +1,6 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first + require 'concurrent/atomic/mutex_atomic_fixnum' -require 'concurrent/synchronization' module Concurrent @@ -96,10 +97,10 @@ module Concurrent # @!visibility private # @!macro internal_implementation_note AtomicFixnumImplementation = case - when defined?(JavaAtomicFixnum) - JavaAtomicFixnum - when defined?(CAtomicFixnum) + when Concurrent.on_cruby? && Concurrent.c_extensions_loaded? CAtomicFixnum + when Concurrent.on_jruby? + JavaAtomicFixnum else MutexAtomicFixnum end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb index f20cd46a52..e16be65772 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb @@ -1,3 +1,6 @@ +require 'concurrent/errors' +require 'concurrent/synchronization/object' + module Concurrent # An atomic reference which maintains an object reference along with a mark bit # that can be updated atomically. diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb new file mode 100644 index 0000000000..bb5fb77459 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb @@ -0,0 +1,135 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first + +require 'concurrent/atomic_reference/atomic_direct_update' +require 'concurrent/atomic_reference/numeric_cas_wrapper' +require 'concurrent/atomic_reference/mutex_atomic' + +# Shim for TruffleRuby::AtomicReference +if Concurrent.on_truffleruby? && !defined?(TruffleRuby::AtomicReference) + # @!visibility private + module TruffleRuby + AtomicReference = Truffle::AtomicReference + end +end + +module Concurrent + + # @!macro internal_implementation_note + AtomicReferenceImplementation = case + when Concurrent.on_cruby? && Concurrent.c_extensions_loaded? + # @!visibility private + # @!macro internal_implementation_note + class CAtomicReference + include AtomicDirectUpdate + include AtomicNumericCompareAndSetWrapper + alias_method :compare_and_swap, :compare_and_set + end + CAtomicReference + when Concurrent.on_jruby? + # @!visibility private + # @!macro internal_implementation_note + class JavaAtomicReference + include AtomicDirectUpdate + end + JavaAtomicReference + when Concurrent.on_truffleruby? + class TruffleRubyAtomicReference < TruffleRuby::AtomicReference + include AtomicDirectUpdate + alias_method :value, :get + alias_method :value=, :set + alias_method :compare_and_swap, :compare_and_set + alias_method :swap, :get_and_set + end + TruffleRubyAtomicReference + else + MutexAtomicReference + end + private_constant :AtomicReferenceImplementation + + # An object reference that may be updated atomically. All read and write + # operations have java volatile semantic. + # + # @!macro thread_safe_variable_comparison + # + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html + # + # @!method initialize(value = nil) + # @!macro atomic_reference_method_initialize + # @param [Object] value The initial value. + # + # @!method get + # @!macro atomic_reference_method_get + # Gets the current value. + # @return [Object] the current value + # + # @!method set(new_value) + # @!macro atomic_reference_method_set + # Sets to the given value. + # @param [Object] new_value the new value + # @return [Object] the new value + # + # @!method get_and_set(new_value) + # @!macro atomic_reference_method_get_and_set + # Atomically sets to the given value and returns the old value. + # @param [Object] new_value the new value + # @return [Object] the old value + # + # @!method compare_and_set(old_value, new_value) + # @!macro atomic_reference_method_compare_and_set + # + # Atomically sets the value to the given updated value if + # the current value == the expected value. + # + # @param [Object] old_value the expected value + # @param [Object] new_value the new value + # + # @return [Boolean] `true` if successful. A `false` return indicates + # that the actual value was not equal to the expected value. + # + # @!method update + # Pass the current value to the given block, replacing it + # with the block's result. May retry if the value changes + # during the block's execution. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # @return [Object] the new value + # + # @!method try_update + # Pass the current value to the given block, replacing it + # with the block's result. Return nil if the update fails. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # @note This method was altered to avoid raising an exception by default. + # Instead, this method now returns `nil` in case of failure. For more info, + # please see: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 + # @return [Object] the new value, or nil if update failed + # + # @!method try_update! + # Pass the current value to the given block, replacing it + # with the block's result. Raise an exception if the update + # fails. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # @note This behavior mimics the behavior of the original + # `AtomicReference#try_update` API. The reason this was changed was to + # avoid raising exceptions (which are inherently slow) by default. For more + # info: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 + # @return [Object] the new value + # @raise [Concurrent::ConcurrentUpdateError] if the update fails + class AtomicReference < AtomicReferenceImplementation + + # @return [String] Short string representation. + def to_s + format '%s value:%s>', super[0..-2], get + end + + alias_method :inspect, :to_s + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb index 42f5a94967..9ebe29dd09 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' require 'concurrent/utility/native_integer' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/event.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/event.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/event.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/event.rb index 31700ce22b..ccf84c9d1b 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/event.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/event.rb @@ -1,5 +1,5 @@ require 'thread' -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb new file mode 100644 index 0000000000..e90fc24f9e --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb @@ -0,0 +1,109 @@ +require 'concurrent/constants' +require_relative 'locals' + +module Concurrent + + # A `FiberLocalVar` is a variable where the value is different for each fiber. + # Each variable may have a default value, but when you modify the variable only + # the current fiber will ever see that change. + # + # This is similar to Ruby's built-in fiber-local variables (`Thread.current[:name]`), + # but with these major advantages: + # * `FiberLocalVar` has its own identity, it doesn't need a Symbol. + # * Each Ruby's built-in fiber-local variable leaks some memory forever (it's a Symbol held forever on the fiber), + # so it's only OK to create a small amount of them. + # `FiberLocalVar` has no such issue and it is fine to create many of them. + # * Ruby's built-in fiber-local variables leak forever the value set on each fiber (unless set to nil explicitly). + # `FiberLocalVar` automatically removes the mapping for each fiber once the `FiberLocalVar` instance is GC'd. + # + # @example + # v = FiberLocalVar.new(14) + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # + # @example + # v = FiberLocalVar.new(14) + # + # Fiber.new do + # v.value #=> 14 + # v.value = 1 + # v.value #=> 1 + # end.resume + # + # Fiber.new do + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # end.resume + # + # v.value #=> 14 + class FiberLocalVar + LOCALS = FiberLocals.new + + # Creates a fiber local variable. + # + # @param [Object] default the default value when otherwise unset + # @param [Proc] default_block Optional block that gets called to obtain the + # default value for each fiber + def initialize(default = nil, &default_block) + if default && block_given? + raise ArgumentError, "Cannot use both value and block as default value" + end + + if block_given? + @default_block = default_block + @default = nil + else + @default_block = nil + @default = default + end + + @index = LOCALS.next_index(self) + end + + # Returns the value in the current fiber's copy of this fiber-local variable. + # + # @return [Object] the current value + def value + LOCALS.fetch(@index) { default } + end + + # Sets the current fiber's copy of this fiber-local variable to the specified value. + # + # @param [Object] value the value to set + # @return [Object] the new value + def value=(value) + LOCALS.set(@index, value) + end + + # Bind the given value to fiber local storage during + # execution of the given block. + # + # @param [Object] value the value to bind + # @yield the operation to be performed with the bound variable + # @return [Object] the value + def bind(value) + if block_given? + old_value = self.value + self.value = value + begin + yield + ensure + self.value = old_value + end + end + end + + protected + + # @!visibility private + def default + if @default_block + self.value = @default_block.call + else + @default + end + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb similarity index 95% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb index cb5b35a567..3c119bc32c 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb @@ -1,4 +1,5 @@ if Concurrent.on_jruby? + require 'concurrent/utility/native_extension_loader' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/locals.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/locals.rb new file mode 100644 index 0000000000..6d268a3354 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/locals.rb @@ -0,0 +1,188 @@ +require 'concurrent/utility/engine' +require 'concurrent/constants' + +module Concurrent + # @!visibility private + # @!macro internal_implementation_note + # + # An abstract implementation of local storage, with sub-classes for + # per-thread and per-fiber locals. + # + # Each execution context (EC, thread or fiber) has a lazily initialized array + # of local variable values. Each time a new local variable is created, we + # allocate an "index" for it. + # + # For example, if the allocated index is 1, that means slot #1 in EVERY EC's + # locals array will be used for the value of that variable. + # + # The good thing about using a per-EC structure to hold values, rather than + # a global, is that no synchronization is needed when reading and writing + # those values (since the structure is only ever accessed by a single + # thread). + # + # Of course, when a local variable is GC'd, 1) we need to recover its index + # for use by other new local variables (otherwise the locals arrays could + # get bigger and bigger with time), and 2) we need to null out all the + # references held in the now-unused slots (both to avoid blocking GC of those + # objects, and also to prevent "stale" values from being passed on to a new + # local when the index is reused). + # + # Because we need to null out freed slots, we need to keep references to + # ALL the locals arrays, so we can null out the appropriate slots in all of + # them. This is why we need to use a finalizer to clean up the locals array + # when the EC goes out of scope. + class AbstractLocals + def initialize + @free = [] + @lock = Mutex.new + @all_arrays = {} + @next = 0 + end + + def synchronize + @lock.synchronize { yield } + end + + if Concurrent.on_cruby? + def weak_synchronize + yield + end + else + alias_method :weak_synchronize, :synchronize + end + + def next_index(local) + index = synchronize do + if @free.empty? + @next += 1 + else + @free.pop + end + end + + # When the local goes out of scope, we should free the associated index + # and all values stored into it. + ObjectSpace.define_finalizer(local, local_finalizer(index)) + + index + end + + def free_index(index) + weak_synchronize do + # The cost of GC'ing a TLV is linear in the number of ECs using local + # variables. But that is natural! More ECs means more storage is used + # per local variable. So naturally more CPU time is required to free + # more storage. + # + # DO NOT use each_value which might conflict with new pair assignment + # into the hash in #set method. + @all_arrays.values.each do |locals| + locals[index] = nil + end + + # free index has to be published after the arrays are cleared: + @free << index + end + end + + def fetch(index) + locals = self.locals + value = locals ? locals[index] : nil + + if nil == value + yield + elsif NULL.equal?(value) + nil + else + value + end + end + + def set(index, value) + locals = self.locals! + locals[index] = (nil == value ? NULL : value) + + value + end + + private + + # When the local goes out of scope, clean up that slot across all locals currently assigned. + def local_finalizer(index) + proc do + free_index(index) + end + end + + # When a thread/fiber goes out of scope, remove the array from @all_arrays. + def thread_fiber_finalizer(array_object_id) + proc do + weak_synchronize do + @all_arrays.delete(array_object_id) + end + end + end + + # Returns the locals for the current scope, or nil if none exist. + def locals + raise NotImplementedError + end + + # Returns the locals for the current scope, creating them if necessary. + def locals! + raise NotImplementedError + end + end + + # @!visibility private + # @!macro internal_implementation_note + # An array-backed storage of indexed variables per thread. + class ThreadLocals < AbstractLocals + def locals + Thread.current.thread_variable_get(:concurrent_thread_locals) + end + + def locals! + thread = Thread.current + locals = thread.thread_variable_get(:concurrent_thread_locals) + + unless locals + locals = thread.thread_variable_set(:concurrent_thread_locals, []) + weak_synchronize do + @all_arrays[locals.object_id] = locals + end + # When the thread goes out of scope, we should delete the associated locals: + ObjectSpace.define_finalizer(thread, thread_fiber_finalizer(locals.object_id)) + end + + locals + end + end + + # @!visibility private + # @!macro internal_implementation_note + # An array-backed storage of indexed variables per fiber. + class FiberLocals < AbstractLocals + def locals + Thread.current[:concurrent_fiber_locals] + end + + def locals! + thread = Thread.current + locals = thread[:concurrent_fiber_locals] + + unless locals + locals = thread[:concurrent_fiber_locals] = [] + weak_synchronize do + @all_arrays[locals.object_id] = locals + end + # When the fiber goes out of scope, we should delete the associated locals: + ObjectSpace.define_finalizer(Fiber.current, thread_fiber_finalizer(locals.object_id)) + end + + locals + end + end + + private_constant :AbstractLocals, :ThreadLocals, :FiberLocals +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/lock_local_var.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/lock_local_var.rb new file mode 100644 index 0000000000..ebf23a2414 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/lock_local_var.rb @@ -0,0 +1,28 @@ +require 'concurrent/utility/engine' +require_relative 'fiber_local_var' +require_relative 'thread_local_var' + +module Concurrent + # @!visibility private + def self.mutex_owned_per_thread? + return false if Concurrent.on_jruby? || Concurrent.on_truffleruby? + + mutex = Mutex.new + # Lock the mutex: + mutex.synchronize do + # Check if the mutex is still owned in a child fiber: + Fiber.new { mutex.owned? }.resume + end + end + + if mutex_owned_per_thread? + LockLocalVar = ThreadLocalVar + else + LockLocalVar = FiberLocalVar + end + + # Either {FiberLocalVar} or {ThreadLocalVar} depending on whether Mutex (and Monitor) + # are held, respectively, per Fiber or per Thread. + class LockLocalVar + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb similarity index 79% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb index a033de4cad..015996b06f 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb @@ -1,16 +1,18 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/safe_initialization' module Concurrent # @!macro atomic_boolean # @!visibility private # @!macro internal_implementation_note - class MutexAtomicBoolean < Synchronization::LockableObject + class MutexAtomicBoolean + extend Concurrent::Synchronization::SafeInitialization # @!macro atomic_boolean_method_initialize def initialize(initial = false) super() - synchronize { ns_initialize(initial) } + @Lock = ::Mutex.new + @value = !!initial end # @!macro atomic_boolean_method_value_get @@ -46,8 +48,12 @@ module Concurrent protected # @!visibility private - def ns_initialize(initial) - @value = !!initial + def synchronize + if @Lock.owned? + yield + else + @Lock.synchronize { yield } + end end private diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb similarity index 83% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb index 77b91d2dbf..0ca395579f 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/safe_initialization' require 'concurrent/utility/native_integer' module Concurrent @@ -6,12 +6,14 @@ module Concurrent # @!macro atomic_fixnum # @!visibility private # @!macro internal_implementation_note - class MutexAtomicFixnum < Synchronization::LockableObject + class MutexAtomicFixnum + extend Concurrent::Synchronization::SafeInitialization # @!macro atomic_fixnum_method_initialize def initialize(initial = 0) super() - synchronize { ns_initialize(initial) } + @Lock = ::Mutex.new + ns_set(initial) end # @!macro atomic_fixnum_method_value_get @@ -60,8 +62,12 @@ module Concurrent protected # @!visibility private - def ns_initialize(initial) - ns_set(initial) + def synchronize + if @Lock.owned? + yield + else + @Lock.synchronize { yield } + end end private diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb similarity index 94% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb index e99744cef6..29aa1caa4f 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' require 'concurrent/utility/native_integer' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb index b6ac45f9c0..4347289f1e 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' require 'concurrent/utility/native_integer' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb index 246f21aac3..b26bd17a08 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb @@ -1,7 +1,8 @@ require 'thread' require 'concurrent/atomic/atomic_fixnum' require 'concurrent/errors' -require 'concurrent/synchronization' +require 'concurrent/synchronization/object' +require 'concurrent/synchronization/lock' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb index 92c96fd16d..6d72a3a097 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb @@ -1,8 +1,10 @@ require 'thread' require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/atomic_fixnum' require 'concurrent/errors' -require 'concurrent/synchronization' -require 'concurrent/atomic/thread_local_var' +require 'concurrent/synchronization/object' +require 'concurrent/synchronization/lock' +require 'concurrent/atomic/lock_local_var' module Concurrent @@ -109,7 +111,7 @@ module Concurrent @Counter = AtomicFixnum.new(0) # single integer which represents lock state @ReadQueue = Synchronization::Lock.new # used to queue waiting readers @WriteQueue = Synchronization::Lock.new # used to queue waiting writers - @HeldCount = ThreadLocalVar.new(0) # indicates # of R & W locks held by this thread + @HeldCount = LockLocalVar.new(0) # indicates # of R & W locks held by this thread end # Execute a block operation within a read lock. diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/semaphore.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/semaphore.rb similarity index 95% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/semaphore.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/semaphore.rb index cc6a8925bc..f0799f0f41 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic/semaphore.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/semaphore.rb @@ -1,5 +1,4 @@ require 'concurrent/atomic/mutex_semaphore' -require 'concurrent/synchronization' module Concurrent @@ -11,7 +10,7 @@ module Concurrent # # @param [Fixnum] count the initial count # - # @raise [ArgumentError] if `count` is not an integer or is less than zero + # @raise [ArgumentError] if `count` is not an integer # @!macro semaphore_method_acquire # @@ -21,8 +20,7 @@ module Concurrent # # @param [Fixnum] permits Number of permits to acquire # - # @raise [ArgumentError] if `permits` is not an integer or is less than - # one + # @raise [ArgumentError] if `permits` is not an integer or is less than zero # # @return [nil, BasicObject] Without a block, `nil` is returned. If a block # is given, its return value is returned. @@ -52,8 +50,7 @@ module Concurrent # @param [Fixnum] timeout the number of seconds to wait for the counter # or `nil` to return immediately # - # @raise [ArgumentError] if `permits` is not an integer or is less than - # one + # @raise [ArgumentError] if `permits` is not an integer or is less than zero # # @return [true, false, nil, BasicObject] `false` if no permits are # available, `true` when acquired a permit. If a block is given, the @@ -66,7 +63,7 @@ module Concurrent # # @param [Fixnum] permits Number of permits to return to the semaphore. # - # @raise [ArgumentError] if `permits` is not a number or is less than one + # @raise [ArgumentError] if `permits` is not a number or is less than zero # # @return [nil] @@ -96,8 +93,8 @@ module Concurrent # @!visibility private # @!macro internal_implementation_note - SemaphoreImplementation = case - when defined?(JavaSemaphore) + SemaphoreImplementation = if Concurrent.on_jruby? + require 'concurrent/utility/native_extension_loader' JavaSemaphore else MutexSemaphore diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb new file mode 100644 index 0000000000..3b7e12b5bb --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb @@ -0,0 +1,111 @@ +require 'concurrent/constants' +require_relative 'locals' + +module Concurrent + + # A `ThreadLocalVar` is a variable where the value is different for each thread. + # Each variable may have a default value, but when you modify the variable only + # the current thread will ever see that change. + # + # This is similar to Ruby's built-in thread-local variables (`Thread#thread_variable_get`), + # but with these major advantages: + # * `ThreadLocalVar` has its own identity, it doesn't need a Symbol. + # * Each Ruby's built-in thread-local variable leaks some memory forever (it's a Symbol held forever on the thread), + # so it's only OK to create a small amount of them. + # `ThreadLocalVar` has no such issue and it is fine to create many of them. + # * Ruby's built-in thread-local variables leak forever the value set on each thread (unless set to nil explicitly). + # `ThreadLocalVar` automatically removes the mapping for each thread once the `ThreadLocalVar` instance is GC'd. + # + # @!macro thread_safe_variable_comparison + # + # @example + # v = ThreadLocalVar.new(14) + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # + # @example + # v = ThreadLocalVar.new(14) + # + # t1 = Thread.new do + # v.value #=> 14 + # v.value = 1 + # v.value #=> 1 + # end + # + # t2 = Thread.new do + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # end + # + # v.value #=> 14 + class ThreadLocalVar + LOCALS = ThreadLocals.new + + # Creates a thread local variable. + # + # @param [Object] default the default value when otherwise unset + # @param [Proc] default_block Optional block that gets called to obtain the + # default value for each thread + def initialize(default = nil, &default_block) + if default && block_given? + raise ArgumentError, "Cannot use both value and block as default value" + end + + if block_given? + @default_block = default_block + @default = nil + else + @default_block = nil + @default = default + end + + @index = LOCALS.next_index(self) + end + + # Returns the value in the current thread's copy of this thread-local variable. + # + # @return [Object] the current value + def value + LOCALS.fetch(@index) { default } + end + + # Sets the current thread's copy of this thread-local variable to the specified value. + # + # @param [Object] value the value to set + # @return [Object] the new value + def value=(value) + LOCALS.set(@index, value) + end + + # Bind the given value to thread local storage during + # execution of the given block. + # + # @param [Object] value the value to bind + # @yield the operation to be performed with the bound variable + # @return [Object] the value + def bind(value) + if block_given? + old_value = self.value + self.value = value + begin + yield + ensure + self.value = old_value + end + end + end + + protected + + # @!visibility private + def default + if @default_block + self.value = @default_block.call + else + @default + end + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/atomic_direct_update.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/atomic_direct_update.rb new file mode 100644 index 0000000000..5d2d7edd4f --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/atomic_direct_update.rb @@ -0,0 +1,37 @@ +require 'concurrent/errors' + +module Concurrent + + # Define update methods that use direct paths + # + # @!visibility private + # @!macro internal_implementation_note + module AtomicDirectUpdate + def update + true until compare_and_set(old_value = get, new_value = yield(old_value)) + new_value + end + + def try_update + old_value = get + new_value = yield old_value + + return unless compare_and_set old_value, new_value + + new_value + end + + def try_update! + old_value = get + new_value = yield old_value + unless compare_and_set(old_value, new_value) + if $VERBOSE + raise ConcurrentUpdateError, "Update failed" + else + raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE + end + end + new_value + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb similarity index 72% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb index d092aedd5b..e5e2a6377d 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb @@ -1,8 +1,13 @@ +require 'concurrent/atomic_reference/atomic_direct_update' +require 'concurrent/atomic_reference/numeric_cas_wrapper' +require 'concurrent/synchronization/safe_initialization' + module Concurrent # @!visibility private # @!macro internal_implementation_note - class MutexAtomicReference < Synchronization::LockableObject + class MutexAtomicReference + extend Concurrent::Synchronization::SafeInitialization include AtomicDirectUpdate include AtomicNumericCompareAndSetWrapper alias_method :compare_and_swap, :compare_and_set @@ -10,7 +15,8 @@ module Concurrent # @!macro atomic_reference_method_initialize def initialize(value = nil) super() - synchronize { ns_initialize(value) } + @Lock = ::Mutex.new + @value = value end # @!macro atomic_reference_method_get @@ -49,8 +55,13 @@ module Concurrent protected - def ns_initialize(value) - @value = value + # @!visibility private + def synchronize + if @Lock.owned? + yield + else + @Lock.synchronize { yield } + end end end end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomics.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomics.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/atomics.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/atomics.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb index 50d52a6237..7c700bd78a 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent module Collection diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb index 3f3f7cccd0..bcb6750d41 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent module Collection diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb index d003d3cf73..3704410ba0 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb @@ -1,3 +1,5 @@ +require 'concurrent/synchronization/object' + module Concurrent # @!macro warn.edge diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/truffleruby_map_backend.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/truffleruby_map_backend.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/map/truffleruby_map_backend.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/map/truffleruby_map_backend.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/deprecation.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/deprecation.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/deprecation.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/deprecation.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/logging.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/logging.rb new file mode 100644 index 0000000000..568a539ebf --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/logging.rb @@ -0,0 +1,116 @@ +require 'logger' +require 'concurrent/atomic/atomic_reference' + +module Concurrent + module Concern + + # Include where logging is needed + # + # @!visibility private + module Logging + include Logger::Severity + + # Logs through {Concurrent.global_logger}, it can be overridden by setting @logger + # @param [Integer] level one of Logger::Severity constants + # @param [String] progname e.g. a path of an Actor + # @param [String, nil] message when nil block is used to generate the message + # @yieldreturn [String] a message + def log(level, progname, message = nil, &block) + logger = if defined?(@logger) && @logger + @logger + else + Concurrent.global_logger + end + logger.call level, progname, message, &block + rescue => error + $stderr.puts "`Concurrent.configuration.logger` failed to log #{[level, progname, message, block]}\n" + + "#{error.message} (#{error.class})\n#{error.backtrace.join "\n"}" + end + end + end +end + +module Concurrent + extend Concern::Logging + + # @return [Logger] Logger with provided level and output. + def self.create_simple_logger(level = Logger::FATAL, output = $stderr) + # TODO (pitr-ch 24-Dec-2016): figure out why it had to be replaced, stdlogger was deadlocking + lambda do |severity, progname, message = nil, &block| + return false if severity < level + + message = block ? block.call : message + formatted_message = case message + when String + message + when Exception + format "%s (%s)\n%s", + message.message, message.class, (message.backtrace || []).join("\n") + else + message.inspect + end + + output.print format "[%s] %5s -- %s: %s\n", + Time.now.strftime('%Y-%m-%d %H:%M:%S.%L'), + Logger::SEV_LABEL[severity], + progname, + formatted_message + true + end + end + + # Use logger created by #create_simple_logger to log concurrent-ruby messages. + def self.use_simple_logger(level = Logger::FATAL, output = $stderr) + Concurrent.global_logger = create_simple_logger level, output + end + + # @return [Logger] Logger with provided level and output. + # @deprecated + def self.create_stdlib_logger(level = Logger::FATAL, output = $stderr) + logger = Logger.new(output) + logger.level = level + logger.formatter = lambda do |severity, datetime, progname, msg| + formatted_message = case msg + when String + msg + when Exception + format "%s (%s)\n%s", + msg.message, msg.class, (msg.backtrace || []).join("\n") + else + msg.inspect + end + format "[%s] %5s -- %s: %s\n", + datetime.strftime('%Y-%m-%d %H:%M:%S.%L'), + severity, + progname, + formatted_message + end + + lambda do |loglevel, progname, message = nil, &block| + logger.add loglevel, message, progname, &block + end + end + + # Use logger created by #create_stdlib_logger to log concurrent-ruby messages. + # @deprecated + def self.use_stdlib_logger(level = Logger::FATAL, output = $stderr) + Concurrent.global_logger = create_stdlib_logger level, output + end + + # TODO (pitr-ch 27-Dec-2016): remove deadlocking stdlib_logger methods + + # Suppresses all output when used for logging. + NULL_LOGGER = lambda { |level, progname, message = nil, &block| } + + # @!visibility private + GLOBAL_LOGGER = AtomicReference.new(create_simple_logger(Logger::WARN)) + private_constant :GLOBAL_LOGGER + + def self.global_logger + GLOBAL_LOGGER.value + end + + def self.global_logger=(value) + GLOBAL_LOGGER.value = value + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/obligation.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/obligation.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/obligation.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/obligation.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/observable.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/observable.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/concern/observable.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concern/observable.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concurrent_ruby.jar b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/concurrent_ruby.jar new file mode 100644 index 0000000000000000000000000000000000000000..d470225d48027a5c500608b8e484626dd69d4ee3 GIT binary patch literal 135855 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 z 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 literal 0 HcmV?d00001 diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/configuration.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/configuration.rb similarity index 53% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/configuration.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/configuration.rb index a00dc84403..5571d39b0c 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/configuration.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/configuration.rb @@ -1,102 +1,19 @@ require 'thread' require 'concurrent/delay' require 'concurrent/errors' -require 'concurrent/atomic/atomic_reference' -require 'concurrent/concern/logging' require 'concurrent/concern/deprecation' require 'concurrent/executor/immediate_executor' +require 'concurrent/executor/fixed_thread_pool' require 'concurrent/executor/cached_thread_pool' require 'concurrent/utility/processor_counter' module Concurrent - extend Concern::Logging extend Concern::Deprecation autoload :Options, 'concurrent/options' autoload :TimerSet, 'concurrent/executor/timer_set' autoload :ThreadPoolExecutor, 'concurrent/executor/thread_pool_executor' - # @return [Logger] Logger with provided level and output. - def self.create_simple_logger(level = Logger::FATAL, output = $stderr) - # TODO (pitr-ch 24-Dec-2016): figure out why it had to be replaced, stdlogger was deadlocking - lambda do |severity, progname, message = nil, &block| - return false if severity < level - - message = block ? block.call : message - formatted_message = case message - when String - message - when Exception - format "%s (%s)\n%s", - message.message, message.class, (message.backtrace || []).join("\n") - else - message.inspect - end - - output.print format "[%s] %5s -- %s: %s\n", - Time.now.strftime('%Y-%m-%d %H:%M:%S.%L'), - Logger::SEV_LABEL[severity], - progname, - formatted_message - true - end - end - - # Use logger created by #create_simple_logger to log concurrent-ruby messages. - def self.use_simple_logger(level = Logger::FATAL, output = $stderr) - Concurrent.global_logger = create_simple_logger level, output - end - - # @return [Logger] Logger with provided level and output. - # @deprecated - def self.create_stdlib_logger(level = Logger::FATAL, output = $stderr) - logger = Logger.new(output) - logger.level = level - logger.formatter = lambda do |severity, datetime, progname, msg| - formatted_message = case msg - when String - msg - when Exception - format "%s (%s)\n%s", - msg.message, msg.class, (msg.backtrace || []).join("\n") - else - msg.inspect - end - format "[%s] %5s -- %s: %s\n", - datetime.strftime('%Y-%m-%d %H:%M:%S.%L'), - severity, - progname, - formatted_message - end - - lambda do |loglevel, progname, message = nil, &block| - logger.add loglevel, message, progname, &block - end - end - - # Use logger created by #create_stdlib_logger to log concurrent-ruby messages. - # @deprecated - def self.use_stdlib_logger(level = Logger::FATAL, output = $stderr) - Concurrent.global_logger = create_stdlib_logger level, output - end - - # TODO (pitr-ch 27-Dec-2016): remove deadlocking stdlib_logger methods - - # Suppresses all output when used for logging. - NULL_LOGGER = lambda { |level, progname, message = nil, &block| } - - # @!visibility private - GLOBAL_LOGGER = AtomicReference.new(create_simple_logger(Logger::WARN)) - private_constant :GLOBAL_LOGGER - - def self.global_logger - GLOBAL_LOGGER.value - end - - def self.global_logger=(value) - GLOBAL_LOGGER.value = value - end - # @!visibility private GLOBAL_FAST_EXECUTOR = Delay.new { Concurrent.new_fast_executor } private_constant :GLOBAL_FAST_EXECUTOR @@ -136,14 +53,14 @@ module Concurrent # # @return [ThreadPoolExecutor] the thread pool def self.global_fast_executor - GLOBAL_FAST_EXECUTOR.value + GLOBAL_FAST_EXECUTOR.value! end # Global thread pool optimized for long, blocking (IO) *tasks*. # # @return [ThreadPoolExecutor] the thread pool def self.global_io_executor - GLOBAL_IO_EXECUTOR.value + GLOBAL_IO_EXECUTOR.value! end def self.global_immediate_executor @@ -154,7 +71,7 @@ module Concurrent # # @return [Concurrent::TimerSet] the thread pool def self.global_timer_set - GLOBAL_TIMER_SET.value + GLOBAL_TIMER_SET.value! end # General access point to global executors. diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/constants.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/constants.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/constants.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/constants.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/dataflow.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/dataflow.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/dataflow.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/dataflow.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/delay.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/delay.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/delay.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/delay.rb index 83799d03dd..923773cbca 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/delay.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/delay.rb @@ -1,7 +1,7 @@ require 'thread' require 'concurrent/concern/obligation' require 'concurrent/executor/immediate_executor' -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent @@ -67,7 +67,7 @@ module Concurrent # Return the value this object represents after applying the options # specified by the `#set_deref_options` method. If the delayed operation - # raised an exception this method will return nil. The execption object + # raised an exception this method will return nil. The exception object # can be accessed via the `#reason` method. # # @param [Numeric] timeout the maximum number of seconds to wait diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/errors.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/errors.rb similarity index 90% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/errors.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/errors.rb index b69fec01f2..74f1fc3dda 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/errors.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/errors.rb @@ -66,4 +66,9 @@ module Concurrent end end + # @!macro internal_implementation_note + class ConcurrentUpdateError < ThreadError + # frozen pre-allocated backtrace to speed ConcurrentUpdateError + CONC_UP_ERR_BACKTRACE = ['backtrace elided; set verbose to enable'].freeze + end end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/exchanger.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/exchanger.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/exchanger.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/exchanger.rb index 5a99550b33..a5405d2522 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/exchanger.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/exchanger.rb @@ -289,6 +289,7 @@ module Concurrent end if Concurrent.on_jruby? + require 'concurrent/utility/native_extension_loader' # @!macro internal_implementation_note # @!visibility private diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb index f3631bf8ef..ac429531bf 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb @@ -1,7 +1,7 @@ require 'concurrent/errors' require 'concurrent/concern/deprecation' require 'concurrent/executor/executor_service' -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/executor_service.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/executor_service.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/executor_service.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/executor_service.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb index e63e89812e..9a86385520 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb @@ -1,7 +1,7 @@ -if Concurrent.on_jruby? +require 'concurrent/utility/engine' +if Concurrent.on_jruby? require 'concurrent/errors' - require 'concurrent/utility/engine' require 'concurrent/executor/abstract_executor_service' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb similarity index 94% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb index 17acfd567c..f796b8571f 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb index d314e90616..4db7c7f0c2 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb @@ -1,6 +1,6 @@ require 'concurrent/errors' require 'concurrent/concern/logging' -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb similarity index 93% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb index b87fed5e02..0bc62afd38 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb @@ -1,5 +1,8 @@ -require 'concurrent/atomics' +require 'concurrent/atomic/atomic_boolean' +require 'concurrent/atomic/atomic_fixnum' +require 'concurrent/atomic/event' require 'concurrent/executor/executor_service' +require 'concurrent/executor/ruby_executor_service' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/timer_set.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/timer_set.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executor/timer_set.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executor/timer_set.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executors.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executors.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/executors.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/executors.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/future.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/future.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/future.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/future.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/hash.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/hash.rb similarity index 83% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/hash.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/hash.rb index 92df66b790..7902fe9d29 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/hash.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/hash.rb @@ -28,15 +28,6 @@ module Concurrent end JRubyHash - when Concurrent.on_rbx? - require 'monitor' - require 'concurrent/thread_safe/util/data_structures' - - class RbxHash < ::Hash - end - ThreadSafe::Util.make_synchronized_on_rbx RbxHash - RbxHash - when Concurrent.on_truffleruby? require 'concurrent/thread_safe/util/data_structures' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/immutable_struct.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/immutable_struct.rb similarity index 97% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/immutable_struct.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/immutable_struct.rb index d2755951f5..48462e8375 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/immutable_struct.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/immutable_struct.rb @@ -1,5 +1,5 @@ require 'concurrent/synchronization/abstract_struct' -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/ivar.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/ivar.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/ivar.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/ivar.rb index 2a724db467..4165038f89 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/ivar.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/ivar.rb @@ -3,7 +3,8 @@ require 'concurrent/errors' require 'concurrent/collection/copy_on_write_observer_set' require 'concurrent/concern/obligation' require 'concurrent/concern/observable' -require 'concurrent/synchronization' +require 'concurrent/executor/safe_task_executor' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/map.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/map.rb similarity index 95% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/map.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/map.rb index 808757fa4b..994f077b81 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/map.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/map.rb @@ -1,6 +1,5 @@ require 'thread' require 'concurrent/constants' -require 'concurrent/synchronization' require 'concurrent/utility/engine' module Concurrent @@ -10,17 +9,20 @@ module Concurrent # @!visibility private MapImplementation = case when Concurrent.on_jruby? + require 'concurrent/utility/native_extension_loader' # noinspection RubyResolve JRubyMapBackend when Concurrent.on_cruby? require 'concurrent/collection/map/mri_map_backend' MriMapBackend - when Concurrent.on_truffleruby? && defined?(::TruffleRuby::ConcurrentMap) - require 'concurrent/collection/map/truffleruby_map_backend' - TruffleRubyMapBackend - when Concurrent.on_truffleruby? || Concurrent.on_rbx? - require 'concurrent/collection/map/atomic_reference_map_backend' - AtomicReferenceMapBackend + when Concurrent.on_truffleruby? + if defined?(::TruffleRuby::ConcurrentMap) + require 'concurrent/collection/map/truffleruby_map_backend' + TruffleRubyMapBackend + else + require 'concurrent/collection/map/atomic_reference_map_backend' + AtomicReferenceMapBackend + end else warn 'Concurrent::Map: unsupported Ruby engine, using a fully synchronized Concurrent::Map implementation' require 'concurrent/collection/map/synchronized_map_backend' @@ -197,7 +199,6 @@ module Concurrent # @yieldparam key [Object] # @yieldreturn [Object] default value # @return [Object] the value or default value - # @!macro map.atomic_method_with_block def fetch_or_store(key, default_value = NULL) fetch(key) do put(key, block_given? ? yield(key) : (NULL == default_value ? raise_fetch_no_key : default_value)) diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/maybe.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/maybe.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/maybe.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/maybe.rb index 7ba3d3ebb5..317c82b86f 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/maybe.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/maybe.rb @@ -1,4 +1,4 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/mutable_struct.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/mutable_struct.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/mutable_struct.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/mutable_struct.rb index 55361e753f..5d0e9b9af5 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/mutable_struct.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/mutable_struct.rb @@ -1,5 +1,5 @@ require 'concurrent/synchronization/abstract_struct' -require 'concurrent/synchronization' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/mvar.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/mvar.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/mvar.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/mvar.rb index 9034711bf5..dfc41950cf 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/mvar.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/mvar.rb @@ -1,5 +1,5 @@ require 'concurrent/concern/dereferenceable' -require 'concurrent/synchronization' +require 'concurrent/synchronization/object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/options.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/options.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/options.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/options.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/promise.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/promise.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/promise.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/promise.rb index e91779173d..ccc47dd628 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/promise.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/promise.rb @@ -66,7 +66,7 @@ module Concurrent # Start by requiring promises # # ```ruby - # require 'concurrent' + # require 'concurrent/promise' # ``` # # Then create one diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/promises.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/promises.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/promises.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/promises.rb index 76af4d5963..3cd17055ca 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/promises.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/promises.rb @@ -1,7 +1,8 @@ -require 'concurrent/synchronization' +require 'concurrent/synchronization/object' require 'concurrent/atomic/atomic_boolean' require 'concurrent/atomic/atomic_fixnum' require 'concurrent/collection/lock_free_stack' +require 'concurrent/configuration' require 'concurrent/errors' require 'concurrent/re_include' @@ -313,7 +314,7 @@ module Concurrent end # @!macro promises.shortcut.on - # @return [Future] + # @return [Event] def any_event(*futures_and_or_events) any_event_on default_executor, *futures_and_or_events end @@ -892,7 +893,7 @@ module Concurrent private def rejected_resolution(raise_on_reassign, state) - Concurrent::MultipleAssignmentError.new('Event can be resolved only once') if raise_on_reassign + raise Concurrent::MultipleAssignmentError.new('Event can be resolved only once') if raise_on_reassign return false end @@ -1298,7 +1299,7 @@ module Concurrent # @!macro promise.param.raise_on_reassign # @param [Boolean] raise_on_reassign should method raise exception if already resolved - # @return [self, false] false is returner when raise_on_reassign is false and the receiver + # @return [self, false] false is returned when raise_on_reassign is false and the receiver # is already resolved. # @@ -2074,8 +2075,8 @@ module Concurrent private - def resolvable?(countdown, future, index) - future.fulfilled? || + def resolvable?(countdown, event_or_future, index) + (event_or_future.is_a?(Event) ? event_or_future.resolved? : event_or_future.fulfilled?) || # inlined super from BlockedPromise countdown.zero? end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/re_include.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/re_include.rb similarity index 97% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/re_include.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/re_include.rb index 516d58cae1..600bc6a535 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/re_include.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/re_include.rb @@ -31,6 +31,8 @@ module Concurrent # # C1.new.respond_to? :a # => false # C2.new.respond_to? :a # => true + # + # @!visibility private module ReInclude # @!visibility private def included(base) diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/scheduled_task.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/scheduled_task.rb similarity index 99% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/scheduled_task.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/scheduled_task.rb index 96c8272178..429fc0683c 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/scheduled_task.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/scheduled_task.rb @@ -57,7 +57,7 @@ module Concurrent # # @example Basic usage # - # require 'concurrent' + # require 'concurrent/scheduled_task' # require 'csv' # require 'open-uri' # diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/set.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/set.rb similarity index 87% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/set.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/set.rb index 3bf0c895c1..eee4effdfd 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/set.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/set.rb @@ -42,16 +42,6 @@ module Concurrent JRubySet - when Concurrent.on_rbx? - require 'monitor' - require 'concurrent/thread_safe/util/data_structures' - - class RbxSet < ::Set - end - - ThreadSafe::Util.make_synchronized_on_rbx RbxSet - RbxSet - when Concurrent.on_truffleruby? require 'concurrent/thread_safe/util/data_structures' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/settable_struct.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/settable_struct.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/settable_struct.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/settable_struct.rb index 00123523cc..99b85619fd 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/settable_struct.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/settable_struct.rb @@ -1,6 +1,6 @@ -require 'concurrent/synchronization/abstract_struct' require 'concurrent/errors' -require 'concurrent/synchronization' +require 'concurrent/synchronization/abstract_struct' +require 'concurrent/synchronization/lockable_object' module Concurrent diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization.rb new file mode 100644 index 0000000000..6d8cf4bd58 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization.rb @@ -0,0 +1,13 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first + +require 'concurrent/synchronization/object' +require 'concurrent/synchronization/lockable_object' +require 'concurrent/synchronization/condition' +require 'concurrent/synchronization/lock' + +module Concurrent + # @!visibility private + module Synchronization + end +end + diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb similarity index 93% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb index bc12603364..d9050b312f 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb @@ -1,3 +1,7 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first +require 'concurrent/utility/monotonic_time' +require 'concurrent/synchronization/object' + module Concurrent module Synchronization @@ -34,7 +38,7 @@ module Concurrent if timeout wait_until = Concurrent.monotonic_time + timeout loop do - now = Concurrent.monotonic_time + now = Concurrent.monotonic_time condition_result = condition.call return condition_result if now >= wait_until || condition_result ns_wait wait_until - now diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb similarity index 80% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb index 532388b2b8..7cd2decf99 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb @@ -4,10 +4,8 @@ module Concurrent # @!visibility private # @!macro internal_implementation_note class AbstractObject - - # @abstract has to be implemented based on Ruby runtime def initialize - raise NotImplementedError + # nothing to do end # @!visibility private diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/condition.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/condition.rb similarity index 96% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/condition.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/condition.rb index f704b81ee6..5daa68be8a 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/condition.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/condition.rb @@ -1,3 +1,5 @@ +require 'concurrent/synchronization/lockable_object' + module Concurrent module Synchronization diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/full_memory_barrier.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/full_memory_barrier.rb new file mode 100644 index 0000000000..139e08d854 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/full_memory_barrier.rb @@ -0,0 +1,29 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first + +module Concurrent + module Synchronization + case + when Concurrent.on_cruby? + def self.full_memory_barrier + # relying on undocumented behavior of CRuby, GVL acquire has lock which ensures visibility of ivars + # https://github.com/ruby/ruby/blob/ruby_2_2/thread_pthread.c#L204-L211 + end + + when Concurrent.on_jruby? + require 'concurrent/utility/native_extension_loader' + def self.full_memory_barrier + JRubyAttrVolatile.full_memory_barrier + end + + when Concurrent.on_truffleruby? + def self.full_memory_barrier + TruffleRuby.full_memory_barrier + end + + else + warn 'Possibly unsupported Ruby implementation' + def self.full_memory_barrier + end + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb similarity index 65% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb index 359a032b7b..76930461bd 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb @@ -1,7 +1,9 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first + module Concurrent module Synchronization - if Concurrent.on_jruby? && Concurrent.java_extensions_loaded? + if Concurrent.on_jruby? # @!visibility private # @!macro internal_implementation_note diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/lock.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/lock.rb similarity index 92% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/lock.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/lock.rb index 0dbad2eb45..f90e0b5f76 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/lock.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/lock.rb @@ -1,3 +1,5 @@ +require 'concurrent/synchronization/lockable_object' + module Concurrent module Synchronization diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb similarity index 92% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb index ae28e5bc8e..08d2ff66cd 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb @@ -1,3 +1,8 @@ +require 'concurrent/utility/engine' +require 'concurrent/synchronization/abstract_lockable_object' +require 'concurrent/synchronization/mutex_lockable_object' +require 'concurrent/synchronization/jruby_lockable_object' + module Concurrent module Synchronization @@ -8,8 +13,6 @@ module Concurrent MutexLockableObject when Concurrent.on_jruby? JRubyLockableObject - when Concurrent.on_rbx? - RbxLockableObject when Concurrent.on_truffleruby? MutexLockableObject else diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb similarity index 91% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb index f17ea507aa..acc9745a2e 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb @@ -1,5 +1,6 @@ +require 'concurrent/synchronization/abstract_lockable_object' + module Concurrent - # noinspection RubyInstanceVariableNamingConvention module Synchronization # @!visibility private @@ -26,8 +27,8 @@ module Concurrent safe_initialization! - def initialize(*defaults) - super(*defaults) + def initialize + super() @__Lock__ = ::Mutex.new @__Condition__ = ::ConditionVariable.new end @@ -61,8 +62,8 @@ module Concurrent safe_initialization! - def initialize(*defaults) - super(*defaults) + def initialize + super() @__Lock__ = ::Monitor.new @__Condition__ = @__Lock__.new_cond end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/object.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/object.rb similarity index 73% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/object.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/object.rb index 0e62112807..e839c9f188 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/synchronization/object.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/object.rb @@ -1,28 +1,20 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first + +require 'concurrent/synchronization/safe_initialization' +require 'concurrent/synchronization/volatile' +require 'concurrent/atomic/atomic_reference' + module Concurrent module Synchronization - # @!visibility private - # @!macro internal_implementation_note - ObjectImplementation = case - when Concurrent.on_cruby? - MriObject - when Concurrent.on_jruby? - JRubyObject - when Concurrent.on_rbx? - RbxObject - when Concurrent.on_truffleruby? - TruffleRubyObject - else - warn 'Possibly unsupported Ruby implementation' - MriObject - end - private_constant :ObjectImplementation - # Abstract object providing final, volatile, ans CAS extensions to build other concurrent abstractions. # - final instance variables see {Object.safe_initialization!} # - volatile instance variables see {Object.attr_volatile} # - volatile instance variables see {Object.attr_atomic} - class Object < ObjectImplementation + # @!visibility private + class Object < AbstractObject + include Volatile + # TODO make it a module if possible # @!method self.attr_volatile(*names) @@ -38,36 +30,12 @@ module Concurrent __initialize_atomic_fields__ end - # By calling this method on a class, it and all its children are marked to be constructed safely. Meaning that - # all writes (ivar initializations) are made visible to all readers of newly constructed object. It ensures - # same behaviour as Java's final fields. - # @example - # class AClass < Concurrent::Synchronization::Object - # safe_initialization! - # - # def initialize - # @AFinalValue = 'value' # published safely, does not have to be synchronized - # end - # end - # @return [true] def self.safe_initialization! - # define only once, and not again in children - return if safe_initialization? - - # @!visibility private - def self.new(*args, &block) - object = super(*args, &block) - ensure - object.full_memory_barrier if object - end - - @safe_initialization = true + extend SafeInitialization unless safe_initialization? end - # @return [true, false] if this class is safely initialized. def self.safe_initialization? - @safe_initialization = false unless defined? @safe_initialization - @safe_initialization || (superclass.respond_to?(:safe_initialization?) && superclass.safe_initialization?) + self.singleton_class < SafeInitialization end # For testing purposes, quite slow. Injects assert code to new method which will raise if class instance contains diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/safe_initialization.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/safe_initialization.rb new file mode 100644 index 0000000000..f785e35229 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/safe_initialization.rb @@ -0,0 +1,36 @@ +require 'concurrent/synchronization/full_memory_barrier' + +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + # + # By extending this module, a class and all its children are marked to be constructed safely. Meaning that + # all writes (ivar initializations) are made visible to all readers of newly constructed object. It ensures + # same behaviour as Java's final fields. + # + # Due to using Kernel#extend, the module is not included again if already present in the ancestors, + # which avoids extra overhead. + # + # @example + # class AClass < Concurrent::Synchronization::Object + # extend Concurrent::Synchronization::SafeInitialization + # + # def initialize + # @AFinalValue = 'value' # published safely, #foo will never return nil + # end + # + # def foo + # @AFinalValue + # end + # end + module SafeInitialization + def new(*args, &block) + super(*args, &block) + ensure + Concurrent::Synchronization.full_memory_barrier + end + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/volatile.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/volatile.rb new file mode 100644 index 0000000000..46e8ba6a48 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/synchronization/volatile.rb @@ -0,0 +1,101 @@ +require 'concurrent/utility/native_extension_loader' # load native parts first +require 'concurrent/utility/engine' +require 'concurrent/synchronization/full_memory_barrier' + +module Concurrent + module Synchronization + + # Volatile adds the attr_volatile class method when included. + # + # @example + # class Foo + # include Concurrent::Synchronization::Volatile + # + # attr_volatile :bar + # + # def initialize + # self.bar = 1 + # end + # end + # + # foo = Foo.new + # foo.bar + # => 1 + # foo.bar = 2 + # => 2 + # + # @!visibility private + module Volatile + def self.included(base) + base.extend(ClassMethods) + end + + def full_memory_barrier + Synchronization.full_memory_barrier + end + + module ClassMethods + if Concurrent.on_cruby? + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + #{ivar} + end + + def #{name}=(value) + #{ivar} = value + end + RUBY + end + names.map { |n| [n, :"#{n}="] }.flatten + end + + elsif Concurrent.on_jruby? + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + ::Concurrent::Synchronization::JRubyAttrVolatile.instance_variable_get_volatile(self, :#{ivar}) + end + + def #{name}=(value) + ::Concurrent::Synchronization::JRubyAttrVolatile.instance_variable_set_volatile(self, :#{ivar}, value) + end + RUBY + + end + names.map { |n| [n, :"#{n}="] }.flatten + end + + else + warn 'Possibly unsupported Ruby implementation' unless Concurrent.on_truffleruby? + + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + ::Concurrent::Synchronization.full_memory_barrier + #{ivar} + end + + def #{name}=(value) + #{ivar} = value + ::Concurrent::Synchronization.full_memory_barrier + end + RUBY + end + + names.map { |n| [n, :"#{n}="] }.flatten + end + end + end + + end + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb new file mode 100644 index 0000000000..019d84382d --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb @@ -0,0 +1,47 @@ +require 'delegate' +require 'monitor' + +module Concurrent + # This class provides a trivial way to synchronize all calls to a given object + # by wrapping it with a `Delegator` that performs `Monitor#enter/exit` calls + # around the delegated `#send`. Example: + # + # array = [] # not thread-safe on many impls + # array = SynchronizedDelegator.new([]) # thread-safe + # + # A simple `Monitor` provides a very coarse-grained way to synchronize a given + # object, in that it will cause synchronization for methods that have no need + # for it, but this is a trivial way to get thread-safety where none may exist + # currently on some implementations. + # + # This class is currently being considered for inclusion into stdlib, via + # https://bugs.ruby-lang.org/issues/8556 + # + # @!visibility private + class SynchronizedDelegator < SimpleDelegator + def setup + @old_abort = Thread.abort_on_exception + Thread.abort_on_exception = true + end + + def teardown + Thread.abort_on_exception = @old_abort + end + + def initialize(obj) + __setobj__(obj) + @monitor = Monitor.new + end + + def method_missing(method, *args, &block) + monitor = @monitor + begin + monitor.enter + super + ensure + monitor.exit + end + end + + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb similarity index 65% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb index d9b4c58186..a07678df2e 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb @@ -1,5 +1,6 @@ require 'concurrent/thread_safe/util' require 'concurrent/thread_safe/util/volatile' +require 'concurrent/utility/engine' module Concurrent @@ -32,45 +33,7 @@ module Concurrent # @!visibility private module CheapLockable private - engine = defined?(RUBY_ENGINE) && RUBY_ENGINE - if engine == 'rbx' - # Making use of the Rubinius' ability to lock via object headers to avoid the overhead of the extra Mutex objects. - def cheap_synchronize - Rubinius.lock(self) - begin - yield - ensure - Rubinius.unlock(self) - end - end - - def cheap_wait - wchan = Rubinius::Channel.new - - begin - waiters = @waiters ||= [] - waiters.push wchan - Rubinius.unlock(self) - signaled = wchan.receive_timeout nil - ensure - Rubinius.lock(self) - - unless signaled or waiters.delete(wchan) - # we timed out, but got signaled afterwards (e.g. while waiting to - # acquire @lock), so pass that signal on to the next waiter - waiters.shift << true unless waiters.empty? - end - end - - self - end - - def cheap_broadcast - waiters = @waiters ||= [] - waiters.shift << true until waiters.empty? - self - end - elsif engine == 'jruby' + if Concurrent.on_jruby? # Use Java's native synchronized (this) { wait(); notifyAll(); } to avoid the overhead of the extra Mutex objects require 'jruby' diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb similarity index 57% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb index 24d039b2f2..01eb98f4aa 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb @@ -1,4 +1,5 @@ require 'concurrent/thread_safe/util' +require 'concurrent/utility/engine' # Shim for TruffleRuby.synchronized if Concurrent.on_truffleruby? && !TruffleRuby.respond_to?(:synchronized) @@ -37,43 +38,6 @@ module Concurrent end end - def self.make_synchronized_on_rbx(klass) - klass.class_eval do - private - - def _mon_initialize - @_monitor ||= Monitor.new # avoid double initialisation - end - - def self.new(*args) - obj = super(*args) - obj.send(:_mon_initialize) - obj - end - end - - klass.superclass.instance_methods(false).each do |method| - case method - when :new_range, :new_reserved - klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 - def #{method}(*args) - obj = super - obj.send(:_mon_initialize) - obj - end - RUBY - else - klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 - def #{method}(*args) - monitor = @_monitor - monitor or raise("BUG: Internal monitor was not properly initialized. Please report this to the concurrent-ruby developers.") - monitor.synchronize { super } - end - RUBY - end - end - end - def self.make_synchronized_on_truffleruby(klass) klass.superclass.instance_methods(false).each do |method| klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/timer_task.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/timer_task.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/timer_task.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/timer_task.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/tuple.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/tuple.rb similarity index 94% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/tuple.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/tuple.rb index f8c4c25d32..56212cfd15 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/tuple.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/tuple.rb @@ -23,16 +23,12 @@ module Concurrent # The (fixed) size of the tuple. attr_reader :size - # @!visibility private - Tuple = defined?(Rubinius::Tuple) ? Rubinius::Tuple : ::Array - private_constant :Tuple - # Create a new tuple of the given size. # # @param [Integer] size the number of elements in the tuple def initialize(size) @size = size - @tuple = tuple = Tuple.new(size) + @tuple = tuple = ::Array.new(size) i = 0 while i < size tuple[i] = Concurrent::AtomicReference.new diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/tvar.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/tvar.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/tvar.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/tvar.rb index 104761ff60..5d02ef090f 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/tvar.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/tvar.rb @@ -1,5 +1,5 @@ require 'set' -require 'concurrent/synchronization' +require 'concurrent/synchronization/object' module Concurrent @@ -149,6 +149,7 @@ module Concurrent private + # @!visibility private class Transaction ABORTED = ::Object.new diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/engine.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/engine.rb similarity index 73% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/engine.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/engine.rb index bc4173e448..0c574b2abb 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/engine.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/engine.rb @@ -1,26 +1,19 @@ module Concurrent + # @!visibility private module Utility # @!visibility private module EngineDetector - def on_jruby? - ruby_engine == 'jruby' - end - - def on_jruby_9000? - on_jruby? && ruby_version(JRUBY_VERSION, :>=, 9, 0, 0) - end - def on_cruby? - ruby_engine == 'ruby' + RUBY_ENGINE == 'ruby' end - def on_rbx? - ruby_engine == 'rbx' + def on_jruby? + RUBY_ENGINE == 'jruby' end def on_truffleruby? - ruby_engine == 'truffleruby' + RUBY_ENGINE == 'truffleruby' end def on_windows? @@ -35,10 +28,6 @@ module Concurrent !(RbConfig::CONFIG['host_os'] =~ /linux/).nil? end - def ruby_engine - defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby' - end - def ruby_version(version = RUBY_VERSION, comparison, major, minor, patch) result = (version.split('.').map(&:to_i) <=> [major, minor, patch]) comparisons = { :== => [0], diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb new file mode 100644 index 0000000000..1c987d8a41 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb @@ -0,0 +1,19 @@ +module Concurrent + + # @!macro monotonic_get_time + # + # Returns the current time as tracked by the application monotonic clock. + # + # @param [Symbol] unit the time unit to be returned, can be either + # :float_second, :float_millisecond, :float_microsecond, :second, + # :millisecond, :microsecond, or :nanosecond default to :float_second. + # + # @return [Float] The current monotonic time since some unspecified + # starting point + # + # @!macro monotonic_clock_warning + def monotonic_time(unit = :float_second) + Process.clock_gettime(Process::CLOCK_MONOTONIC, unit) + end + module_function :monotonic_time +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb similarity index 90% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb index a944bd7290..bf7bab354e 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb @@ -1,9 +1,10 @@ require 'concurrent/utility/engine' +# Synchronization::AbstractObject must be defined before loading the extension +require 'concurrent/synchronization/abstract_object' module Concurrent - + # @!visibility private module Utility - # @!visibility private module NativeExtensionLoader @@ -15,15 +16,7 @@ module Concurrent defined?(@c_extensions_loaded) && @c_extensions_loaded end - def java_extensions_loaded? - defined?(@java_extensions_loaded) && @java_extensions_loaded - end - def load_native_extensions - unless defined? Synchronization::AbstractObject - raise 'native_extension_loader loaded before Synchronization::AbstractObject' - end - if Concurrent.on_cruby? && !c_extensions_loaded? ['concurrent/concurrent_ruby_ext', "concurrent/#{RUBY_VERSION[0..2]}/concurrent_ruby_ext" @@ -54,6 +47,10 @@ module Concurrent @c_extensions_loaded = true end + def java_extensions_loaded? + defined?(@java_extensions_loaded) && @java_extensions_loaded + end + def set_java_extensions_loaded @java_extensions_loaded = true end @@ -77,3 +74,4 @@ module Concurrent extend Utility::NativeExtensionLoader end +Concurrent.load_native_extensions diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/native_integer.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/native_integer.rb similarity index 98% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/native_integer.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/native_integer.rb index 10719e7caa..de1cdc306a 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/utility/native_integer.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/native_integer.rb @@ -1,4 +1,5 @@ module Concurrent + # @!visibility private module Utility # @private module NativeInteger diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/processor_counter.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/processor_counter.rb new file mode 100644 index 0000000000..986e2d5231 --- /dev/null +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/utility/processor_counter.rb @@ -0,0 +1,110 @@ +require 'etc' +require 'rbconfig' +require 'concurrent/delay' + +module Concurrent + # @!visibility private + module Utility + + # @!visibility private + class ProcessorCounter + def initialize + @processor_count = Delay.new { compute_processor_count } + @physical_processor_count = Delay.new { compute_physical_processor_count } + end + + def processor_count + @processor_count.value + end + + def physical_processor_count + @physical_processor_count.value + end + + private + + def compute_processor_count + if Concurrent.on_jruby? + java.lang.Runtime.getRuntime.availableProcessors + else + Etc.nprocessors + end + end + + def compute_physical_processor_count + ppc = case RbConfig::CONFIG["target_os"] + when /darwin\d\d/ + IO.popen("/usr/sbin/sysctl -n hw.physicalcpu", &:read).to_i + when /linux/ + cores = {} # unique physical ID / core ID combinations + phy = 0 + IO.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln| + if ln.start_with?("physical") + phy = ln[/\d+/] + elsif ln.start_with?("core") + cid = phy + ":" + ln[/\d+/] + cores[cid] = true if not cores[cid] + end + end + cores.count + when /mswin|mingw/ + require 'win32ole' + result_set = WIN32OLE.connect("winmgmts://").ExecQuery( + "select NumberOfCores from Win32_Processor") + result_set.to_enum.collect(&:NumberOfCores).reduce(:+) + else + processor_count + end + # fall back to logical count if physical info is invalid + ppc > 0 ? ppc : processor_count + rescue + return 1 + end + end + end + + # create the default ProcessorCounter on load + @processor_counter = Utility::ProcessorCounter.new + singleton_class.send :attr_reader, :processor_counter + + # Number of processors seen by the OS and used for process scheduling. For + # performance reasons the calculated value will be memoized on the first + # call. + # + # When running under JRuby the Java runtime call + # `java.lang.Runtime.getRuntime.availableProcessors` will be used. According + # to the Java documentation this "value may change during a particular + # invocation of the virtual machine... [applications] should therefore + # occasionally poll this property." Subsequently the result will NOT be + # memoized under JRuby. + # + # Otherwise Ruby's Etc.nprocessors will be used. + # + # @return [Integer] number of processors seen by the OS or Java runtime + # + # @see http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors() + def self.processor_count + processor_counter.processor_count + end + + # Number of physical processor cores on the current system. For performance + # reasons the calculated value will be memoized on the first call. + # + # On Windows the Win32 API will be queried for the `NumberOfCores from + # Win32_Processor`. This will return the total number "of cores for the + # current instance of the processor." On Unix-like operating systems either + # the `hwprefs` or `sysctl` utility will be called in a subshell and the + # returned value will be used. In the rare case where none of these methods + # work or an exception is raised the function will simply return 1. + # + # @return [Integer] number physical processor cores on the current system + # + # @see https://github.com/grosser/parallel/blob/4fc8b89d08c7091fe0419ca8fba1ec3ce5a8d185/lib/parallel.rb + # + # @see http://msdn.microsoft.com/en-us/library/aa394373(v=vs.85).aspx + # @see http://www.unix.com/man-page/osx/1/HWPREFS/ + # @see http://linux.die.net/man/8/sysctl + def self.physical_processor_count + processor_counter.physical_processor_count + end +end diff --git a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/version.rb b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/version.rb similarity index 51% rename from Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/version.rb rename to Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/version.rb index 4372d0d7b3..3925a9cb4e 100644 --- a/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.10/lib/concurrent-ruby/concurrent/version.rb +++ b/Library/Homebrew/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.2.0/lib/concurrent-ruby/concurrent/version.rb @@ -1,3 +1,3 @@ module Concurrent - VERSION = '1.1.10' + VERSION = '1.2.0' end