From ea3bc95b123b8cc734d7f6fba060ef91a2d9636d Mon Sep 17 00:00:00 2001 From: Blake Mizerany Date: Sun, 7 Oct 2007 16:26:05 -0700 Subject: [PATCH] Optional mutex lock --- lib/sinatra/event.rb | 18 ++++++++++++++++-- lib/sinatra/options.rb | 6 ++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/sinatra/event.rb b/lib/sinatra/event.rb index 4c2c6d6..7918e51 100644 --- a/lib/sinatra/event.rb +++ b/lib/sinatra/event.rb @@ -1,3 +1,5 @@ +require 'thread' + module Sinatra module EventManager # :nodoc: @@ -44,6 +46,8 @@ module Sinatra cattr_accessor :logger cattr_accessor :after_filters + @@mutex = Mutex.new + self.after_filters = [] def self.after_attend(filter) @@ -66,12 +70,12 @@ module Sinatra request.params.merge!(@route.params) context = EventContext.new(request) begin - result = context.instance_eval(&@block) if @block + result = run_safely { context.instance_eval(&@block) if @block } context.body context.body || result || '' rescue => e context.error e end - run_through_after_filters(context) + run_safely { run_through_after_filters(context) } context end alias :call :attend @@ -82,6 +86,16 @@ module Sinatra private + def run_safely + if Options.use_mutex? + @@mutex.synchronize do + yield + end + else + yield + end + end + def run_through_after_filters(context) after_filters.each { |filter| context.send(filter) } end diff --git a/lib/sinatra/options.rb b/lib/sinatra/options.rb index 3089aad..1787fd5 100644 --- a/lib/sinatra/options.rb +++ b/lib/sinatra/options.rb @@ -7,6 +7,9 @@ module Sinatra attr_with_default :port, 4567 attr_with_default :environment, :development attr_with_default :console, nil + attr_with_default :use_mutex, false + + alias :use_mutex? :use_mutex def parse!(args) return if @environment == :test @@ -24,6 +27,9 @@ module Sinatra puts opts exit! end + opts.on '-X', '--mutex', 'Use mutex lock when attending events' do + @use_mutex = true + end end.parse!(ARGV) end -- 2.11.4.GIT