bleak_house 3.0.1 → 3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -26
- data/Manifest +18 -30
- data/README +13 -66
- data/Rakefile +56 -63
- data/init.rb +1 -2
- data/install.rb +1 -2
- data/lib/bleak_house/{rails/action_controller.rb → action_controller.rb} +2 -3
- data/lib/bleak_house/analyze.rb +139 -0
- data/lib/bleak_house/bleak_house.rb +33 -0
- data/lib/bleak_house/dispatcher.rb +23 -0
- data/lib/bleak_house/gruff_hacks.rb +56 -0
- data/lib/bleak_house/mem_logger.rb +54 -0
- data/lib/bleak_house/{support/rake.rb → rake_task_redefine_task.rb} +0 -0
- data/lib/bleak_house/{support/core_extensions.rb → support_methods.rb} +0 -23
- data/lib/bleak_house.rb +10 -4
- data/tasks/bleak_house_tasks.rake +13 -0
- metadata +50 -77
- data/LICENSE_BSD +0 -10
- data/LICENSE_RUBY +0 -53
- data/TODO +0 -2
- data/bin/bleak +0 -10
- data/ext/bleak_house/logger/extconf.rb +0 -4
- data/ext/bleak_house/logger/snapshot.c +0 -153
- data/ext/bleak_house/logger/snapshot.h +0 -99
- data/lib/bleak_house/analyzer/analyzer.rb +0 -143
- data/lib/bleak_house/analyzer.rb +0 -5
- data/lib/bleak_house/logger/mem_usage.rb +0 -13
- data/lib/bleak_house/logger.rb +0 -3
- data/lib/bleak_house/rails/bleak_house.rb +0 -58
- data/lib/bleak_house/rails/dispatcher.rb +0 -19
- data/lib/bleak_house/rails.rb +0 -6
- data/lib/vendor/lightcsv.rb +0 -168
- data/patches/gc.c.patch +0 -27
- data/patches/parse.y.patch +0 -16
- data/test/misc/direct.rb +0 -13
- data/test/unit/test_bleak_house.rb +0 -34
- data.tar.gz.sig +0 -3
- metadata.gz.sig +0 -0
data/lib/bleak_house/logger.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
|
2
|
-
module BleakHouse
|
3
|
-
module Rails
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def last_request_name
|
7
|
-
@@last_request_name
|
8
|
-
end
|
9
|
-
|
10
|
-
def last_request_name=(obj)
|
11
|
-
@@last_request_name = obj
|
12
|
-
end
|
13
|
-
|
14
|
-
# Avoid making four more strings on each request.
|
15
|
-
CONTROLLER_KEY = 'controller'
|
16
|
-
ACTION_KEY = 'action'
|
17
|
-
GSUB_SEARCH = '/'
|
18
|
-
GSUB_REPLACEMENT = '__'
|
19
|
-
|
20
|
-
# Sets the request name on the BleakHouse object to match this Rails request. Called from <tt>ActionController::Base.process</tt>. Assign to <tt>last_request_name</tt> yourself if you are not using BleakHouse within Rails.
|
21
|
-
def set_request_name(request, other = nil)
|
22
|
-
self.last_request_name = "#{
|
23
|
-
request.parameters[CONTROLLER_KEY].gsub(GSUB_SEARCH, GSUB_REPLACEMENT) # mangle namespaced controller names
|
24
|
-
}/#{
|
25
|
-
request.parameters[ACTION_KEY]
|
26
|
-
}/#{
|
27
|
-
request.request_method
|
28
|
-
}#{
|
29
|
-
other
|
30
|
-
}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def debug(s) #:nodoc:
|
34
|
-
s = "** bleak_house: #{s}"
|
35
|
-
RAILS_DEFAULT_LOGGER.debug s if RAILS_DEFAULT_LOGGER
|
36
|
-
end
|
37
|
-
|
38
|
-
def warn(s) #:nodoc:
|
39
|
-
s = "** bleak_house: #{s}"
|
40
|
-
if RAILS_DEFAULT_LOGGER
|
41
|
-
RAILS_DEFAULT_LOGGER.warn s
|
42
|
-
else
|
43
|
-
$stderr.puts s
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
LOGFILE = "#{RAILS_ROOT}/log/bleak_house_#{RAILS_ENV}.dump"
|
49
|
-
if File.exists?(LOGFILE)
|
50
|
-
File.rename(LOGFILE, "#{LOGFILE}.old")
|
51
|
-
warn "renamed old logfile"
|
52
|
-
end
|
53
|
-
|
54
|
-
WITH_SPECIALS = false
|
55
|
-
|
56
|
-
MEMLOGGER = Logger.new
|
57
|
-
end
|
58
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
|
2
|
-
# Override Dispatcher#prepare and Dispatcher#reset_after_dispatch so that each request makes before-and-after usage snapshots.
|
3
|
-
class Dispatcher
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def prepare_application_with_bleak_house
|
7
|
-
prepare_application_without_bleak_house
|
8
|
-
BleakHouse::Rails::MEMLOGGER.snapshot(BleakHouse::Rails::LOGFILE, 'core rails', BleakHouse::Rails::WITH_SPECIALS)
|
9
|
-
end
|
10
|
-
alias_method_chain :prepare_application, :bleak_house
|
11
|
-
|
12
|
-
def reset_after_dispatch_with_bleak_house
|
13
|
-
BleakHouse::Rails::MEMLOGGER.snapshot(BleakHouse::Rails::LOGFILE, BleakHouse::Rails.last_request_name || 'unknown', BleakHouse::Rails::WITH_SPECIALS)
|
14
|
-
reset_after_dispatch_without_bleak_house
|
15
|
-
end
|
16
|
-
alias_method_chain :reset_after_dispatch, :bleak_house
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
data/lib/bleak_house/rails.rb
DELETED
data/lib/vendor/lightcsv.rb
DELETED
@@ -1,168 +0,0 @@
|
|
1
|
-
# = LightCsv
|
2
|
-
# CSV parser
|
3
|
-
#
|
4
|
-
# $Id: lightcsv.rb 76 2007-04-15 14:34:23Z tommy $
|
5
|
-
# Copyright:: 2007 (C) TOMITA Masahiro <tommy@tmtm.org>
|
6
|
-
# License:: Ruby's
|
7
|
-
# Homepage:: http://tmtm.org/ja/ruby/lightcsv
|
8
|
-
|
9
|
-
require "strscan"
|
10
|
-
|
11
|
-
# == CSV のパース
|
12
|
-
# 各レコードはカラムを要素とする配列である。
|
13
|
-
# レコードの区切りは LF,CR,CRLF のいずれか。
|
14
|
-
#
|
15
|
-
# 以下が csv.rb と異なる。
|
16
|
-
# * 空行は [nil] ではなく [] になる。
|
17
|
-
# * 「"」で括られていない空カラムは nil ではなく "" になる。
|
18
|
-
#
|
19
|
-
# == 例
|
20
|
-
# * CSVファイルのレコード毎にブロックを繰り返す。
|
21
|
-
# LightCsv.foreach(filename){|row| ...}
|
22
|
-
# 次と同じ。
|
23
|
-
# LightCsv.open(filename){|csv| csv.each{|row| ...}}
|
24
|
-
#
|
25
|
-
# * CSVファイルの全レコードを返す。
|
26
|
-
# LightCsv.readlines(filename) # => [[col1,col2,...],...]
|
27
|
-
# 次と同じ。
|
28
|
-
# LightCsv.open(filename){|csv| csv.map}
|
29
|
-
#
|
30
|
-
# * CSV文字列のレコード毎にブロックを繰り返す。
|
31
|
-
# LightCsv.parse("a1,a2,..."){|row| ...}
|
32
|
-
# 次と同じ。
|
33
|
-
# LightCsv.new("a1,a2,...").each{|row| ...}
|
34
|
-
#
|
35
|
-
# * CSV文字列の全レコードを返す。
|
36
|
-
# LightCsv.parse("a1,a2,...") # => [[a1,a2,...],...]
|
37
|
-
# 次と同じ。
|
38
|
-
# LightCsv.new("a1,a2,...").map
|
39
|
-
#
|
40
|
-
class LightCsv
|
41
|
-
include Enumerable
|
42
|
-
|
43
|
-
# == パースできない形式の場合に発生する例外
|
44
|
-
# InvalidFormat#message は処理できなかった位置から 10バイト文の文字列を返す。
|
45
|
-
class InvalidFormat < RuntimeError; end
|
46
|
-
|
47
|
-
# ファイルの各レコード毎にブロックを繰り返す。
|
48
|
-
# ブロック引数はレコードを表す配列。
|
49
|
-
def self.foreach(filename, &block)
|
50
|
-
self.open(filename) do |f|
|
51
|
-
f.each(&block)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# ファイルの全レコードをレコードの配列で返す。
|
56
|
-
def self.readlines(filename)
|
57
|
-
self.open(filename) do |f|
|
58
|
-
return f.map
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# CSV文字列の全レコードをレコードの配列で返す。
|
63
|
-
# ブロックが与えられた場合は、レコード毎にブロックを繰り返す。
|
64
|
-
# ブロック引数はレコードを表す配列。
|
65
|
-
def self.parse(string, &block)
|
66
|
-
unless block
|
67
|
-
return self.new(string).map
|
68
|
-
end
|
69
|
-
self.new(string).each do |row|
|
70
|
-
block.call row
|
71
|
-
end
|
72
|
-
return nil
|
73
|
-
end
|
74
|
-
|
75
|
-
# ファイルをオープンして LightCsv オブジェクトを返す。
|
76
|
-
# ブロックを与えた場合は LightCsv オブジェクトを引数としてブロックを実行する。
|
77
|
-
def self.open(filename, &block)
|
78
|
-
f = File.open(filename)
|
79
|
-
csv = self.new(f)
|
80
|
-
if block
|
81
|
-
begin
|
82
|
-
return block.call(csv)
|
83
|
-
ensure
|
84
|
-
csv.close
|
85
|
-
end
|
86
|
-
else
|
87
|
-
return csv
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
# LightCsv オブジェクトを生成する。
|
92
|
-
# _src_ は String か IO。
|
93
|
-
def initialize(src)
|
94
|
-
if src.kind_of? String
|
95
|
-
@file = nil
|
96
|
-
@ss = StringScanner.new(src)
|
97
|
-
else
|
98
|
-
@file = src
|
99
|
-
@ss = StringScanner.new("")
|
100
|
-
end
|
101
|
-
@buf = ""
|
102
|
-
@bufsize = 64*1024
|
103
|
-
end
|
104
|
-
attr_accessor :bufsize
|
105
|
-
|
106
|
-
# LightCsv オブジェクトに関連したファイルをクローズする。
|
107
|
-
def close()
|
108
|
-
@file.close if @file
|
109
|
-
end
|
110
|
-
|
111
|
-
# 1レコードを返す。データの最後の場合は nil を返す。
|
112
|
-
# 空行の場合は空配列([])を返す。
|
113
|
-
# 空カラムは「"」で括られているか否かにかかわらず空文字列("")になる。
|
114
|
-
def shift()
|
115
|
-
return nil if @ss.eos? and ! read_next_data
|
116
|
-
cols = []
|
117
|
-
while true
|
118
|
-
if @ss.eos? and ! read_next_data
|
119
|
-
cols << ""
|
120
|
-
break
|
121
|
-
end
|
122
|
-
if @ss.scan(/\"/n)
|
123
|
-
until @ss.scan(/(?:\"\"|[^\"])*\"/n)
|
124
|
-
read_next_data or raise InvalidFormat, @ss.rest[0,10]
|
125
|
-
end
|
126
|
-
cols << @ss.matched.chop.gsub(/\"\"/n, '"')
|
127
|
-
else
|
128
|
-
col = @ss.scan(/[^\",\r\n]*/n)
|
129
|
-
while @ss.eos? and read_next_data
|
130
|
-
col << @ss.scan(/[^\",\r\n]*/n)
|
131
|
-
end
|
132
|
-
cols << col
|
133
|
-
end
|
134
|
-
unless @ss.scan(/,/n)
|
135
|
-
break if @ss.scan(/\r\n/n)
|
136
|
-
unless @ss.rest_size < 2 and read_next_data and @ss.scan(/,/n)
|
137
|
-
break if @ss.scan(/\r\n|\n|\r|\z/n)
|
138
|
-
read_next_data
|
139
|
-
raise InvalidFormat, @ss.rest[0,10]
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
cols.clear if cols.size == 1 and cols.first.empty?
|
144
|
-
cols
|
145
|
-
end
|
146
|
-
|
147
|
-
# 各レコード毎にブロックを繰り返す。
|
148
|
-
def each()
|
149
|
-
while row = shift
|
150
|
-
yield row
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# 現在位置以降のレコードの配列を返す。
|
155
|
-
def readlines()
|
156
|
-
return map
|
157
|
-
end
|
158
|
-
|
159
|
-
private
|
160
|
-
|
161
|
-
def read_next_data()
|
162
|
-
if @file and @file.read(@bufsize, @buf)
|
163
|
-
@ss.string = @ss.rest + @buf
|
164
|
-
else
|
165
|
-
nil
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
data/patches/gc.c.patch
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
*** gc.old 2007-09-25 00:27:27.000000000 -0400
|
2
|
-
--- gc.c 2007-09-25 00:27:28.000000000 -0400
|
3
|
-
***************
|
4
|
-
*** 309,314 ****
|
5
|
-
--- 309,330 ----
|
6
|
-
static int heaps_length = 0;
|
7
|
-
static int heaps_used = 0;
|
8
|
-
|
9
|
-
+ struct heaps_slot *
|
10
|
-
+ rb_gc_heap_slots()
|
11
|
-
+ {
|
12
|
-
+ return heaps;
|
13
|
-
+ }
|
14
|
-
+
|
15
|
-
+ int
|
16
|
-
+ rb_gc_heaps_used() {
|
17
|
-
+ return heaps_used;
|
18
|
-
+ }
|
19
|
-
+
|
20
|
-
+ int
|
21
|
-
+ rb_gc_heaps_length() {
|
22
|
-
+ return heaps_length;
|
23
|
-
+ }
|
24
|
-
+
|
25
|
-
#define HEAP_MIN_SLOTS 10000
|
26
|
-
static int heap_slots = HEAP_MIN_SLOTS;
|
27
|
-
|
data/patches/parse.y.patch
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
*** parse.old 2007-09-25 00:21:43.000000000 -0400
|
2
|
-
--- parse.y 2007-09-25 00:23:02.000000000 -0400
|
3
|
-
***************
|
4
|
-
*** 6166,6171 ****
|
5
|
-
--- 6166,6176 ----
|
6
|
-
* :wait2, :$>]
|
7
|
-
*/
|
8
|
-
|
9
|
-
+ struct st_table *
|
10
|
-
+ rb_parse_sym_tbl() {
|
11
|
-
+ return sym_tbl;
|
12
|
-
+ }
|
13
|
-
+
|
14
|
-
VALUE
|
15
|
-
rb_sym_all_symbols()
|
16
|
-
{
|
data/test/misc/direct.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby-bleak-house
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bleak_house/c'
|
5
|
-
$memlogger = BleakHouse::Logger.new
|
6
|
-
File.delete($logfile = "/tmp/log") rescue nil
|
7
|
-
|
8
|
-
puts 0
|
9
|
-
$memlogger.snapshot($logfile, "file", true)
|
10
|
-
puts 1
|
11
|
-
$memlogger.snapshot($logfile, "file/one", true)
|
12
|
-
puts 2
|
13
|
-
$memlogger.snapshot($logfile, "file/two", true)
|
@@ -1,34 +0,0 @@
|
|
1
|
-
|
2
|
-
DIR = File.dirname(__FILE__) + "/../../"
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'yaml'
|
7
|
-
require 'ruby-debug'
|
8
|
-
Debugger.start
|
9
|
-
|
10
|
-
class BleakHouseTest < Test::Unit::TestCase
|
11
|
-
require "#{DIR}lib/bleak_house/logger"
|
12
|
-
|
13
|
-
SNAPSHOT_FILE = "/tmp/bleak_house"
|
14
|
-
SNAPS = {:c => SNAPSHOT_FILE + ".c.yaml",
|
15
|
-
:ruby => SNAPSHOT_FILE + ".rb.yaml"}
|
16
|
-
|
17
|
-
def setup
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_c_snapshot
|
21
|
-
File.delete SNAPS[:c] rescue nil
|
22
|
-
symbol_count = Symbol.all_symbols.size
|
23
|
-
::BleakHouse::Logger.new.snapshot(SNAPS[:c], "c_test", false)
|
24
|
-
assert_equal symbol_count, Symbol.all_symbols.size
|
25
|
-
assert File.exist?(SNAPS[:c])
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_c_raises
|
29
|
-
assert_raises(RuntimeError) do
|
30
|
-
::BleakHouse::Logger.new.snapshot("/", "c_test", false)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
data.tar.gz.sig
DELETED
metadata.gz.sig
DELETED
Binary file
|