Module: TingYun::Support::LanguageSupport

Extended by:
LanguageSupport
Included in:
LanguageSupport
Defined in:
lib/ting_yun/support/language_support.rb

Constant Summary collapse

@@forkable =
nil

Instance Method Summary collapse

Instance Method Details

#broken_gc?Boolean

Returns:

  • (Boolean)


39
40
41
42
43
44
# File 'lib/ting_yun/support/language_support.rb', line 39

def broken_gc?
  LanguageSupport.using_version?('1.8.7') &&
      RUBY_PATCHLEVEL < 348 &&
      !LanguageSupport.using_engine?('jruby') &&
      !LanguageSupport.using_engine?('rbx')
end

#bundled_gem?(gem_name) ⇒ Boolean

Returns:

  • (Boolean)


147
148
149
150
151
152
# File 'lib/ting_yun/support/language_support.rb', line 147

def bundled_gem?(gem_name)
  defined?(Bundler) && Bundler.rubygems.all_specs.map(&:name).include?(gem_name)
rescue => e
  ::TingYun::Agent.logger.info("Could not determine if third party #{gem_name} gem is installed", e)
  false
end

#can_fork?Boolean

Returns:

  • (Boolean)


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

def can_fork?
  # this is expensive to check, so we should only check once
  return @@forkable if @@forkable != nil

  if Process.respond_to?(:fork)
    # if this is not 1.9.2 or higher, we have to make sure
    @@forkable = ::RUBY_VERSION < '1.9.2' ? test_forkability : true
  else
    @@forkable = false
  end

  @@forkable
end

#constantize(const_name) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/ting_yun/support/language_support.rb', line 116

def constantize(const_name)
  const_name.to_s.sub(/\A::/, '').split('::').inject(Object) do |namespace, name|
    begin
      result = namespace.const_get(name)

      # const_get looks up the inheritence chain, so if it's a class
      # in the constant make sure we found the one in our namespace.
      #
      # Can't help if the constant isn't a class...
      if result.is_a?(Module)
        expected_name = "#{namespace}::#{name}".gsub(/^Object::/, "")
        return unless expected_name == result.to_s
      end

      result
    rescue NameError
      nil
    end
  end
end

#gc_profiler_enabled?Boolean

Returns:

  • (Boolean)


77
78
79
80
81
82
83
# File 'lib/ting_yun/support/language_support.rb', line 77

def gc_profiler_enabled?
  if gc_profiler_usable? && ::GC::Profiler.enabled? && !::TingYun::Agent.config[:disable_gc_profiler]
    true
  else
    false
  end
end

#gc_profiler_usable?Boolean

Returns:

  • (Boolean)


69
70
71
72
73
74
75
# File 'lib/ting_yun/support/language_support.rb', line 69

def gc_profiler_usable?
  if defined?(::GC::Profiler) && !jruby?
    true
  else
    false
  end
end

#jruby?Boolean

Returns:

  • (Boolean)


95
96
97
# File 'lib/ting_yun/support/language_support.rb', line 95

def jruby?
  defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
end

#needs_syck?Boolean

need to use syck rather than psych when possible

Returns:

  • (Boolean)


10
11
12
13
# File 'lib/ting_yun/support/language_support.rb', line 10

def needs_syck?
  !LanguageSupport.using_engine?('jruby') &&
      LanguageSupport.using_version?('1.9.2')
end

#object_space_usable?Boolean

Returns:

  • (Boolean)


85
86
87
88
89
90
91
92
93
# File 'lib/ting_yun/support/language_support.rb', line 85

def object_space_usable?
  if defined?(::JRuby) && JRuby.respond_to?(:runtime)
    JRuby.runtime.is_object_space_enabled
  elsif defined?(::ObjectSpace) && !rubinius?
    true
  else
    false
  end
end

#ree?Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/ting_yun/support/language_support.rb', line 103

def ree?
  defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION =~ /Ruby Enterprise Edition/
end

#rubinius?Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/ting_yun/support/language_support.rb', line 99

def rubinius?
  defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
end

#supports_string_encodings?Boolean

Returns:

  • (Boolean)


112
113
114
# File 'lib/ting_yun/support/language_support.rb', line 112

def supports_string_encodings?
  RUBY_VERSION >= '1.9.0'
end

#test_forkabilityObject



137
138
139
140
141
142
143
144
145
# File 'lib/ting_yun/support/language_support.rb', line 137

def test_forkability
  child = Process.fork { exit! }
  # calling wait here doesn't seem like it should necessary, but it seems to
  # resolve some weird edge cases with resque forking.
  Process.wait child
  true
rescue NotImplementedError
  false
end

#using_engine?(engine) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
34
35
36
37
# File 'lib/ting_yun/support/language_support.rb', line 31

def using_engine?(engine)
  if defined?(::RUBY_ENGINE)
    ::RUBY_ENGINE == engine
  else
    engine == 'ruby'
  end
end

#using_version?(version) ⇒ Boolean

Returns:

  • (Boolean)


107
108
109
110
# File 'lib/ting_yun/support/language_support.rb', line 107

def using_version?(version)
  numbers = version.split('.')
  numbers == ::RUBY_VERSION.split('.')[0, numbers.size]
end

#with_cautious_gcObject



61
62
63
64
65
66
67
# File 'lib/ting_yun/support/language_support.rb', line 61

def with_cautious_gc
  if broken_gc?
    with_disabled_gc { yield }
  else
    yield
  end
end

#with_disabled_gcObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/ting_yun/support/language_support.rb', line 46

def with_disabled_gc
  if defined?(::GC) && ::GC.respond_to?(:disable)
    val = nil
    begin
      ::GC.disable
      val = yield
    ensure
      ::GC.enable
    end
    val
  else
    yield
  end
end