Changeset 326

Show
Ignore:
Timestamp:
07/18/06 18:05:47 (4 years ago)
Author:
vasi
Message:

faster ktrace using external helper

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • gtk-osx/trunk/scripts/gtk-osx/ktrace.rb

    r321 r326  
    66        attr_reader :tracefile 
    77         
    8         def initialize(tracefile = 'ktrace.out') 
     8        @@helper_dir = Pathname.new(__FILE__) + '../../../kdump-parse' 
     9        def self.helper_dir=(dir) 
     10                @@helper_dir = dir 
     11        end 
     12         
     13        def initialize(tracefile = 'ktrace.out', origdir = nil) 
    914                @tracefile = tracefile 
    10                 @origdir = Dir.pwd 
     15                @origdir = origdir || Dir.pwd 
    1116        end 
    1217                 
     
    1823         
    1924        # Get the files that were written to. 
    20         # Not the prettiest implementation, but the previous one was far too slow. 
    2125        def write_paths 
    2226                return @files if defined? @files                 
     27                catch :no_helper do 
     28                        c_write_paths 
     29                        return @files 
     30                end 
     31                ruby_write_paths 
     32                return @files 
     33        end 
     34         
     35        def get_helper 
     36                return @@helper if defined? @@helper 
    2337                 
     38                dir = Pathname.new(@@helper_dir) 
     39                program = 'kdump-parse' 
     40                 
     41                # Search for an existing executable 
     42                [dir, Pathname.new(__FILE__).parent].each do |d| 
     43                        file = d + program 
     44                        return (@@helper = file) if file.executable? 
     45                end 
     46                 
     47                # Try building it 
     48                makefile = dir + 'Makefile' 
     49                if dir.directory? && dir.writable? && makefile.exist? 
     50                        system("(cd #{dir.shellquote} && make #{program})") 
     51                        file = dir + program 
     52                        return (@@helper = file) if file.executable? 
     53                end 
     54                 
     55                # Give up 
     56                throw :no_helper 
     57        end 
     58         
     59        # Use an external helper, for SPEED 
     60        def c_write_paths 
     61                helper = get_helper 
     62                IO.popen("#{helper.shellquote} #{@tracefile.shellquote} " + 
     63                                "#{@origdir.shellquote}", 'r') do |pipe| 
     64                        @files = pipe.readlines.map { |s| Pathname.new(s.chomp) } 
     65                end 
     66        end 
     67         
     68        # Pure-ruby implementation 
     69        def ruby_write_paths 
    2470                dest_idx = { 'open' => 0, 'symlink' => 0, 'link' => 1, 'chdir' => 0, 
    2571                        'rename' => 1 } 
     
    67113                end 
    68114                 
    69                 return @files = files.keys 
     115                @files = files.keys 
    70116        end 
    71117end