Class: OS

Inherits:
Object
  • Object
show all
Defined in:
lib/os.rb

Overview

a set of friendly files for determining your Ruby runtime treats cygwin as linux also treats IronRuby on mono as…linux

Defined Under Namespace

Classes: Underlying

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config


8
9
10
# File 'lib/os.rb', line 8

def config
  @config
end

Class Method Details

.bitsObject


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/os.rb', line 72

def self.bits
  @bits ||= begin
    if host_cpu =~ /_64$/ || RUBY_PLATFORM =~ /x86_64/
      64
    elsif RUBY_PLATFORM == 'java' && ENV_JAVA['sun.arch.data.model'] # "32" or "64":http://www.ruby-forum.com/topic/202173#880613
      ENV_JAVA['sun.arch.data.model'].to_i
    elsif host_cpu == 'i386'
      32
    elsif host_os =~ /32$/ # mingw32, mswin32
      32
    else # cygwin only...I think
      if 1.size == 8
        64
      else
        32
      end
    end
  end
end

.configObject


10
11
12
# File 'lib/os.rb', line 10

def self.config
  @config ||= RbConfig::CONFIG
end

.cpu_countObject


211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/os.rb', line 211

def self.cpu_count
  @cpu_count ||=
  case RUBY_PLATFORM
    when /darwin9/
      `hwprefs cpu_count`.to_i
    when /darwin10/
      (hwprefs_available? ? `hwprefs thread_count` : `sysctl -n hw.ncpu`).to_i
    when /linux/
      `cat /proc/cpuinfo | grep processor | wc -l`.to_i
    when /freebsd/
      `sysctl -n hw.ncpu`.to_i
    else
      if RbConfig::CONFIG['host_os'] =~ /darwin/
         (hwprefs_available? ? `hwprefs thread_count` : `sysctl -n hw.ncpu`).to_i
      elsif self.windows?
        out = ENV['NUMBER_OF_PROCESSORS'].to_i
        if out == 0
           # in case env. variable not set
          require 'win32ole'
          wmi = WIN32OLE.connect("winmgmts://")
          cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # don't count hyper-threaded in this
          out = cpu.to_enum.first.NumberOfCores
        end
        out
      else
        raise 'unknown platform processor_count'
      end
    end
end

.cygwin?Boolean

Returns:

  • (Boolean)

175
176
177
178
179
180
181
182
183
# File 'lib/os.rb', line 175

def self.cygwin?
  @cygwin = begin
    if RUBY_PLATFORM =~ /-cygwin/
      true
    else
      false
    end
  end
end

.dev_nullObject


185
186
187
188
189
190
191
192
193
# File 'lib/os.rb', line 185

def self.dev_null
  @dev_null ||= begin
    if OS.windows?
      "NUL"
    else
      "/dev/null"
    end
  end
end

.iron_ruby?Boolean

Returns:

  • (Boolean)

62
63
64
65
66
67
68
69
70
# File 'lib/os.rb', line 62

def self.iron_ruby?
 @iron_ruby ||= begin
   if defined?(RUBY_ENGINE) && (RUBY_ENGINE == 'ironruby')
     true
   else
     false
   end
 end
end

.java?Boolean Also known as: jruby?

Returns:

  • (Boolean)

93
94
95
96
97
98
99
100
101
# File 'lib/os.rb', line 93

def self.java?
  @java ||= begin
    if RUBY_PLATFORM =~ /java/
      true
    else
      false
    end
  end
end

.linux?Boolean

true for linux, false for windows, os x, cygwin

Returns:

  • (Boolean)

54
55
56
57
58
59
60
# File 'lib/os.rb', line 54

def self.linux?
  if (host_os =~ /linux/)
    true
  else
    false
  end
end

.mac?Boolean

Returns:

  • (Boolean)

109
110
111
112
113
114
115
116
117
# File 'lib/os.rb', line 109

def self.mac?
  @mac = begin
    if host_os =~ /darwin/
      true
    else
      false
    end
  end      
end

.open_file_commandObject


241
242
243
244
245
246
247
248
249
250
251
# File 'lib/os.rb', line 241

def self.open_file_command
  if OS.doze? || OS.cygwin?
    "start"
  elsif OS.mac?
    "open"
  else
    # linux...what about cygwin?
    "xdg-open"
  end

end

.osx?Boolean

Returns:

  • (Boolean)

119
120
121
# File 'lib/os.rb', line 119

def self.osx?
  mac?
end

.posix?Boolean

true for linux, os x, cygwin

Returns:

  • (Boolean)

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/os.rb', line 31

def self.posix?
  @posix ||=
  begin
    if OS.windows?
      begin
        begin
          # what if we're on interix...
          # untested, of course
          Process.wait fork{}
          true
        rescue NotImplementedError, NoMethodError
          false
        end
      end
    else
      # assume non windows is posix
      true
    end
  end

end

.reportObject

provides easy way to see the relevant config entries


196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/os.rb', line 196

def self.report
  relevant_keys = [
    'arch',
    'host',
    'host_cpu',
    'host_os',
    'host_vendor',
    'target',
    'target_cpu',
    'target_os',
    'target_vendor',
  ]
  RbConfig::CONFIG.reject {|key, val| !relevant_keys.include? key }.merge({'RUBY_PLATFORM' => RUBY_PLATFORM}).to_yaml
end

.rss_bytesObject

amount of memory the current process “is using”, in RAM (doesn't include any swap memory that it may be using, just that in actual RAM) raises 'unknown' on jruby currently


126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/os.rb', line 126

def self.rss_bytes
  # attempt to do this in a jruby friendly way
  if OS::Underlying.windows?
    # MRI, Java, IronRuby, Cygwin
    if OS.java?
      # no win32ole on 1.5.x, so leave here for compatibility...maybe for awhile :P
      require 'java'
      mem_bean = java.lang.management.ManagementFactory.getMemoryMXBean
      mem_bean.heap_memory_usage.used + mem_bean.non_heap_memory_usage.used
    else
      wmi = nil
      begin
        require 'win32ole'
        wmi = WIN32OLE.connect("winmgmts://")
      rescue LoadError, NoMethodError => e # NoMethod for IronRuby currently [sigh]
        raise 'rss unknown for this platform ' + e.to_s
      end        
      processes = wmi.ExecQuery("select * from win32_process where ProcessId = #{Process.pid}")
      memory_used = nil
      # only allow for one...
      for process in processes
        raise if memory_used
        memory_used = process.WorkingSetSize.to_i
        end
      memory_used
    end
  elsif OS.posix? # linux [though I've heard it works in OS X]
    kb = `ps -o rss= -p #{Process.pid}`.to_i # in kilobytes
  else
    raise 'unknown rss for this platform'
  end
end

.ruby_binObject


103
104
105
106
107
# File 'lib/os.rb', line 103

def self.ruby_bin
  @ruby_exe ||= begin
    File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
  end
end

.windows?Boolean Also known as: doze?

true if on windows [and/or jruby] false if on linux or cygwin on windows

Returns:

  • (Boolean)

17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/os.rb', line 17

def self.windows?
  @windows ||= begin
    if RUBY_PLATFORM =~ /cygwin/ # i386-cygwin
      false
    elsif ENV['OS'] == 'Windows_NT'
      true
    else
      false
    end
  end

end