lib/spring/sid.rb in spring-0.0.6 vs lib/spring/sid.rb in spring-0.0.7

- old
+ new

@@ -1,16 +1,39 @@ -require 'fiddle' +begin + # If rubygems is present, keep it out of the way when loading fiddle, + # otherwise if fiddle is not installed then rubygems will load all + # gemspecs in its (futile) search for fiddle, which is slow. + if respond_to?(:gem_original_require, true) + gem_original_require 'fiddle' + else + require 'fiddle' + end +rescue LoadError +end module Spring module SID - FUNC = Fiddle::Function.new( - DL::Handle::DEFAULT['getsid'], - [Fiddle::TYPE_INT], - Fiddle::TYPE_INT - ) + def self.fiddle_func + @fiddle_func ||= Fiddle::Function.new( + DL::Handle::DEFAULT['getsid'], + [Fiddle::TYPE_INT], + Fiddle::TYPE_INT + ) + end - def self.sid(pid = 0) - FUNC.call(pid) + def self.sid + @sid ||= begin + if Process.respond_to?(:getsid) + # Ruby 2 + Process.getsid + elsif defined?(Fiddle) + # Ruby 1.9.3 compiled with libffi support + fiddle_func.call(0) + else + # last resort: shell out + `ps -p #{Process.pid} -o sess=`.to_i + end + end end def self.pgid Process.getpgid(sid) end