Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 19 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,31 +121,32 @@ require 'concurrent' # everything

# groups

require 'concurrent/atomics' # atomic and thread synchronization classes
require 'concurrent/atomics' # Atomic and thread synchronization classes
require 'concurrent/executors' # Thread pools and other executors
require 'concurrent/utilities' # utility methods such as processor count and timers

# individual abstractions

require 'concurrent/agent' # Concurrent::Agent
require 'concurrent/async' # Concurrent::Async
require 'concurrent/atomic' # Concurrent::Atomic (formerly the `atomic` gem)
require 'concurrent/dataflow' # Concurrent::dataflow
require 'concurrent/delay' # Concurrent::Delay
require 'concurrent/exchanger' # Concurrent::Exchanger
require 'concurrent/future' # Concurrent::Future
require 'concurrent/ivar' # Concurrent::IVar
require 'concurrent/lazy_register' # Concurrent::LazyRegister
require 'concurrent/mvar' # Concurrent::MVar
require 'concurrent/promise' # Concurrent::Promise
require 'concurrent/scheduled_task' # Concurrent::ScheduledTask
require 'concurrent/timer_task' # Concurrent::TimerTask
require 'concurrent/tvar' # Concurrent::TVar
require 'concurrent/async' # Concurrent::Async
require 'concurrent/dataflow' # Concurrent::dataflow
require 'concurrent/delay' # Concurrent::Delay
require 'concurrent/future' # Concurrent::Future
require 'concurrent/immutable_struct' # Concurrent::ImmutableStruct
require 'concurrent/ivar' # Concurrent::IVar
require 'concurrent/mutable_struct' # Concurrent::MutableStruct
require 'concurrent/mvar' # Concurrent::MVar
require 'concurrent/promise' # Concurrent::Promise
require 'concurrent/scheduled_task' # Concurrent::ScheduledTask
require 'concurrent/settable_struct' # Concurrent::SettableStruct
require 'concurrent/timer_task' # Concurrent::TimerTask
require 'concurrent/tvar' # Concurrent::TVar

# experimental - available in `concurrent-ruby-edge` companion gem

require 'concurrent/actor' # Concurrent::Actor and supporting code
require 'concurrent/channel ' # Concurrent::Channel and supporting code
require 'concurrent/agent' # Concurrent::Agent
require 'concurrent/actor' # Concurrent::Actor and supporting code
require 'concurrent/channel ' # Concurrent::Channel and supporting code
require 'concurrent/edge/exchanger' # Concurrent::Edge::Exchanger
require 'concurrent/edge/lazy_register' # Concurrent::Edge::LazyRegister
```

## Installation
Expand Down
2 changes: 1 addition & 1 deletion Rakefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env rake

require 'concurrent/version'
require 'concurrent/native_extensions'
require 'concurrent/utility/native_extension_loader'

## load the two gemspec files
CORE_GEMSPEC = Gem::Specification.load('concurrent-ruby.gemspec')
Expand Down
5 changes: 3 additions & 2 deletions concurrent-ruby-edge.gemspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
$:.push File.join(File.dirname(__FILE__), 'lib')
$:.push File.join(File.dirname(__FILE__), 'support')

require 'concurrent/version'
require 'concurrent/file_map'
require 'file_map'

Gem::Specification.new do |s|
git_files = `git ls-files`.split("\n")
Expand All @@ -15,7 +16,7 @@ Gem::Specification.new do |s|
s.summary = 'Edge features and additions to the concurrent-ruby gem.'
s.license = 'MIT'
s.date = Time.now.strftime('%Y-%m-%d')
s.files = Concurrent::FILE_MAP.fetch :edge
s.files = FileMap::MAP.fetch(:edge)
s.extra_rdoc_files = Dir['README*', 'LICENSE*']
s.require_paths = ['lib']
s.description = <<-TXT
Expand Down
5 changes: 3 additions & 2 deletions concurrent-ruby.gemspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
$:.push File.join(File.dirname(__FILE__), 'lib')
$:.push File.join(File.dirname(__FILE__), 'support')

require 'concurrent/version'
require 'concurrent/file_map'
require 'file_map'

Gem::Specification.new do |s|
git_files = `git ls-files`.split("\n")
Expand All @@ -15,7 +16,7 @@ Gem::Specification.new do |s|
s.summary = 'Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell, F#, C#, Java, and classic concurrency patterns.'
s.license = 'MIT'
s.date = Time.now.strftime('%Y-%m-%d')
s.files = Concurrent::FILE_MAP.fetch :core
s.files = FileMap::MAP.fetch(:core)
s.extra_rdoc_files = Dir['README*', 'LICENSE*', 'CHANGELOG*']
s.require_paths = ['lib']
s.description = <<-EOF
Expand Down
10 changes: 5 additions & 5 deletions doc/synchronization.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Provides common parent for all objects which need to be synchronized or be using
Example of a simple counter which can be used by multiple threads:

```ruby
class SafeCounter < Concurrent::Synchronization::Object
class SafeCounter < Concurrent::SynchronizationObject
def initialize
super
synchronize { @count = 0 }
Expand Down Expand Up @@ -60,10 +60,10 @@ Sometimes while already inside the synchronized block some condition is not met.

