module GxG::Engine

Public Class Methods

[](the_path="") click to toggle source
# File lib/gxg/gxg_engine.rb, line 49
def self.[](the_path="")
  # Public interface for accessing system keyed values.
  # access cached or system-read values on /proc (sysctl-style) keys. (frankly missing from BSD, etc)
  result = nil
  reference = ::GxG::Engine::detail_mapping()
  #
  reference.to_enum.each do |mapping|
    if mapping[:key] == the_path
      @@thread_safety.synchronize {
        result = @@details.get_at_path(mapping[:path]).clone
      }
      break
    end
  end
  #      unless result
  #        # attempt to fetch the data from the system somehow.
  #        result = get_system_data(the_path)
  #        unless result.keys.size > 0
  #          result = nil
  #        end
  #      end
  #
  result
end
abort(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 252
def self.abort(*args)
  ::Process::abort(*args)
end
available_event_descriptors() click to toggle source
# File lib/gxg/gxg_engine.rb, line 758
def self.available_event_descriptors()
  result = 0
  current = 0
  @@thread_safety.synchronize {
    current = (::GxG::Engine::maximum_event_descriptors() - @@event_descriptors)
  }
  if current > 0
    result = current
  end
  result
end
available_file_descriptors() click to toggle source
# File lib/gxg/gxg_engine.rb, line 729
def self.available_file_descriptors()
  (::GxG::Engine::maximum_file_descriptors() - ::GxG::Engine::file_descriptors().size)
end
daemon(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 383
def self.daemon(*args)
  ::Process::daemon(*args)
end
descriptor_heap_used() click to toggle source
# File lib/gxg/gxg_engine.rb, line 687
def self.descriptor_heap_used()
  result = {:total => 0}
  slot_size = ::GxG::Engine::profile[:slot_size]
  file_total = 0
  GxG::Engine::file_descriptors().to_enum.each do |item|
    file_total += item.heap_used()
  end
  @@thread_safety.synchronize {
    result[:files] = file_total
    unless ::GxG::Engine::descriptor_limits()[:events] == :files
      # see available_file_descriptors : beware counting event descriptors twice (w/ file descriptors)
      # TODO: GxG::Engine::descriptor_heap_used : sync w/ more precise event socket size determination
      result[:events] = (@@event_descriptors * (slot_size + 4))
    end
  }
  result[:total] = (result[:files].to_i + result[:events].to_i)
  #
  result
end
descriptor_limits() click to toggle source

Descriptors in general

# File lib/gxg/gxg_engine.rb, line 683
def self.descriptor_limits()
  {:events => @@details[:events][:maximum_event_descriptors], :files => @@details[:files][:maximum_file_descriptors]}.clone
end
detach(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 280
def self.detach(*args)
  ::Process::detach(*args)
end
detail_mapping() click to toggle source
# File lib/gxg/gxg_engine.rb, line 45
def self.detail_mapping()
  @@details[:key_map]
end
determine_engine_load() click to toggle source
# File lib/gxg/gxg_engine.rb, line 155
def self.determine_engine_load()
  max_event_descriptors = ::GxG::Engine::maximum_event_descriptors()
  available_events = ::GxG::Engine::available_event_descriptors()
  current_load = (((max_event_descriptors - available_events).to_f / max_event_descriptors.to_f) * 100.0)
  if (0.0..40.0).include?(current_load)
    # low
    @@thread_safety.synchronize {
      @@details[:engine_load][:high] = false
      @@details[:engine_load][:medium] = false
      @@details[:engine_load][:low] = true
      @@details[:memory_load][:percent] = current_load
    }
  else
    if (40.0..70.0).include?(current_load)
      # medium
      @@thread_safety.synchronize {
        @@details[:engine_load][:high] = false
        @@details[:engine_load][:medium] = true
        @@details[:engine_load][:low] = false
        @@details[:engine_load][:percent] = current_load
      }
    else
      if current_load > 70.0
        # high
        @@thread_safety.synchronize {
          @@details[:engine_load][:high] = true
          @@details[:engine_load][:medium] = false
          @@details[:engine_load][:low] = false
          @@details[:engine_load][:percent] = current_load
        }
      end
    end
  end
end
determine_event_allocations() click to toggle source
# File lib/gxg/gxg_engine.rb, line 794
def self.determine_event_allocations()
  #
  total = ::GxG::Engine::maximum_event_descriptors()
  dispatchers = []
  [::GxG::Events::EventDispatcher, ::GxG::Events::EventDispatcher::descendants()].flatten!.each do |the_class|
    ::ObjectSpace.each_object(the_class) do |the_dispatcher|
      if the_dispatcher.alive?()
        if the_dispatcher.running?()
          dispatchers << the_dispatcher
        end
      end
    end
  end
  # Note : a ghost-dispatcher representing all other system funcitons is added to the dispatcher count.
  maximum_events = (total.to_f / (dispatchers.size + 1).to_f).to_i
  threshold = (maximum_events.to_f * ::GxG::Engine::event_descriptors_threshold().to_f).to_i
  unless threshold > 0
    threshold = 1
  end
  @@thread_safety.synchronize {
    @@details[:events][:event_minimum_threshold] = threshold
    @@details[:events][:event_descriptors_envelope] = ((threshold)..(maximum_events))
  }
  true
end
determine_loads() click to toggle source
# File lib/gxg/gxg_engine.rb, line 190
def self.determine_loads()
  ::GxG::Engine::determine_memory_load()
  ::GxG::Engine::determine_engine_load()
end
determine_memory_load() click to toggle source
# File lib/gxg/gxg_engine.rb, line 122
def self.determine_memory_load()
  current_load = ((GxG::Engine::memory_used()[:total].to_f / GxG::SYSTEM.memory_limits()[:process].first.to_f) * 100.0)
  if (0.0..40.0).include?(current_load)
    # low
    @@thread_safety.synchronize {
      @@details[:memory_load][:high] = false
      @@details[:memory_load][:medium] = false
      @@details[:memory_load][:low] = true
      @@details[:memory_load][:percent] = current_load
    }
  else
    if (40.0..70.0).include?(current_load)
      # medium
      @@thread_safety.synchronize {
        @@details[:memory_load][:high] = false
        @@details[:memory_load][:medium] = true
        @@details[:memory_load][:low] = false
        @@details[:memory_load][:percent] = current_load
      }
    else
      if current_load > 70.0
        # high
        @@thread_safety.synchronize {
          @@details[:memory_load][:high] = true
          @@details[:memory_load][:medium] = false
          @@details[:memory_load][:low] = false
          @@details[:memory_load][:percent] = current_load
        }
      end
    end
  end
end
egid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 365
def self.egid(*args)
  ::Process::egid(*args)
end
engine_data_keys(other_platform=nil) click to toggle source
# File lib/gxg/gxg_engine.rb, line 520
def self.engine_data_keys(other_platform=nil)
  #
  result = []
  data = []
  data << {:key => "files.max_descriptors", :platforms => [:linux], :operation => {:getconf => "OPEN_MAX", :format => :to_int}}
  # TODO: Research maximum socket limit under zmq:
  # See: http://news.ycombinator.com/item?id=1740823
  # Also : http://stackoverflow.com/questions/651665/how-many-socket-connections-possible
  # inventory the various platform variables that affect what threshold of max_socket_count a given system would end up with.
  # TODO: find a way to ask the OS and ZMQ for: how many descriptors available to this process, and how many in use under zmq 2.x & 3.x respectively?
  # ALSO: factor in passed preferences for these settings.
  # update available_file_descriptors when all that becomes clear and is a bit settled.
  # current_memory = ::GxG::Engine::memory_available()[:actual]
  # TODO: GxG::Engine::engine_data_keys : determine precise socket size (32bit/64bit arch) for event zmq sockets used (exact type used).
  # GxG::Engine::profile()[:bits]
  # zmq_socket_size = 16384
  #
  # event_allocation = 0.5
  #
  # TODO: GxG::Engine::engine_data_keys : tie event allocation percentage into defaults / config.file loader.
  data << {:key => "events.max_descriptors", :platforms => [:linux], :operation => {:event_allocation => 0.5, :format => :noop}}
  # See: http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3
  # Sysctl tuning: http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1
  # LATER: develop a series of formulas for calculating approx. how many clients one can support under one 'cluster' controller (session manager).
  data.to_enum.each do |entry|
    if entry[:platforms].include?((other_platform || ::GxG::SYSTEM.platform()[:platform]))
      result << entry
    end
  end
  #
  result
end
engine_gear() click to toggle source
# File lib/gxg/gxg_engine.rb, line 195
def self.engine_gear()
  # inverse of load
  result = :low
  @@thread_safety.synchronize {
    if @@details[:engine_load][:medium]
      result = :medium
    end
    if @@details[:engine_load][:low]
      result = :high
    end
  }
  result
end
engine_load() click to toggle source
# File lib/gxg/gxg_engine.rb, line 116
def self.engine_load()
  @@thread_safety.synchronize {
    @@details[:engine_load][:percent]
  }
end
engine_load_high?() click to toggle source
# File lib/gxg/gxg_engine.rb, line 98
def self.engine_load_high?()
  @@thread_safety.synchronize {
    @@details[:engine_load][:high]
  }
end
engine_load_low?() click to toggle source
# File lib/gxg/gxg_engine.rb, line 110
def self.engine_load_low?()
  @@thread_safety.synchronize {
    @@details[:engine_load][:low]
  }
end
engine_load_medium?() click to toggle source
# File lib/gxg/gxg_engine.rb, line 104
def self.engine_load_medium?()
  @@thread_safety.synchronize {
    @@details[:engine_load][:medium]
  }
end
euid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 361
def self.euid(*args)
  ::Process::euid(*args)
end
event_allocation_envelope() click to toggle source
# File lib/gxg/gxg_engine.rb, line 820
def self.event_allocation_envelope()
  result = (20..100)
  @@thread_safety.synchronize {
    result = @@details[:events][:event_descriptors_envelope]
  }
  result
end
event_descriptors_threshold() click to toggle source
# File lib/gxg/gxg_engine.rb, line 738
def self.event_descriptors_threshold()
  # Percentage of allocation that must be available for events to be released.
  @@thread_safety.synchronize {
    @@details[:events][:event_descriptors_threshold].clone
  }
end
event_minimum_threshold() click to toggle source
# File lib/gxg/gxg_engine.rb, line 745
def self.event_minimum_threshold()
  # Percentage of allocation that must be available for events to be released.
  @@thread_safety.synchronize {
    @@details[:events][:event_minimum_threshold].clone
  }
end
events_in_use() click to toggle source
# File lib/gxg/gxg_engine.rb, line 752
def self.events_in_use()
  @@thread_safety.synchronize {
    @@event_descriptors
  }
end
exec(*args) click to toggle source

overrides

[:exec, :fork, :spawn, :exit!, :exit, :abort, :kill, :wait, :wait2, :waitpid, :waitpid2, :waitall, :detach, :pid, :ppid, .

# File lib/gxg/gxg_engine.rb, line 232
def self.exec(*args)
  ::Process::exec(*args)
end
exit(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 248
def self.exit(*args)
  ::Process::exit(*args)
end
exit!(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 244
def self.exit!(*args)
  ::Process::exit!(*args)
end
file_descriptors() click to toggle source
# File lib/gxg/gxg_engine.rb, line 711
def self.file_descriptors()
  # Return an Array of currently opened file descriptors.
  # About File Descriptors: http://stackoverflow.com/questions/848717/handling-more-than-1024-file-descriptors-in-c-on-linux
  #
  result = []
  exclude_list = []
  [::IO, ::IO::descendants()].flatten!.to_enum.each do |the_class|
    unless exclude_list.include?(the_class)
      ::ObjectSpace.each_object(the_class) do |the_io|
        unless (the_io.closed? || result.include?(the_io))
          result << the_io
        end
      end
    end
  end
  result
end
fork(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 236
def self.fork(*args)
  ::Process::fork(*args)
end
gear() click to toggle source
# File lib/gxg/gxg_engine.rb, line 223
def self.gear()
  "#{::GxG::Engine::engine_gear().to_s}_#{::GxG::Engine::memory_gear().to_s}".to_sym
end
get_engine_data(keys=[]) click to toggle source
# File lib/gxg/gxg_engine.rb, line 553
def self.get_engine_data(keys=[])
  # Support for <SYSTEM>.refresh_data_for(a_path) (private_method)
  # some sort of sysctl + config + etc for *all* platforms:
  # "sysctl -n net.ipv4.tcp_sack" becomes: "/net/ipv4/tcp/selective_ack" (external use path)
  # @details[:memory_limits][:buffers][:socket][:ipc] becomes colllection_point = @details.at_path(":memory_limits/:buffers/:socket/:ipc");collection_point[(key)]=value
  # procs for gathering data, and formatting for use.
  # by_platform key between sysctl/config-key and @details hash path.
  # {:synonyms => ["external-path"], :sysctl => "key-string', :format => :proc-name, :location => "hash-path", :location_key => (:sym or int)}
  #
  unless keys.is_a?(::Array)
    keys = [(keys)]
  end
  result = {}
  #
  format_noop = Proc.new do |the_data|
    the_data
  end
  format_to_int = Proc.new do |the_string|
    (the_string.numeric_values()[:integer] || 0)
  end
  format_to_float = Proc.new do |the_string|
    (the_string.numeric_values()[:float] || 0.0)
  end
  format_zerofalse = Proc.new do |the_string|
    ( format_to_int.call(the_string) > 0 )
  end
  format_valid_with_initial = Proc.new do |the_string|
    raw_data = the_string.split(" ")
    {:initial => format_to_int.call(raw_data[1]), :valid => ((format_to_int.call(raw_data[0]))..(format_to_int.call(raw_data[2])))}
  end
  sysctl_read = Proc.new do |a_key,the_formatter|
    ( the_formatter.call(`sysctl -n #{a_key.to_s}`.split("\n")[0]) )
  end
  getconf_read = Proc.new do |a_key, the_formatter|
    ( the_formatter.call(`getconf #{a_key.to_s}`.split("\n")[0]) )
  end
  event_allocation = Proc.new do |the_allocation, the_formatter|
    # more precise zmq socket byte size goes here.
    zmq_socket_size = 16384
    #
    (((::GxG::Engine::memory_available()[:actual].to_f * the_allocation.to_f).to_i / zmq_socket_size) - 1)
  end
  #
  reference = ::GxG::Engine::engine_data_keys()
  #
  fetch_data = Proc.new do |the_key|
    data = nil
    reference.to_enum.each do |entry|
      if entry[:key] == the_key
        case entry[:operation][:format]
        when :noop
          the_formatter = format_noop
        when :zerofalse
          the_formatter = format_zerofalse
        when :to_int
          the_formatter = format_to_int
        when :to_float
          the_formatter = format_to_float
        when :valid_with_initial
          the_formatter = format_valid_with_initial
        else
          the_formatter = format_noop
        end
        if entry[:operation][:sysctl]
          data = sysctl_read.call(entry[:operation][:sysctl],the_formatter)
        else
          if entry[:operation][:getconf]
            data = getconf_read.call(entry[:operation][:getconf],the_formatter)
          else
            if entry[:operation][:event_allocation]
              data = event_allocation.call(entry[:operation][:event_allocation],the_formatter)
            else
              #
            end
            #
          end
        end
        if data
          break
        end
      end
    end
    data
  end
  #
  keys.to_enum.each do |specifier|
    if specifier.is_a?(::String)
      # if element is String: serves as result Hash key to hold result value.
      # single result with this result key
      result[(specifier)] = fetch_data.call(specifier)
    else
      if specifier.is_a?(::Hash)
        # if element is Hash: {ukey => hash_path}, {:key => <keystring>, :path => <hash_path>}
        # if hash_path supplied, read the data; set the @details hash element, and return the formatted data
        if specifier[:key]
          # {:key => <keystring>, :path => <hash_path>}
          result[(specifier[:key])] = fetch_data.call(specifier[:key])
          if specifier[:path]
            @@thread_safety.synchronize {
              @@details.set_at_path(specifier[:path],result[(specifier[:key])])
            }
          end
        else
          # {ukey => hash_path}
          subkeys = specifier.keys
          subkeys.to_enum.each do |a_key|
            result[(a_key)] = fetch_data.call(a_key)
            @@thread_safety.synchronize {
              @@details.set_at_path(specifier[(a_key)],result[(a_key)])
            }
          end
        end
      end
    end
  end
  #
  result
end
getpgid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 302
def self.getpgid(*args)
  ::Process::getpgid(*args)
end
getpgrp(*args) click to toggle source

:getpgrp, :setpgrp, :getpgid, :setpgid, :setsid, :getpriority, :setpriority, :getrlimit, :setrlimit, :uid, :gid, :euid, :egid,

# File lib/gxg/gxg_engine.rb, line 294
def self.getpgrp(*args)
  ::Process::getpgrp(*args)
end
getpriority(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 314
def self.getpriority(*args)
  ::Process::getpriority(*args)
end
getrlimit(key) click to toggle source
# File lib/gxg/gxg_engine.rb, line 322
def self.getrlimit(key)
  result = nil
  # FIX: GxG::Engine::getrlimit : Awaiting rbx bug #2112 fix : https://github.com/rubinius/rubinius/issues/2112
  case ::GxG::Engine::profile()[:engine]
  when :ruby
    raw_data = ::Process::getrlimit(key)
    case key
    when :AS
      if GxG::SYSTEM
        memory_limits = GxG::SYSTEM.memory_limits()
        result = [raw_data[0],(memory_limits[:process].max)]
      else
        result = raw_data
      end
    else
      result = raw_data
    end
  when :jruby
    memory_limits = GxG::SYSTEM.memory_limits()
    result = [(memory_limits[:process].first),(memory_limits[:process].last)]
  when :rbx
    memory_limits = GxG::SYSTEM.memory_limits()
    result = [(memory_limits[:process].first),(memory_limits[:process].last)]
  end
  result
end
gid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 357
def self.gid(*args)
  ::Process::gid(*args)
end
groups(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 375
def self.groups(*args)
  ::Process::groups(*args)
end
initgroups(*args) click to toggle source

:initgroups, :groups, :maxgroups, :daemon, :times]

# File lib/gxg/gxg_engine.rb, line 371
def self.initgroups(*args)
  ::Process::initgroups(*args)
end
kill(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 256
def self.kill(*args)
  ::Process::kill(*args)
end
maxgroups(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 379
def self.maxgroups(*args)
  ::Process::maxgroups(*args)
end
maximum_event_descriptors() click to toggle source

Event Descriptors

# File lib/gxg/gxg_engine.rb, line 734
def self.maximum_event_descriptors()
  ::GxG::Engine::descriptor_limits()[:events]
end
maximum_file_descriptors() click to toggle source

File Descriptors

# File lib/gxg/gxg_engine.rb, line 707
def self.maximum_file_descriptors()
    ::GxG::Engine::descriptor_limits()[:files]
end
memory_available() click to toggle source
# File lib/gxg/gxg_engine.rb, line 481
def self.memory_available()
  # Memory available for this process
  result = {:actual => 0, :virtual => 0, :total => 0}
  if ::GxG::SYSTEM
    used_memory = ::GxG::Engine::memory_used()
    free_memory = ::GxG::SYSTEM.memory()
    limits = ::GxG::Engine::getrlimit(:AS)
    latitude_total = (limits[0] - used_memory[:actual])
    if latitude_total < 0
      latitude_total = 0
    end
    # latitude_virtual = (limits[0] - used_memory[:actual])
    # latitude_actual = (limits[0] - used_memory[:virtual])
    # indicates available ram vs. paged swap first
    if free_memory[:actual][:free].to_i > limits[0]
      result[:actual] = latitude_total
      result[:virtual] = 0
    else
      result[:actual] = free_memory[:actual][:free]
      # vm calc is crack-monkey, but someplace close to reality.
      if free_memory[:virtual][:free] > ((limits[0] - result[:actual]) - used_memory[:total])
        result[:virtual] = ((limits[0] - result[:actual]) - used_memory[:total])
        unless result[:virtual] > 0
          result[:virtual] = 0
        end
      else
        if ((free_memory[:virtual][:free] - result[:actual]) - used_memory[:total]) > 0
          result[:virtual] = ((free_memory[:virtual][:free] - result[:actual]) - used_memory[:total])
        else
          result[:virtual] = 0
        end
      end
    end
    #
  end
  result[:total] = (result[:actual] + result[:virtual])
  result
end
memory_gear() click to toggle source
# File lib/gxg/gxg_engine.rb, line 209
def self.memory_gear()
  # inverse of load
  result = :low
  @@thread_safety.synchronize {
    if @@details[:memory_load][:medium]
      result = :medium
    end
    if @@details[:memory_load][:low]
      result = :high
    end
  }
  result
end
memory_load() click to toggle source
# File lib/gxg/gxg_engine.rb, line 92
def self.memory_load()
  @@thread_safety.synchronize {
    @@details[:memory_load][:percent]
  }
end
memory_load_high?() click to toggle source
# File lib/gxg/gxg_engine.rb, line 74
def self.memory_load_high?()
  @@thread_safety.synchronize {
    @@details[:memory_load][:high]
  }
end
memory_load_low?() click to toggle source
# File lib/gxg/gxg_engine.rb, line 86
def self.memory_load_low?()
  @@thread_safety.synchronize {
    @@details[:memory_load][:low]
  }
end
memory_load_medium?() click to toggle source
# File lib/gxg/gxg_engine.rb, line 80
def self.memory_load_medium?()
  @@thread_safety.synchronize {
    @@details[:memory_load][:medium]
  }
end
memory_used() click to toggle source
# File lib/gxg/gxg_engine.rb, line 415
def self.memory_used()
  # ok... why in the fly'n F isn't this provided by core ruby?!?
  # Attribution: http://stackoverflow.com/questions/7220896/get-current-ruby-process-memory-usage
  result = {:actual => 0, :virtual => 0, :total => 0}
  #
  if ::GxG::SYSTEM
    case ::GxG::SYSTEM.platform[:platform]
    when :windows
      # FORNOW: user object space enumeration
      result[:actual] = ::GxG::Engine::object_memory_used()
    when :bsd
      pid_string = "#{::Process::pid}"
      env = self.environment()
      case env[:environment]
      when :openbsd
        # See: http://modman.unixdev.net/?sektion=1&page=procmap&manpath=OpenBSD-3.6
        # use `procmap -p #{pid_string}`
        # LATER: GxG::Engine::memory_used (OpenBSD) : determine how to cull procmap text data into :actual and :virtual memory usage.
        # FORNOW: user object space enumeration
        result[:actual] = ::GxG::Engine::object_memory_used()
        #
      when :freebsd, :dragonfly, :pcbsd
        # TODO: GxG::Engine::memory_used: Test with FreeBSD, DragonFlyBSD, and PCBSD.
        raw_data = `top -d 1`
        raw_data.to_enum(:each_line).each do |the_line|
          if the_line.split(" ")[0] == pid_string
            result[:actual] = (the_line.split(" ")[6] << "B").numeric_values([:byte])[:byte].to_i
            # TODO: GxG::Engine.memory_used() (netbsd) : Find a reliable way to get result[:virtual] mem used.
            break
          end
        end
      when :netbsd
        # TODO: GxG::Engine::memory_used: Test with NetBSD.
        raw_data = `top -d 1`
        raw_data.to_enum(:each_line).each do |the_line|
          if the_line.split(" ")[0] == pid_string
            result[:actual] = (the_line.split(" ")[4] << "B").numeric_values([:byte])[:byte].to_i
            # TODO: GxG::Engine.memory_used() (netbsd) : Find a reliable way to get result[:virtual] mem used.
            break
          end
        end
      when :darwin, :macos
        # TODO: GxG::Engine::memory_used: Test with Darwin/MacOSX.
        raw_data = `top -l 1`
        raw_data.to_enum(:each_line).each do |the_line|
          if the_line.split(" ")[0] == pid_string
            result[:actual] = (the_line.split(" ")[9] << "B").numeric_values([:byte])[:byte].to_i
            # TODO: GxG::Engine.memory_used() (darwin) : Find a reliable way to get result[:virtual] mem used.
            break
          end
        end
      end
    when :linux, :solaris
      # PS is universal, but unfortunately universally incorrect, See: http://stackoverflow.com/questions/131303/linux-how-to-measure-actual-memory-usage-of-an-application-or-process
      # TODO: GxG::Engine::memory_used: create a non-toolbox version for bootstrap memory profiling.
      # TODO: GxG::Engine::memory_used: Test with Solaris.
      raw_data = `pmap -d #{::Process::pid} | tail -n 1`.split(" ")
      result[:actual] = (raw_data[3].to_s << "B").numeric_values()[:byte].to_i
      result[:virtual] = (raw_data[1].to_s << "B").numeric_values()[:byte].to_i
      # result[:shared] = (raw_data[5] << "B").numeric_values()[:byte].to_i
    end
  end
  result[:total] = (result[:actual] + result[:virtual])
  result
end
object_memory_used() click to toggle source
# File lib/gxg/gxg_engine.rb, line 399
def self.object_memory_used()
  #
  slots = 0
  other = 0
  ::ObjectSpace.each_object do |the_object|
    slots += 1
    if the_object.alive?()
      if the_object.is_a?(::String)
        other += the_object.bytesize()
      end
    end
  end
  #
  ((::GxG::Engine::profile()[:slot_size].to_i * slots) + other)
end
pid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 284
def self.pid(*args)
  ::Process::pid(*args)
end
ppid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 288
def self.ppid(*args)
  ::Process::ppid(*args)
end
profile() click to toggle source

extensions

# File lib/gxg/gxg_engine.rb, line 393
def self.profile()
  @@thread_safety.synchronize {
    {:engine => @@details[:runtime], :version => @@details[:runtime_version], :bits => @@details[:runtime_bits], :slot_size => @@details[:runtime_rvalue_size]}.clone
  }
end
release_event_descriptor() click to toggle source
# File lib/gxg/gxg_engine.rb, line 783
def self.release_event_descriptor()
  result = false
  @@thread_safety.synchronize {
    if @@event_descriptors > 0
      @@event_descriptors -= 1
    end
  }
  result = true
  result
end
reserve_event_descriptor() click to toggle source
# File lib/gxg/gxg_engine.rb, line 770
def self.reserve_event_descriptor()
  result = false
  if ::GxG::Engine::available_event_descriptors() > 0
    @@thread_safety.synchronize {
      @@event_descriptors += 1
    }
    result = true
  else
    raise Errno::ENOMEM, "maximum number of event descriptors in use (#{GxG::Engine::maximum_event_descriptors().to_s})"
  end
  result
end
set_engine_data(keys=[]) click to toggle source
# File lib/gxg/gxg_engine.rb, line 672
def self.set_engine_data(keys=[])
  # LATER: GxG::Engine::set_engine_data : when you figure out system(sudo) authentication - use this for ops that require elevated privs to set system parameters.
  # Define a set of universal_keys that affect what other keys; upon setting any one, unique-list a set of keys to read back in w/ hash paths.
  result = nil
  if nil
    ::GxG::Engine::get_engine_data(nil,nil)
    # compare hash value to the_value; return true if successful
  end
  result
end
setpgid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 306
def self.setpgid(*args)
  ::Process::setpgid(*args)
end
setpgrp(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 298
def self.setpgrp(*args)
  ::Process::setpgrp(*args)
end
setpriority(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 318
def self.setpriority(*args)
  ::Process::setpriority(*args)
end
setrlimit(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 349
def self.setrlimit(*args)
  ::Process::setrlimit(*args)
end
setsid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 310
def self.setsid(*args)
  ::Process::setsid(*args)
end
spawn(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 240
def self.spawn(*args)
  ::Process::spawn(*args)
end
times(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 387
def self.times(*args)
  ::Process::times(*args)
end
uid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 353
def self.uid(*args)
  ::Process::uid(*args)
end
wait(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 260
def self.wait(*args)
  ::Process::wait(*args)
end
wait2(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 264
def self.wait2(*args)
  ::Process::wait2(*args)
end
waitall(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 276
def self.waitall(*args)
  ::Process::waitall(*args)
end
waitpid(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 268
def self.waitpid(*args)
  ::Process::waitpid(*args)
end
waitpid2(*args) click to toggle source
# File lib/gxg/gxg_engine.rb, line 272
def self.waitpid2(*args)
  ::Process::waitpid2(*args)
end