Subversion Info

Rev
437
Last Checked In
2008-03-28 00:49:20 (2 weeks ago)
Checked in by
deveiant

Class Index

Quicksearch

Arrow::Session::PosixLock

This lock type uses the ‘posixlock’ library..

Constants

SVNRev
SVN Revision
SVNId
SVN Id
DefaultLockDir
The path to the default lockdir
LockfileFormat
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.
FileMode
The mode to open the lockfile in

Attributes

lockDir[RW]
The path to the directory where session lockfiles are kept.

Public Class Methods

clean( directory=DefaultLockDir, threshold=3600 ) click to toggle source

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
new( uri, id ) click to toggle source

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

Public Instance Methods

finish() click to toggle source

Indicate to the lock that the caller will no longer be using it, and it may free any resources it had been using.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/session/posixlock.rb, line 107
107:     def finish
108:         super
109:         self.close_lock_file
110:     end

Protected Instance Methods

acquire_read_lock( blocking ) click to toggle source

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_write_lock( blocking ) click to toggle source

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_lock_file() click to toggle source

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
lockfile() click to toggle source

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_read_lock() click to toggle source

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_write_lock() click to toggle source

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

secsequence

--- SEC00115

seccomment

--- ""

attributes

--- 
- name: lockDir
  rw: RW
  a_desc: |+
    
    The path to the directory where session lockfiles are kept.
    

method_list

--- 
- 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\">&lt;</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\">&quot;Removing stale lockfile '%s'&quot;</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\">&gt;</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\">&quot;Could not clean up '%s': %s&quot;</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\">&quot;Filename is: #@filename&quot;</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

sectitle

--- 

constants

--- 
- 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 &#8217;%s&#8217; will be replaced with a sanitized version of the
    session id.
    
  value: "&quot;arrow-session-%s.plock&quot;"
- name: FileMode
  desc: |+
    
    The mode to open the <a href="PosixLock.html#M000124">lockfile</a> in
    
  value: File::CREAT|File::RDWR

[Validate]

Generated with the Darkfish Rdoc Generator.