GIF87a; 404

MY HEART




Upload:

Command:

diavoloapp@3.134.81.178: ~ $
#
#   sync.rb - 2 phase lock with counter
#       $Release Version: 1.0$
#       $Revision: 38577 $
#       by Keiju ISHITSUKA(keiju@ishitsuka.com)
#
# --
#  Sync_m, Synchronizer_m
#  Usage:
#   obj.extend(Sync_m)
#   or
#   class Foo
#       include Sync_m
#       :
#   end
#
#   Sync_m#sync_mode
#   Sync_m#sync_locked?, locked?
#   Sync_m#sync_shared?, shared?
#   Sync_m#sync_exclusive?, sync_exclusive?
#   Sync_m#sync_try_lock, try_lock
#   Sync_m#sync_lock, lock
#   Sync_m#sync_unlock, unlock
#
#  Sync, Synchronizer:
#  Usage:
#   sync = Sync.new
#
#   Sync#mode
#   Sync#locked?
#   Sync#shared?
#   Sync#exclusive?
#   Sync#try_lock(mode) -- mode = :EX, :SH, :UN
#   Sync#lock(mode)     -- mode = :EX, :SH, :UN
#   Sync#unlock
#   Sync#synchronize(mode) {...}
#
#

unless defined? Thread
  raise "Thread not available for this ruby interpreter"
end

##
# A module that provides a two-phase lock with a counter.

