summaryrefslogtreecommitdiffstats
path: root/lib/puppet/util
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/util')
-rw-r--r--lib/puppet/util/pidlock.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/puppet/util/pidlock.rb b/lib/puppet/util/pidlock.rb
new file mode 100644
index 000000000..be7e1dbca
--- /dev/null
+++ b/lib/puppet/util/pidlock.rb
@@ -0,0 +1,68 @@
+require 'fileutils'
+
+class Puppet::Util::Pidlock
+ attr_reader :lockfile
+
+ def initialize(lockfile)
+ @lockfile = lockfile
+ end
+
+ def locked?
+ clear_if_stale
+ File.exists? @lockfile
+ end
+
+ def mine?
+ Process.pid == lock_pid
+ end
+
+ def anonymous?
+ return false unless File.exists?(@lockfile)
+ File.read(@lockfile) == ""
+ end
+
+ def lock(opts = {})
+ opts = {:anonymous => false}.merge(opts)
+
+ if locked?
+ false
+ else
+ if opts[:anonymous]
+ File.open(@lockfile, 'w') { |fd| true }
+ else
+ File.open(@lockfile, "w") { |fd| fd.write(Process.pid) }
+ end
+ true
+ end
+ end
+
+ def unlock(opts = {})
+ opts = {:anonymous => false}.merge(opts)
+
+ if mine? or (opts[:anonymous] and anonymous?)
+ File.unlink(@lockfile)
+ true
+ else
+ false
+ end
+ end
+
+ private
+ def lock_pid
+ if File.exists? @lockfile
+ File.read(@lockfile).to_i
+ else
+ nil
+ end
+ end
+
+ def clear_if_stale
+ return if lock_pid.nil?
+
+ begin
+ Process.kill(0, lock_pid)
+ rescue Errno::ESRCH
+ File.unlink(@lockfile)
+ end
+ end
+end