To fulfill these needs there are private methods:

- `ns_wait` {include:Concurrent::Synchronization::AbstractObject#ns_wait}
- `ns_wait_until` {include:Concurrent::Synchronization::AbstractObject#ns_wait_until}
- `ns_signal` {include:Concurrent::Synchronization::AbstractObject#ns_signal}
- `ns_broadcast` {include:Concurrent::Synchronization::AbstractObject#ns_broadcast}
- `ns_wait` {include:Concurrent::SynchronizationObjectImpl::AbstractObject#ns_wait}
- `ns_wait_until` {include:Concurrent::SynchronizationObjectImpl::AbstractObject#ns_wait_until}
- `ns_signal` {include:Concurrent::SynchronizationObjectImpl::AbstractObject#ns_signal}
- `ns_broadcast` {include:Concurrent::SynchronizationObjectImpl::AbstractObject#ns_broadcast}

All methods have to be called inside synchronized block.

Expand Down
4 changes: 2 additions & 2 deletions ext/com/concurrent_ruby/ext/SynchronizationLibrary.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ public class SynchronizationLibrary implements Library {
public void load(Ruby runtime, boolean wrap) throws IOException {
RubyModule synchronizationModule = runtime.
defineModule("Concurrent").
defineModuleUnder("Synchronization");
defineModuleUnder("SynchronizationObjectImpl");
RubyClass parentClass = synchronizationModule.getClass("AbstractObject");

if (parentClass == null)
throw runtime.newRuntimeError("Concurrent::Synchronization::AbstractObject is missing");
throw runtime.newRuntimeError("Concurrent::SynchronizationObjectImpl::AbstractObject is missing");

RubyClass synchronizedObjectJavaClass =
synchronizationModule.defineClassUnder("JavaObject", parentClass, JRUBYREFERENCE_ALLOCATOR);
Expand Down
2 changes: 1 addition & 1 deletion ext/concurrent/extconf.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'fileutils'

require 'concurrent/native_extensions'
require 'concurrent/utility/native_extension_loader'

EXTENSION_NAME = 'extension'

Expand Down
4 changes: 2 additions & 2 deletions lib/concurrent-edge.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
require 'concurrent/actor'
require 'concurrent/agent'
require 'concurrent/channel'
require 'concurrent/exchanger'
require 'concurrent/lazy_register'

require 'concurrent/edge/exchanger'
require 'concurrent/edge/future'
require 'concurrent/edge/lazy_register'
14 changes: 8 additions & 6 deletions lib/concurrent.rb
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
require 'concurrent/version'

require 'concurrent/synchronization'
require 'concurrent/at_exit'

require 'concurrent/configuration'

require 'concurrent/atomics'
require 'concurrent/collections'
require 'concurrent/errors'
require 'concurrent/executors'
require 'concurrent/utilities'
require 'concurrent/struct'

require 'concurrent/atomic/atomic_reference'
require 'concurrent/async'
require 'concurrent/dataflow'
require 'concurrent/delay'
require 'concurrent/future'
require 'concurrent/immutable_struct'
require 'concurrent/ivar'
require 'concurrent/mutable_struct'
require 'concurrent/mvar'
require 'concurrent/promise'
require 'concurrent/scheduled_task'
require 'concurrent/settable_struct'
require 'concurrent/synchronization_object'
require 'concurrent/timer_task'
require 'concurrent/tvar'

# deprecated
require 'concurrent/utility/timeout'
require 'concurrent/utility/timer'

# @!macro [new] monotonic_clock_warning
#
# @note Time calculations one all platforms and languages are sensitive to
Expand Down
4 changes: 2 additions & 2 deletions lib/concurrent/actor.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require 'concurrent/configuration'
require 'concurrent/executor/serialized_execution'
require 'concurrent/logging'
require 'concurrent/synchronization'
require 'concurrent/concern/logging'
require 'concurrent/synchronization_object'
require 'concurrent/edge/future'

module Concurrent
Expand Down
5 changes: 4 additions & 1 deletion lib/concurrent/actor/behaviour/abstract.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
require 'concurrent/concern/logging'

module Concurrent
module Actor
module Behaviour
class Abstract
include TypeCheck
include InternalDelegations
include Concern::Logging

attr_reader :core, :subsequent

Expand Down Expand Up @@ -39,7 +42,7 @@ def broadcast(event)
def reject_envelope(envelope)
envelope.reject! ActorTerminated.new(reference)
dead_letter_routing << envelope unless envelope.future
log Logging::DEBUG, "rejected #{envelope.message} from #{envelope.sender_path}"
log DEBUG, "rejected #{envelope.message} from #{envelope.sender_path}"
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/concurrent/actor/behaviour/executes_context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def on_envelope(envelope)

def on_event(event)
context.on_event(event)
core.log Logging::DEBUG, "event: #{event.inspect}"
core.log DEBUG, "event: #{event.inspect}"
super event
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/concurrent/actor/behaviour/sets_results.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def on_envelope(envelope)
end
nil
rescue => error
log Logging::ERROR, error
log ERROR, error
case error_strategy
when :terminate!
terminate!
Expand Down
3 changes: 3 additions & 0 deletions lib/concurrent/actor/context.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'concurrent/concern/logging'

module Concurrent
module Actor

Expand All @@ -15,6 +17,7 @@ module Actor
class AbstractContext
include TypeCheck
include InternalDelegations
include Concern::Logging

attr_reader :core

Expand Down
4 changes: 2 additions & 2 deletions lib/concurrent/actor/core.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ module Actor
# @note devel: core should not block on anything, e.g. it cannot wait on
# children to terminate that would eat up all threads in task pool and
# deadlock
class Core < Synchronization::Object
class Core < SynchronizationObject
include TypeCheck
include Concurrent::Logging
include Concurrent::Concern::Logging

# @!attribute [r] reference
# @return [Reference] reference to this actor which can be safely passed around
Expand Down
2 changes: 1 addition & 1 deletion lib/concurrent/actor/default_dead_letter_handler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module Concurrent
module Actor
class DefaultDeadLetterHandler < RestartingContext
def on_message(dead_letter)
log Logging::INFO, "got dead letter #{dead_letter.inspect}"
log INFO, "got dead letter #{dead_letter.inspect}"
end
end
end
Expand Down
25 changes: 7 additions & 18 deletions lib/concurrent/agent.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require 'thread'
require 'concurrent/dereferenceable'
require 'concurrent/observable'
require 'concurrent/logging'
require 'concurrent/concern/dereferenceable'
require 'concurrent/concern/observable'
require 'concurrent/concern/logging'
require 'concurrent/executor/executor'

module Concurrent
Expand All @@ -11,28 +11,17 @@ module Concurrent
# @!attribute [r] timeout
# @return [Fixnum] the maximum number of seconds before an update is cancelled
class Agent
include Dereferenceable
include Observable
include Logging
include Concern::Dereferenceable
include Concern::Observable
include Concern::Logging

attr_reader :timeout, :io_executor, :fast_executor

# Initialize a new Agent with the given initial value and provided options.
#
# @param [Object] initial the initial value
#
# @!macro [attach] executor_and_deref_options
#
# @param [Hash] opts the options used to define the behavior at update and deref
# and to specify the executor on which to perform actions
# @option opts [Executor] :executor when set use the given `Executor` instance.
# Three special values are also supported: `:task` returns the global task pool,
# `:operation` returns the global operation pool, and `:immediate` returns a new
# `ImmediateExecutor` object.
# @option opts [Boolean] :dup_on_deref (false) call `#dup` before returning the data
# @option opts [Boolean] :freeze_on_deref (false) call `#freeze` before returning the data
# @option opts [Proc] :copy_on_deref (nil) call the given `Proc` passing
# the internal value and returning the value returned from the proc
# @!macro executor_and_deref_options
def initialize(initial, opts = {})
@value = initial
@rescuers = []
Expand Down
Loading