module Sync_m
  # lock mode
  UN = :UN
  SH = :SH
  EX = :EX

  # exceptions
  class Err < StandardError
    def Err.Fail(*opt)
      fail self, sprintf(self::Message, *opt)
    end

    class UnknownLocker < Err
      Message = "Thread(%s) not locked."
      def UnknownLocker.Fail(th)
        super(th.inspect)
      end
    end

    class LockModeFailer < Err
      Message = "Unknown lock mode(%s)"
      def LockModeFailer.Fail(mode)
        if mode.id2name
          mode = id2name
        end
        super(mode)
      end
    end
  end

  def Sync_m.define_aliases(cl)
    cl.module_eval %q{
      alias locked? sync_locked?
      alias shared? sync_shared?
      alias exclusive? sync_exclusive?
      alias lock sync_lock
      alias unlock sync_unlock
      alias try_lock sync_try_lock
      alias synchronize sync_synchronize
    }
  end

  def Sync_m.append_features(cl)
    super
    # do nothing for Modules
    # make aliases for Classes.
    define_aliases(cl) unless cl.instance_of?(Module)
    self
  end

  def Sync_m.extend_object(obj)
    super
    obj.sync_extend
  end

  def sync_extend
    unless (defined? locked? and
            defined? shared? and
            defined? exclusive? and
            defined? lock and
            defined? unlock and
            defined? try_lock and
            defined? synchronize)
      Sync_m.define_aliases(singleton_class)
    end
    sync_initialize
  end

  # accessing
  def sync_locked?
    sync_mode != UN
  end

  def sync_shared?
    sync_mode == SH
  end

  def sync_exclusive?
    sync_mode == EX
  end

  # locking methods.
  def sync_try_lock(mode = EX)
    return unlock if mode == UN
    @sync_mutex.synchronize do
      sync_try_lock_sub(mode)
    end
  end

  def sync_lock(m = EX)
    return unlock if m == UN
    Thread.handle_interrupt(StandardError => :on_blocking) do
      while true
        @sync_mutex.synchronize do
          begin
            if sync_try_lock_sub(m)
              return self
            else
              if sync_sh_locker[Thread.current]
                sync_upgrade_waiting.push [Thread.current, sync_sh_locker[Thread.current]]
                sync_sh_locker.delete(Thread.current)
              else
                unless sync_waiting.include?(Thread.current) || sync_upgrade_waiting.reverse_each.any?{|w| w.first == Thread.current }
                  sync_waiting.push Thread.current
                end
              end
              @sync_mutex.sleep
            end
          ensure
            sync_waiting.delete(Thread.current)
          end
        end
      end
    end
    self
  end

  def sync_unlock(m = EX)
    wakeup_threads = []
    @sync_mutex.synchronize do
      if sync_mode == UN
        Err::UnknownLocker.Fail(Thread.current)
      end

      m = sync_mode if m == EX and sync_mode == SH

      runnable = false
      case m
      when UN
        Err::UnknownLocker.Fail(Thread.current)

      when EX
        if sync_ex_locker == Thread.current
          if (self.sync_ex_count = sync_ex_count - 1) == 0
            self.sync_ex_locker = nil
            if sync_sh_locker.include?(Thread.current)
              self.sync_mode = SH
            else
              self.sync_mode = UN
            end
            runnable = true
          end
        else
          Err::UnknownLocker.Fail(Thread.current)
        end

      when SH
        if (count = sync_sh_locker[Thread.current]).nil?
          Err::UnknownLocker.Fail(Thread.current)
        else
          if (sync_sh_locker[Thread.current] = count - 1) == 0
            sync_sh_locker.delete(Thread.current)
            if sync_sh_locker.empty? and sync_ex_count == 0
              self.sync_mode = UN
              runnable = true
            end
          end
        end
      end

      if runnable
        if sync_upgrade_waiting.size > 0
          th, count = sync_upgrade_waiting.shift
          sync_sh_locker[th] = count
          th.wakeup
          wakeup_threads.push th
        else
          wait = sync_waiting
          self.sync_waiting = []
          for th in wait
            th.wakeup
            wakeup_threads.push th
          end
        end
      end
    end
    for th in wakeup_threads
      th.run
    end
    self
  end

  def sync_synchronize(mode = EX)
    Thread.handle_interrupt(StandardError => :on_blocking) do
      sync_lock(mode)
      begin
        yield
      ensure
        sync_unlock
      end
    end
  end

  attr_accessor :sync_mode

  attr_accessor :sync_waiting
  attr_accessor :sync_upgrade_waiting
  attr_accessor :sync_sh_locker
  attr_accessor :sync_ex_locker
  attr_accessor :sync_ex_count

  def sync_inspect
    sync_iv = instance_variables.select{|iv| /^@sync_/ =~ iv.id2name}.collect{|iv| iv.id2name + '=' + instance_eval(iv.id2name).inspect}.join(",")
    print "<#{self.class}.extend Sync_m: #{inspect}, <Sync_m: #{sync_iv}>"
  end

  private

  def sync_initialize
    @sync_mode = UN
    @sync_waiting = []
    @sync_upgrade_waiting = []
    @sync_sh_locker = Hash.new
    @sync_ex_locker = nil
    @sync_ex_count = 0

    @sync_mutex = Mutex.new
  end

  def initialize(*args)
    super
    sync_initialize
  end

  def sync_try_lock_sub(m)
    case m
    when SH
      case sync_mode
      when UN
        self.sync_mode = m
        sync_sh_locker[Thread.current] = 1
        ret = true
      when SH
        count = 0 unless count = sync_sh_locker[Thread.current]
        sync_sh_locker[Thread.current] = count + 1
        ret = true
      when EX
        # in EX mode, lock will upgrade to EX lock
        if sync_ex_locker == Thread.current
          self.sync_ex_count = sync_ex_count + 1
          ret = true
        else
          ret = false
        end
      end
    when EX
      if sync_mode == UN or
          sync_mode == SH && sync_sh_locker.size == 1 && sync_sh_locker.include?(Thread.current)
        self.sync_mode = m
        self.sync_ex_locker = Thread.current
        self.sync_ex_count = 1
        ret = true
      elsif sync_mode == EX && sync_ex_locker == Thread.current
        self.sync_ex_count = sync_ex_count + 1
        ret = true
      else
        ret = false
      end
    else
      Err::LockModeFailer.Fail mode
    end
    return ret
  end
end

##
# An alias for Sync_m from sync.rb

Synchronizer_m = Sync_m

##
# A class that providesa two-phase lock with a counter.  See Sync_m for
# details.

class Sync
  include Sync_m
end

##
# An alias for Sync from sync.rb.  See Sync_m for details.

