lib/mongoid/lock/synch_methods.rb in mongoid-lock-0.0.7 vs lib/mongoid/lock/synch_methods.rb in mongoid-lock-0.0.8
- old
+ new
@@ -6,20 +6,36 @@
def local_mutex
@__mutex ||= Mutex.new
end
def reset_lock!
- self.update_attributes(:lock_used_by => nil, :lock_acquired_at => nil)
+ self.update_attributes(:lock_used_by => nil, :lock_acquired_at => nil, :lock_waiter => nil)
end
def lock_acquire
+ self.lock_acquire_begin
local = "#{Socket.gethostname}:#{Process.pid}"
ident = self.lock_used_by
+ wait = self.lock_waiter
if (ident and ident != local)
raise Mongoid::Lock::UnsynchronizedAccess.new(ident)
+ elsif (wait != local)
+ raise Mongoid::Lock::UnsynchronizedAccess.new(wait)
else
self.set(:lock_used_by, local)
- self.update_attributes(:lock_used_by => local, :lock_acquired_at => Time.now)
+ self.set(:lock_acquired_at, Time.now)
+ self.set(:lock_waiter, nil)
+ end
+ end
+
+ def lock_acquire_begin
+ local = "#{Socket.gethostname}:#{Process.pid}"
+ ident = self.lock_used_by
+ wait = self.lock_waiter
+ if (ident or wait)
+ raise Mongoid::Lock::UnsynchronizedAccess.new(ident)
+ else
+ self.set(:lock_waiter, local)
end
end
def lock_release
local = "#{Socket.gethostname}:#{Process.pid}"
\ No newline at end of file