You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by se...@apache.org on 2018/07/03 10:37:21 UTC
[whimsy] branch master updated: Initial implementation of file
locking code
This is an automated email from the ASF dual-hosted git repository.
sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git
The following commit(s) were added to refs/heads/master by this push:
new 16bde91 Initial implementation of file locking code
16bde91 is described below
commit 16bde910775a4f50b1f05914d62edb5447335c36
Author: Sebb <se...@apache.org>
AuthorDate: Tue Jul 3 11:37:20 2018 +0100
Initial implementation of file locking code
---
lib/whimsy/lockfile.rb | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/lib/whimsy/lockfile.rb b/lib/whimsy/lockfile.rb
new file mode 100644
index 0000000..b8497fe
--- /dev/null
+++ b/lib/whimsy/lockfile.rb
@@ -0,0 +1,73 @@
+#!/usr/bin/env ruby
+
+#
+# File locking support
+#
+
+module LockFile
+
+ # create a new file and return an error if it already exists
+ def self.create_ex(filename, verbose=false)
+ err = nil
+ begin
+ File.open(filename, File::WRONLY|File::CREAT|File::EXCL) do |file|
+ yield file
+ end
+ rescue => e
+ err = e
+ end
+ return verbose ? [err==nil, err] : err==nil
+ end
+
+ # lock a file and ensure it gets unlocked
+ def self.flock(file, mode)
+ ok = file.flock(mode)
+ if ok
+ begin
+ yield file
+ ensure
+ file.flock(File::LOCK_UN)
+ end
+ end
+ ok
+ end
+
+end
+
+
+
+
+if __FILE__ == $0
+ test = ARGV.shift || 'lockw'
+ name = ARGV.shift || '/tmp/lockfile1'
+ text = "#{Time.now}\n"
+ puts "#{Time.now} #{test} using #{name}"
+ case test
+ when 'create'
+ ret = LockFile.create_ex(name) {|f| f << text}
+ when 'createShow'
+ ret = LockFile.create_ex(name, true) {|f| f << text}
+ when 'locka'
+ open(name,'a') do |f|
+ puts "#{Time.now} Wait lock"
+ ret = LockFile.flock(f,File::LOCK_EX) do |g|
+ g << text
+ puts "#{Time.now} Sleep"
+ sleep(5)
+ end
+ end
+ when 'lockw'
+ open(name,'w') do |f|
+ puts "#{Time.now} Wait lock"
+ ret = LockFile.flock(f,File::LOCK_EX) do |g|
+ g << text
+ puts "#{Time.now} Sleep"
+ sleep(5)
+ end
+ end
+ else
+ raise "Unexpected test: #{test}"
+ end
+ puts ret.inspect
+ puts File.read(name)
+end