Synchronizer = Sync

Filemanager

Name Type Size Permission Actions
bigdecimal Folder 0755
cgi Folder 0755
date Folder 0755
digest Folder 0755
dl Folder 0755
drb Folder 0755
fiddle Folder 0755
io Folder 0755
irb Folder 0755
json Folder 0755
matrix Folder 0755
net Folder 0755
openssl Folder 0755
optparse Folder 0755
psych Folder 0755
racc Folder 0755
rbconfig Folder 0755
rexml Folder 0755
rinda Folder 0755
ripper Folder 0755
rss Folder 0755
shell Folder 0755
syslog Folder 0755
test Folder 0755
uri Folder 0755
vendor_ruby Folder 0755
webrick Folder 0755
xmlrpc Folder 0755
yaml Folder 0755
English.rb File 6.44 KB 0644
abbrev.rb File 3.31 KB 0644
base64.rb File 2.63 KB 0644
benchmark.rb File 17.94 KB 0644
cgi.rb File 9.39 KB 0644
cmath.rb File 7.22 KB 0644
complex.rb File 380 B 0644
csv.rb File 81.32 KB 0644
date.rb File 946 B 0644
debug.rb File 28.9 KB 0644
delegate.rb File 9.78 KB 0644
digest.rb File 2.24 KB 0644
dl.rb File 280 B 0644
drb.rb File 19 B 0644
e2mmap.rb File 3.8 KB 0644
erb.rb File 26.08 KB 0644
expect.rb File 2.14 KB 0644
fiddle.rb File 1.25 KB 0644
fileutils.rb File 46.35 KB 0644
find.rb File 2.08 KB 0644
forwardable.rb File 7.56 KB 0644
getoptlong.rb File 15.38 KB 0644
gserver.rb File 8.86 KB 0644
ipaddr.rb File 26.17 KB 0644
irb.rb File 20.03 KB 0644
json.rb File 1.74 KB 0644
kconv.rb File 5.74 KB 0644
logger.rb File 20.96 KB 0644
mathn.rb File 6.52 KB 0644
matrix.rb File 45.02 KB 0644
mkmf.rb File 78.13 KB 0644
monitor.rb File 6.93 KB 0644
mutex_m.rb File 2 KB 0644
observer.rb File 5.71 KB 0644
open-uri.rb File 23.66 KB 0644
open3.rb File 21.17 KB 0644
openssl.rb File 528 B 0644
optparse.rb File 51.27 KB 0644
ostruct.rb File 7.64 KB 0644
pathname.rb File 15.3 KB 0644
pp.rb File 13.14 KB 0644
prettyprint.rb File 9.63 KB 0644
prime.rb File 13.98 KB 0644
profile.rb File 205 B 0644
profiler.rb File 4.29 KB 0644
pstore.rb File 14.85 KB 0644
psych.rb File 11.45 KB 0644
rational.rb File 308 B 0644
resolv-replace.rb File 1.73 KB 0644
resolv.rb File 61.46 KB 0644
ripper.rb File 2.53 KB 0644
rss.rb File 2.84 KB 0644
scanf.rb File 23.52 KB 0644
securerandom.rb File 8.56 KB 0644
set.rb File 17.32 KB 0644
shell.rb File 10.3 KB 0644
shellwords.rb File 5.94 KB 0644
singleton.rb File 4.02 KB 0644
socket.rb File 25.76 KB 0644
sync.rb File 7.26 KB 0644
tempfile.rb File 10.15 KB 0644
thread.rb File 6.94 KB 0644
thwait.rb File 3.38 KB 0644
time.rb File 21.09 KB 0644
timeout.rb File 3.16 KB 0644
tmpdir.rb File 4.29 KB 0644
tracer.rb File 6.54 KB 0644
tsort.rb File 6.79 KB 0644
un.rb File 8.34 KB 0644
uri.rb File 3.07 KB 0644
weakref.rb File 3.23 KB 0644
webrick.rb File 6.7 KB 0644
xmlrpc.rb File 8.49 KB 0644
yaml.rb File 2.3 KB 0644