xref: /aosp_15_r20/external/libchrome-gestures/src/trace_marker.cc (revision aed3e5085e770be5b69ce25295ecf6ddf906af95)
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 Worker void 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 Worker void 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 Worker void 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 Worker TraceMarker* 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 Worker void 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 Worker TraceMarker::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 Worker TraceMarker::~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 Worker bool 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 Worker bool 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 Worker bool 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