This lock type uses the ‘posixlock’ library..
Clean the specified directory of lock files older than threshold seconds.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 56
56: def self::clean( directory=DefaultLockDir, threshold=3600 )
57: pat = File.join( directory, LockfileFormat.gsub(/%s/, '*') )
58: threshold = Time.now - threshold
59: Dir[ pat ].each do |file|
60: if File.mtime( file ) < threshold
61: Arrow::Logger[self].info \
62: "Removing stale lockfile '%s'" % file
63: begin
64: fh = File.open( file, FileMode )
65: fh.posixlock( File::LOCK_EX|File::LOCK_NB )
66: File.delete( file )
67: fh.posixlock( File::LOCK_UN )
68: fh.close
69: rescue => err
70: Arrow::Logger[self].warning \
71: "Could not clean up '%s': %s" %
72: [ file, err.message ]
73: next
74: end
75: end
76: end
77: end
Create a new Arrow::Session::FileLock object.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 86
86: def initialize( uri, id )
87: @lockDir = uri.path || DefaultLockDir
88: super
89:
90: File.mkpath( @lockDir )
91: @filename = File.join( @lockDir, LockfileFormat % id.to_s.gsub(/\W/, '_') ).untaint
92: self.log.debug "Filename is: #@filename"
93: @lockfile = nil
94: end
Acquire a read (shared) lock on the lockfile.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 140
140: def acquire_read_lock( blocking )
141: flags = File::LOCK_SH
142: flags |= File::LOCK_NB if !blocking
143:
144: self.lockfile.posixlock( flags )
145: end
Acquire a write (exclusive) lock on the lockfile.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 149
149: def acquire_write_lock( blocking )
150: flags = File::LOCK_EX
151: flags |= File::LOCK_NB if !blocking
152:
153: self.lockfile.posixlock( flags )
154: end
Close the lockfile and destroy the File object belonging to this lock.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 127
127: def close_lock_file
128: if @lockfile
129: path = @lockfile.path
130: @lockfile.close
131: @lockfile = nil
132: if File.exist?( path.untaint )
133: File.delete( path.untaint )
134: end
135: end
136: end
Get the File object for the lockfile belonging to this lock, creating it if necessary.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 120
120: def lockfile
121: @lockfile ||= File.open( @filename, FileMode )
122: end
Release a previously-acquired read lock.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 158
158: def release_read_lock
159: if !self.write_locked?
160: self.lockfile.posixlock( File::LOCK_UN )
161: self.close_lock_file
162: end
163: end
Release a previously-acquired write lock.
# File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 167
167: def release_write_lock
168: if self.read_locked?
169: self.lockfile.posixlock( File::LOCK_SH )
170: else
171: self.lockfile.posixlock( File::LOCK_UN )
172: self.close_lock_file
173: end
174: end
--- SEC00115
--- ""
---
- name: lockDir
rw: RW
a_desc: |+
The path to the directory where session lockfiles are kept.
---
- methods:
- visibility: public
aref: M000121
name: clean
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 56</span>\n\
56: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">clean</span>( <span class=\"ruby-identifier\">directory</span>=<span class=\"ruby-constant\">DefaultLockDir</span>, <span class=\"ruby-identifier\">threshold</span>=<span class=\"ruby-value\">3600</span> )\n\
57: <span class=\"ruby-identifier\">pat</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-identifier\">directory</span>, <span class=\"ruby-constant\">LockfileFormat</span>.<span class=\"ruby-identifier\">gsub</span>(<span class=\"ruby-regexp re\">/%s/</span>, <span class=\"ruby-value str\">'*'</span>) )\n\
58: <span class=\"ruby-identifier\">threshold</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">threshold</span>\n\
59: <span class=\"ruby-constant\">Dir</span>[ <span class=\"ruby-identifier\">pat</span> ].<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">file</span><span class=\"ruby-operator\">|</span>\n\
60: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">mtime</span>( <span class=\"ruby-identifier\">file</span> ) <span class=\"ruby-operator\"><</span> <span class=\"ruby-identifier\">threshold</span>\n\
61: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>].<span class=\"ruby-identifier\">info</span> \\\n\
62: <span class=\"ruby-value str\">"Removing stale lockfile '%s'"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">file</span>\n\
63: <span class=\"ruby-keyword kw\">begin</span>\n\
64: <span class=\"ruby-identifier\">fh</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">open</span>( <span class=\"ruby-identifier\">file</span>, <span class=\"ruby-constant\">FileMode</span> )\n\
65: <span class=\"ruby-identifier\">fh</span>.<span class=\"ruby-identifier\">posixlock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_EX</span><span class=\"ruby-operator\">|</span><span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_NB</span> )\n\
66: <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">file</span> )\n\
67: <span class=\"ruby-identifier\">fh</span>.<span class=\"ruby-identifier\">posixlock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_UN</span> )\n\
68: <span class=\"ruby-identifier\">fh</span>.<span class=\"ruby-identifier\">close</span>\n\
69: <span class=\"ruby-keyword kw\">rescue</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\
70: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>].<span class=\"ruby-identifier\">warning</span> \\\n\
71: <span class=\"ruby-value str\">"Could not clean up '%s': %s"</span> <span class=\"ruby-operator\">%</span>\n\
72: [ <span class=\"ruby-identifier\">file</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span> ]\n\
73: <span class=\"ruby-keyword kw\">next</span>\n\
74: <span class=\"ruby-keyword kw\">end</span>\n\
75: <span class=\"ruby-keyword kw\">end</span>\n\
76: <span class=\"ruby-keyword kw\">end</span>\n\
77: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Clean the specified <tt>directory</tt> of lock files older than
<tt>threshold</tt> seconds.
</p>
params: ( directory=DefaultLockDir, threshold=3600 )
- visibility: public
aref: M000122
name: new
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 86</span>\n\
86: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">uri</span>, <span class=\"ruby-identifier\">id</span> )\n\
87: <span class=\"ruby-ivar\">@lockDir</span> = <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">path</span> <span class=\"ruby-operator\">||</span> <span class=\"ruby-constant\">DefaultLockDir</span>\n\
88: <span class=\"ruby-keyword kw\">super</span>\n\
89: \n\
90: <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">mkpath</span>( <span class=\"ruby-ivar\">@lockDir</span> )\n\
91: <span class=\"ruby-ivar\">@filename</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-ivar\">@lockDir</span>, <span class=\"ruby-constant\">LockfileFormat</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">id</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">gsub</span>(<span class=\"ruby-regexp re\">/\\W/</span>, <span class=\"ruby-value str\">'_'</span>) ).<span class=\"ruby-identifier\">untaint</span>\n\
92: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Filename is: #@filename"</span>\n\
93: <span class=\"ruby-ivar\">@lockfile</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
94: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Create a <a href="PosixLock.html#M000122">new</a> <a
href="FileLock.html">Arrow::Session::FileLock</a> object.
</p>
params: ( uri, id )
category: Class
type: Public
- methods:
- visibility: public
aref: M000123
name: finish
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 107</span>\n\
107: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">finish</span>\n\
108: <span class=\"ruby-keyword kw\">super</span>\n\
109: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">close_lock_file</span>\n\
110: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Indicate to the lock that the caller will no longer be using it, and it may
free any resources it had been using.
</p>
params: ()
category: Instance
type: Public
- methods:
- visibility: protected
aref: M000126
name: acquire_read_lock
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 140</span>\n\
140: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">acquire_read_lock</span>( <span class=\"ruby-identifier\">blocking</span> )\n\
141: <span class=\"ruby-identifier\">flags</span> = <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_SH</span>\n\
142: <span class=\"ruby-identifier\">flags</span> <span class=\"ruby-operator\">|=</span> <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_NB</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">blocking</span>\n\
143: \n\
144: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">posixlock</span>( <span class=\"ruby-identifier\">flags</span> )\n\
145: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Acquire a read (shared) lock on the <a
href="PosixLock.html#M000124">lockfile</a>.
</p>
params: ( blocking )
- visibility: protected
aref: M000127
name: acquire_write_lock
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 149</span>\n\
149: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">acquire_write_lock</span>( <span class=\"ruby-identifier\">blocking</span> )\n\
150: <span class=\"ruby-identifier\">flags</span> = <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_EX</span>\n\
151: <span class=\"ruby-identifier\">flags</span> <span class=\"ruby-operator\">|=</span> <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_NB</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">blocking</span>\n\
152: \n\
153: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">posixlock</span>( <span class=\"ruby-identifier\">flags</span> )\n\
154: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Acquire a write (exclusive) lock on the <a
href="PosixLock.html#M000124">lockfile</a>.
</p>
params: ( blocking )
- visibility: protected
aref: M000125
name: close_lock_file
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 127</span>\n\
127: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">close_lock_file</span>\n\
128: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@lockfile</span>\n\
129: <span class=\"ruby-identifier\">path</span> = <span class=\"ruby-ivar\">@lockfile</span>.<span class=\"ruby-identifier\">path</span>\n\
130: <span class=\"ruby-ivar\">@lockfile</span>.<span class=\"ruby-identifier\">close</span>\n\
131: <span class=\"ruby-ivar\">@lockfile</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
132: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">exist?</span>( <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">untaint</span> )\n\
133: <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">untaint</span> )\n\
134: <span class=\"ruby-keyword kw\">end</span>\n\
135: <span class=\"ruby-keyword kw\">end</span>\n\
136: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Close the <a href="PosixLock.html#M000124">lockfile</a> and destroy the
File object belonging to this lock.
</p>
params: ()
- visibility: protected
aref: M000124
name: lockfile
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 120</span>\n\
120: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">lockfile</span>\n\
121: <span class=\"ruby-ivar\">@lockfile</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">open</span>( <span class=\"ruby-ivar\">@filename</span>, <span class=\"ruby-constant\">FileMode</span> )\n\
122: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Get the File object for the <a href="PosixLock.html#M000124">lockfile</a>
belonging to this lock, creating it if necessary.
</p>
params: ()
- visibility: protected
aref: M000128
name: release_read_lock
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 158</span>\n\
158: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">release_read_lock</span>\n\
159: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">write_locked?</span>\n\
160: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">posixlock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_UN</span> )\n\
161: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">close_lock_file</span>\n\
162: <span class=\"ruby-keyword kw\">end</span>\n\
163: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Release a previously-acquired read lock.
</p>
params: ()
- visibility: protected
aref: M000129
name: release_write_lock
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 167</span>\n\
167: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">release_write_lock</span>\n\
168: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">read_locked?</span>\n\
169: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">posixlock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_SH</span> )\n\
170: <span class=\"ruby-keyword kw\">else</span>\n\
171: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lockfile</span>.<span class=\"ruby-identifier\">posixlock</span>( <span class=\"ruby-constant\">File</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">LOCK_UN</span> )\n\
172: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">close_lock_file</span>\n\
173: <span class=\"ruby-keyword kw\">end</span>\n\
174: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Release a previously-acquired write lock.
</p>
params: ()
category: Instance
type: Protected
---
---
- name: SVNRev
desc: |+
SVN Revision
value: "%q$Rev: 437 $"
- name: SVNId
desc: |+
SVN <a href="Id.html">Id</a>
value: "%q$Id: posixlock.rb 437 2008-03-28 00:49:20Z deveiant $"
- name: DefaultLockDir
desc: |+
The path to the default lockdir
value: "'/tmp'"
- name: LockfileFormat
desc: |+
The format string that will be used for the name of the lock file. The
first ’%s’ will be replaced with a sanitized version of the
session id.
value: ""arrow-session-%s.plock""
- name: FileMode
desc: |+
The mode to open the <a href="PosixLock.html#M000124">lockfile</a> in
value: File::CREAT|File::RDWR
Generated with the Darkfish Rdoc Generator.