xref: /aosp_15_r20/external/bcc/src/lua/bcc/tracerpipe.lua (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker--[[
2*387f9dfdSAndroid Build Coastguard WorkerCopyright 2016 GitHub, Inc
3*387f9dfdSAndroid Build Coastguard Worker
4*387f9dfdSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License");
5*387f9dfdSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License.
6*387f9dfdSAndroid Build Coastguard WorkerYou may obtain a copy of the License at
7*387f9dfdSAndroid Build Coastguard Worker
8*387f9dfdSAndroid Build Coastguard Workerhttp://www.apache.org/licenses/LICENSE-2.0
9*387f9dfdSAndroid Build Coastguard Worker
10*387f9dfdSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software
11*387f9dfdSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS,
12*387f9dfdSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*387f9dfdSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and
14*387f9dfdSAndroid Build Coastguard Workerlimitations under the License.
15*387f9dfdSAndroid Build Coastguard Worker]]
16*387f9dfdSAndroid Build Coastguard Workerlocal TracerPipe = class("TracerPipe")
17*387f9dfdSAndroid Build Coastguard Worker
18*387f9dfdSAndroid Build Coastguard WorkerTracerPipe.static.TRACEFS = "/sys/kernel/debug/tracing"
19*387f9dfdSAndroid Build Coastguard WorkerTracerPipe.static.fields = "%s+(.-)%-(%d+)%s+%[(%d+)%]%s+(....)%s+([%d%.]+):.-:%s+(.+)"
20*387f9dfdSAndroid Build Coastguard Worker
21*387f9dfdSAndroid Build Coastguard Workerfunction TracerPipe:close()
22*387f9dfdSAndroid Build Coastguard Worker  if self.pipe ~= nil then
23*387f9dfdSAndroid Build Coastguard Worker    self.pipe:close()
24*387f9dfdSAndroid Build Coastguard Worker  end
25*387f9dfdSAndroid Build Coastguard Workerend
26*387f9dfdSAndroid Build Coastguard Worker
27*387f9dfdSAndroid Build Coastguard Workerfunction TracerPipe:open()
28*387f9dfdSAndroid Build Coastguard Worker  if self.pipe == nil then
29*387f9dfdSAndroid Build Coastguard Worker    self.pipe = assert(io.open(TracerPipe.TRACEFS .. "/trace_pipe"))
30*387f9dfdSAndroid Build Coastguard Worker  end
31*387f9dfdSAndroid Build Coastguard Worker  return self.pipe
32*387f9dfdSAndroid Build Coastguard Workerend
33*387f9dfdSAndroid Build Coastguard Worker
34*387f9dfdSAndroid Build Coastguard Workerfunction TracerPipe:readline()
35*387f9dfdSAndroid Build Coastguard Worker  return self:open():read()
36*387f9dfdSAndroid Build Coastguard Workerend
37*387f9dfdSAndroid Build Coastguard Worker
38*387f9dfdSAndroid Build Coastguard Workerfunction TracerPipe:trace_fields()
39*387f9dfdSAndroid Build Coastguard Worker  while true do
40*387f9dfdSAndroid Build Coastguard Worker    local line = self:readline()
41*387f9dfdSAndroid Build Coastguard Worker    if not line and self.nonblocking then
42*387f9dfdSAndroid Build Coastguard Worker      return nil
43*387f9dfdSAndroid Build Coastguard Worker    end
44*387f9dfdSAndroid Build Coastguard Worker
45*387f9dfdSAndroid Build Coastguard Worker    if not line:starts("CPU:") then
46*387f9dfdSAndroid Build Coastguard Worker      local task, pid, cpu, flags, ts, msg = line:match(TracerPipe.fields)
47*387f9dfdSAndroid Build Coastguard Worker      if task ~= nil then
48*387f9dfdSAndroid Build Coastguard Worker        return task, tonumber(pid), tonumber(cpu), flags, tonumber(ts), msg
49*387f9dfdSAndroid Build Coastguard Worker      end
50*387f9dfdSAndroid Build Coastguard Worker    end
51*387f9dfdSAndroid Build Coastguard Worker  end
52*387f9dfdSAndroid Build Coastguard Workerend
53*387f9dfdSAndroid Build Coastguard Worker
54*387f9dfdSAndroid Build Coastguard Workerfunction TracerPipe:initialize(nonblocking)
55*387f9dfdSAndroid Build Coastguard Worker  self.nonblocking = nonblocking
56*387f9dfdSAndroid Build Coastguard Workerend
57*387f9dfdSAndroid Build Coastguard Worker
58*387f9dfdSAndroid Build Coastguard Workerreturn TracerPipe
59