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