Sha256: e88da0cfcf3a8989a29b5a7193db6abeefaab4402674dffebb58ae1d6547568a

Contents?: true

Size: 1.13 KB

Versions: 7

Compression:

Stored size: 1.13 KB

Contents

require 'fileutils'


#
# A lock that can always be acquired
#
class Rufus::Scheduler::NullLock

  # Locking is always successful.
  #
  def lock; true; end

  def locked?; true; end
  def unlock; true; end
end

#
# The standard flock mechanism, with its own class thanks to @ecin
#
class Rufus::Scheduler::FileLock

  attr_reader :path

  def initialize(path)

    @path = path.to_s
  end

  # Locking is successful if this Ruby process can create and lock
  # its lockfile (at the given path).
  #
  def lock

    return true if locked?

    @lockfile = nil

    FileUtils.mkdir_p(::File.dirname(@path))

    file = File.new(@path, File::RDWR | File::CREAT)
    locked = file.flock(File::LOCK_NB | File::LOCK_EX)

    return false unless locked

    now = Time.now

    file.print("pid: #{$$}, ")
    file.print("scheduler.object_id: #{self.object_id}, ")
    file.print("time: #{now}, ")
    file.print("timestamp: #{now.to_f}")
    file.flush

    @lockfile = file

    true
  end

  def unlock

    !! (@lockfile && @lockfile.flock(File::LOCK_UN))
  end

  def locked?

    !! (@lockfile && @lockfile.flock(File::LOCK_NB | File::LOCK_EX))
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
rufus-scheduler-3.9.2 lib/rufus/scheduler/locks.rb
rufus-scheduler-3.9.1 lib/rufus/scheduler/locks.rb
rufus-scheduler-3.9.0 lib/rufus/scheduler/locks.rb
rufus-scheduler-3.8.2 lib/rufus/scheduler/locks.rb
rufus-scheduler-3.8.1 lib/rufus/scheduler/locks.rb
rufus-scheduler-3.8.0 lib/rufus/scheduler/locks.rb
rufus-scheduler-3.7.0 lib/rufus/scheduler/locks.rb