aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/dependencies/interlock.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/dependencies/interlock.rb')
-rw-r--r--activesupport/lib/active_support/dependencies/interlock.rb35
1 files changed, 35 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/dependencies/interlock.rb b/activesupport/lib/active_support/dependencies/interlock.rb
new file mode 100644
index 0000000000..c3601bac13
--- /dev/null
+++ b/activesupport/lib/active_support/dependencies/interlock.rb
@@ -0,0 +1,35 @@
+require 'active_support/concurrency/share_lock'
+
+module ActiveSupport
+ module Dependencies #:nodoc:
+ class Interlock
+ def initialize
+ @lock = ActiveSupport::Concurrency::ShareLock.new(true)
+ end
+
+ def loading
+ @lock.exclusive do
+ yield
+ end
+ end
+
+ def start_running
+ @lock.start_sharing
+ end
+
+ def done_running
+ @lock.stop_sharing
+ end
+
+ def running
+ @lock.sharing do
+ yield
+ end
+ end
+
+ # Match the Mutex API, so we can be used by Rack::Lock
+ alias :lock :start_running
+ alias :unlock :done_running
+ end
+ end
+end