1*aed3e508SAndroid Build Coastguard Worker // Copyright 2012 The ChromiumOS Authors 2*aed3e508SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*aed3e508SAndroid Build Coastguard Worker // found in the LICENSE file. 4*aed3e508SAndroid Build Coastguard Worker 5*aed3e508SAndroid Build Coastguard Worker #include "include/trace_marker.h" 6*aed3e508SAndroid Build Coastguard Worker 7*aed3e508SAndroid Build Coastguard Worker #include <fcntl.h> 8*aed3e508SAndroid Build Coastguard Worker #include <mntent.h> 9*aed3e508SAndroid Build Coastguard Worker #include <stdio.h> 10*aed3e508SAndroid Build Coastguard Worker #include <stdlib.h> 11*aed3e508SAndroid Build Coastguard Worker #include <string.h> 12*aed3e508SAndroid Build Coastguard Worker #include <unistd.h> 13*aed3e508SAndroid Build Coastguard Worker 14*aed3e508SAndroid Build Coastguard Worker #include "include/eintr_wrapper.h" 15*aed3e508SAndroid Build Coastguard Worker #include "include/logging.h" 16*aed3e508SAndroid Build Coastguard Worker 17*aed3e508SAndroid Build Coastguard Worker namespace gestures { 18*aed3e508SAndroid Build Coastguard Worker CreateTraceMarker()19*aed3e508SAndroid Build Coastguard Workervoid TraceMarker::CreateTraceMarker() { 20*aed3e508SAndroid Build Coastguard Worker if (!trace_marker_) 21*aed3e508SAndroid Build Coastguard Worker trace_marker_ = new TraceMarker(); 22*aed3e508SAndroid Build Coastguard Worker trace_marker_count_++; 23*aed3e508SAndroid Build Coastguard Worker } 24*aed3e508SAndroid Build Coastguard Worker DeleteTraceMarker()25*aed3e508SAndroid Build Coastguard Workervoid TraceMarker::DeleteTraceMarker() { 26*aed3e508SAndroid Build Coastguard Worker if (trace_marker_count_ == 1) { 27*aed3e508SAndroid Build Coastguard Worker delete trace_marker_; 28*aed3e508SAndroid Build Coastguard Worker trace_marker_ = nullptr; 29*aed3e508SAndroid Build Coastguard Worker } 30*aed3e508SAndroid Build Coastguard Worker trace_marker_count_--; 31*aed3e508SAndroid Build Coastguard Worker if (trace_marker_count_ < 0) 32*aed3e508SAndroid Build Coastguard Worker trace_marker_count_ = 0; 33*aed3e508SAndroid Build Coastguard Worker } 34*aed3e508SAndroid Build Coastguard Worker StaticTraceWrite(const char * str)35*aed3e508SAndroid Build Coastguard Workervoid TraceMarker::StaticTraceWrite(const char* str) { 36*aed3e508SAndroid Build Coastguard Worker if (TraceMarker::GetTraceMarker()) 37*aed3e508SAndroid Build Coastguard Worker TraceMarker::GetTraceMarker()->TraceWrite(str); 38*aed3e508SAndroid Build Coastguard Worker else 39*aed3e508SAndroid Build Coastguard Worker Err("No TraceMarker Object"); 40*aed3e508SAndroid Build Coastguard Worker } 41*aed3e508SAndroid Build Coastguard Worker GetTraceMarker()42*aed3e508SAndroid Build Coastguard WorkerTraceMarker* TraceMarker::GetTraceMarker() { 43*aed3e508SAndroid Build Coastguard Worker return trace_marker_; 44*aed3e508SAndroid Build Coastguard Worker } 45*aed3e508SAndroid Build Coastguard Worker TraceWrite(const char * str)46*aed3e508SAndroid Build Coastguard Workervoid TraceMarker::TraceWrite(const char* str) { 47*aed3e508SAndroid Build Coastguard Worker if (fd_ == -1) { 48*aed3e508SAndroid Build Coastguard Worker Err("Trace_marker does not open"); 49*aed3e508SAndroid Build Coastguard Worker return; 50*aed3e508SAndroid Build Coastguard Worker } 51*aed3e508SAndroid Build Coastguard Worker ssize_t len = strlen(str); 52*aed3e508SAndroid Build Coastguard Worker ssize_t get = write(fd_, str, len); 53*aed3e508SAndroid Build Coastguard Worker if (get == -1) 54*aed3e508SAndroid Build Coastguard Worker Err("Write failed"); 55*aed3e508SAndroid Build Coastguard Worker else if (get != len) 56*aed3e508SAndroid Build Coastguard Worker Err("Message too long!"); 57*aed3e508SAndroid Build Coastguard Worker } 58*aed3e508SAndroid Build Coastguard Worker TraceMarker()59*aed3e508SAndroid Build Coastguard WorkerTraceMarker::TraceMarker() : fd_(-1) { 60*aed3e508SAndroid Build Coastguard Worker if (!OpenTraceMarker()) 61*aed3e508SAndroid Build Coastguard Worker Log("Cannot open trace_marker"); 62*aed3e508SAndroid Build Coastguard Worker } 63*aed3e508SAndroid Build Coastguard Worker ~TraceMarker()64*aed3e508SAndroid Build Coastguard WorkerTraceMarker::~TraceMarker() { 65*aed3e508SAndroid Build Coastguard Worker if (fd_ != -1) 66*aed3e508SAndroid Build Coastguard Worker close(fd_); 67*aed3e508SAndroid Build Coastguard Worker } 68*aed3e508SAndroid Build Coastguard Worker 69*aed3e508SAndroid Build Coastguard Worker TraceMarker* TraceMarker::trace_marker_ = nullptr; 70*aed3e508SAndroid Build Coastguard Worker int TraceMarker::trace_marker_count_ = 0; 71*aed3e508SAndroid Build Coastguard Worker FindDebugfs(const char ** ret) const72*aed3e508SAndroid Build Coastguard Workerbool TraceMarker::FindDebugfs(const char** ret) const { 73*aed3e508SAndroid Build Coastguard Worker FILE* mounts = setmntent("/proc/mounts", "r"); 74*aed3e508SAndroid Build Coastguard Worker if (mounts == nullptr) 75*aed3e508SAndroid Build Coastguard Worker return false; 76*aed3e508SAndroid Build Coastguard Worker 77*aed3e508SAndroid Build Coastguard Worker while (true) { 78*aed3e508SAndroid Build Coastguard Worker struct mntent* entry = getmntent(mounts); 79*aed3e508SAndroid Build Coastguard Worker if (entry == nullptr) { 80*aed3e508SAndroid Build Coastguard Worker fclose(mounts); 81*aed3e508SAndroid Build Coastguard Worker return false; 82*aed3e508SAndroid Build Coastguard Worker } 83*aed3e508SAndroid Build Coastguard Worker if (strcmp("debugfs", entry->mnt_type) == 0) { 84*aed3e508SAndroid Build Coastguard Worker *ret = entry->mnt_dir; 85*aed3e508SAndroid Build Coastguard Worker break; 86*aed3e508SAndroid Build Coastguard Worker } 87*aed3e508SAndroid Build Coastguard Worker } 88*aed3e508SAndroid Build Coastguard Worker fclose(mounts); 89*aed3e508SAndroid Build Coastguard Worker return true; 90*aed3e508SAndroid Build Coastguard Worker } 91*aed3e508SAndroid Build Coastguard Worker FindTraceMarker(char ** ret) const92*aed3e508SAndroid Build Coastguard Workerbool TraceMarker::FindTraceMarker(char** ret) const { 93*aed3e508SAndroid Build Coastguard Worker const char* debugfs = nullptr; 94*aed3e508SAndroid Build Coastguard Worker if (!FindDebugfs(&debugfs)) 95*aed3e508SAndroid Build Coastguard Worker return false; 96*aed3e508SAndroid Build Coastguard Worker if (asprintf(ret, "%s/tracing/trace_marker", debugfs) == -1) { 97*aed3e508SAndroid Build Coastguard Worker *ret = nullptr; 98*aed3e508SAndroid Build Coastguard Worker return false; 99*aed3e508SAndroid Build Coastguard Worker } 100*aed3e508SAndroid Build Coastguard Worker return true; 101*aed3e508SAndroid Build Coastguard Worker } 102*aed3e508SAndroid Build Coastguard Worker OpenTraceMarker()103*aed3e508SAndroid Build Coastguard Workerbool TraceMarker::OpenTraceMarker() { 104*aed3e508SAndroid Build Coastguard Worker char* trace_marker_filename = nullptr; 105*aed3e508SAndroid Build Coastguard Worker if (!FindTraceMarker(&trace_marker_filename)) 106*aed3e508SAndroid Build Coastguard Worker return false; 107*aed3e508SAndroid Build Coastguard Worker fd_ = HANDLE_EINTR(open(trace_marker_filename, O_WRONLY)); 108*aed3e508SAndroid Build Coastguard Worker free(trace_marker_filename); 109*aed3e508SAndroid Build Coastguard Worker if (fd_ == -1) 110*aed3e508SAndroid Build Coastguard Worker return false; 111*aed3e508SAndroid Build Coastguard Worker return true; 112*aed3e508SAndroid Build Coastguard Worker } 113*aed3e508SAndroid Build Coastguard Worker } // namespace gestures 114