rbbcc 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rbbcc/bcc.rb CHANGED
@@ -14,6 +14,20 @@ module RbBCC
14
14
 
15
15
  class BCC
16
16
  class << self
17
+ def _find_file(filename)
18
+ if filename
19
+ unless File.exist?(filename)
20
+ t = File.expand_path "../#{filename}", $0
21
+ if File.exist?(t)
22
+ filename = t
23
+ else
24
+ raise "Could not find file #{filename}"
25
+ end
26
+ end
27
+ end
28
+ return filename
29
+ end
30
+
17
31
  def ksym(addr, show_module: false, show_offset: false)
18
32
  self.sym(addr, -1, show_module: show_module, show_offset: show_offset, demangle: false)
19
33
  end
@@ -163,23 +177,37 @@ module RbBCC
163
177
  end
164
178
  end
165
179
 
166
- def initialize(text:, debug: 0, cflags: [], usdt_contexts: [], allow_rlimit: 0)
180
+ def initialize(text: "", src_file: nil, hdr_file: nil, debug: 0, cflags: [], usdt_contexts: [], allow_rlimit: 0)
167
181
  @kprobe_fds = {}
168
182
  @uprobe_fds = {}
169
183
  @tracepoint_fds = {}
170
184
  @raw_tracepoint_fds = {}
171
- @usdt_contexts = usdt_contexts
172
- if code = gen_args_from_usdt
173
- text = code + text
174
- end
175
-
176
- @module = Clib.bpf_module_create_c_from_string(
177
- text,
178
- debug,
179
- cflags.pack('p*'),
180
- cflags.size,
181
- allow_rlimit
182
- )
185
+
186
+ if src_file
187
+ src_file = BCC._find_file(src_file)
188
+ hdr_file = BCC._find_file(hdr_file)
189
+ end
190
+
191
+ if src_file && src_file.end_with?(".b")
192
+ @module = Clib.bpf_module_create_b(src_file, hdr_file, debug, device)
193
+ else
194
+ if src_file
195
+ text = File.read(src_file)
196
+ end
197
+
198
+ @usdt_contexts = usdt_contexts
199
+ if code = gen_args_from_usdt
200
+ text = code + text
201
+ end
202
+
203
+ @module = Clib.bpf_module_create_c_from_string(
204
+ text,
205
+ debug,
206
+ cflags.pack('p*'),
207
+ cflags.size,
208
+ allow_rlimit
209
+ )
210
+ end
183
211
  @funcs = {}
184
212
  @tables = {}
185
213
  @perf_buffers = {}
data/lib/rbbcc/clib.rb CHANGED
@@ -45,6 +45,7 @@ module RbBCC
45
45
  typealias "size_t", "int"
46
46
 
47
47
  extern 'void * bpf_module_create_c_from_string(char *, unsigned int, char **, int, long)'
48
+ extern 'void * bpf_module_create_b(char *filename, char *proto_filename, unsigned int flags, char *dev_name)'
48
49
  extern 'int bpf_num_functions(void *)'
49
50
  extern 'char * bpf_function_name(void *, int)'
50
51
  extern 'void bpf_module_destroy(void *)'
data/lib/rbbcc/table.rb CHANGED
@@ -78,7 +78,9 @@ module RbBCC
78
78
  return next_key
79
79
  end
80
80
 
81
- def [](key)
81
+ def [](_key)
82
+ key = normalize_key(_key)
83
+
82
84
  leaf = Fiddle::Pointer.malloc(self.leafsize)
83
85
  res = Clib.bpf_lookup_elem(self.map_fd, key, leaf)
84
86
  if res < 0
@@ -91,7 +93,8 @@ module RbBCC
91
93
  self[key] || raise(KeyError, "key not found")
92
94
  end
93
95
 
94
- def []=(key, leaf)
96
+ def []=(_key, leaf)
97
+ key = normalize_key(_key)
95
98
  res = Clib.bpf_update_elem(self.map_fd, key, leaf, 0)
96
99
  if res < 0
97
100
  raise SystemCallError.new("Could not update table", Fiddle.last_error)
@@ -180,6 +183,17 @@ module RbBCC
180
183
  end
181
184
 
182
185
  private
186
+ def normalize_key(key)
187
+ case key
188
+ when Fiddle::Pointer
189
+ key
190
+ when Integer
191
+ byref(key, keysize)
192
+ else
193
+ raise KeyError, "#{key.inspect} must be integer or pointor"
194
+ end
195
+ end
196
+
183
197
  def byref(value, size=sizeof("int"))
184
198
  pack_fmt = case size
185
199
  when sizeof("int") ; "i!"
@@ -207,14 +221,6 @@ module RbBCC
207
221
  end
208
222
  alias length size
209
223
 
210
- def [](key)
211
- super(normalize_key(key))
212
- end
213
-
214
- def []=(key, value)
215
- super(normalize_key(key), value)
216
- end
217
-
218
224
  def clearitem(key)
219
225
  self[key] = byref(0, @leafsize)
220
226
  end
@@ -229,18 +235,6 @@ module RbBCC
229
235
  b.call(v.to_bcc_value)
230
236
  end
231
237
  end
232
-
233
- private
234
- def normalize_key(key)
235
- case key
236
- when Fiddle::Pointer
237
- key
238
- when Integer
239
- byref(key, keysize)
240
- else
241
- raise KeyError, "#{key.inspect} must be integer or pointor"
242
- end
243
- end
244
238
  end
245
239
 
246
240
  class PerfEventArray < TableBase
data/lib/rbbcc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RbBCC
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
data/rbbcc.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 2.0"
25
- spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rake", "~> 13.0"
26
26
  spec.add_development_dependency "pry"
27
27
  spec.add_development_dependency "minitest"
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbcc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio Kondo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-20 00:00:00.000000000 Z
11
+ date: 2020-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -85,7 +85,28 @@ files:
85
85
  - bin/console
86
86
  - bin/setup
87
87
  - docs/README.md
88
+ - docs/answers/01-hello-world.rb
89
+ - docs/answers/02-sys_sync.rb
90
+ - docs/answers/03-hello_fields.rb
91
+ - docs/answers/04-sync_timing.rb
92
+ - docs/answers/05-sync_count.rb
93
+ - docs/answers/06-disksnoop.rb
94
+ - docs/answers/07-hello_perf_output.rb
95
+ - docs/answers/08-sync_perf_output.rb
96
+ - docs/answers/09-bitehist.rb
97
+ - docs/answers/10-disklatency.rb
98
+ - docs/answers/11-vfsreadlat.c
99
+ - docs/answers/11-vfsreadlat.rb
100
+ - docs/answers/12-urandomread.rb
101
+ - docs/answers/13-disksnoop_fixed.rb
102
+ - docs/answers/14-strlen_count.rb
103
+ - docs/answers/15-nodejs_http_server.rb
104
+ - docs/answers/16-task_switch.c
105
+ - docs/answers/16-task_switch.rb
106
+ - docs/answers/node-server.js
88
107
  - docs/getting_started.md
108
+ - docs/projects_using_rbbcc.md
109
+ - docs/tutorial_bcc_ruby_developer.md
89
110
  - examples/bitehist.rb
90
111
  - examples/charty/Gemfile
91
112
  - examples/charty/Gemfile.lock