@@ -41,7 +41,7 @@ class SystemTracingFTrace {
4141 return instance;
4242 }
4343
44- inline void tracePoint (TracePointCode code, uint64_t cookie ) {
44+ inline void tracePoint (TracePointCode code, uint64_t data1 = 0 , uint64_t data2 = 0 , uint64_t data3 = 0 , uint64_t data4 = 0 ) {
4545 // ftrace disabled in runtime
4646 if (m_traceMarkerFd < 0 ) return ;
4747
@@ -103,7 +103,7 @@ class SystemTracingFTrace {
103103 case LayerFlushStart:
104104 case UpdateLayerContentBuffersStart:
105105#endif
106- beginSyncMark (code);
106+ beginSyncMark (code, data1, data2, data3, data4 );
107107 return ;
108108
109109 case VMEntryScopeEnd:
@@ -168,12 +168,12 @@ class SystemTracingFTrace {
168168
169169 case MainResourceLoadDidStartProvisional:
170170 case SubresourceLoadWillStart:
171- beginAsyncMark (code, cookie );
171+ beginAsyncMark (code, data1 );
172172 return ;
173173
174174 case MainResourceLoadDidEnd:
175175 case SubresourceLoadDidEnd:
176- endAsyncMark (code, cookie );
176+ endAsyncMark (code, data1 );
177177 return ;
178178
179179 case DisplayRefreshDispatchingToMainThread:
@@ -183,7 +183,7 @@ class SystemTracingFTrace {
183183 case SyntheticMomentumEvent:
184184 case RemoteLayerTreeScheduleRenderingUpdate:
185185 case DisplayLinkUpdate:
186- instantMark (code);
186+ instantMark (code, data1, data2, data3, data4 );
187187 return ;
188188
189189 case WTFRange:
@@ -208,45 +208,57 @@ class SystemTracingFTrace {
208208 }
209209 }
210210
211+ static bool isEnabled () {
212+ return !(instance ().m_traceMarkerFd < 0 );
213+ }
214+
211215private:
212216
213- inline void beginSyncMark (TracePointCode code) {
214- // "B|<pid>|<name>"
215- std::string message = std::string (" B|" ) + std::to_string (m_pid) + " |" + tracePointCodeName (code).characters ();
216- writeFTraceMarker (message.c_str ());
217+ inline void beginSyncMark (TracePointCode code, uint64_t data1, uint64_t data2, uint64_t data3, uint64_t data4) {
218+ // "B|<pid>|<name>|<args>"
219+ addMark (' B' , tracePointCodeName (code).spanIncludingNullTerminator (), " %" PRIu64 " ,%" PRIu64 " ,%" PRIu64 " ,%" PRIu64, data1, data2, data3, data4);
217220 }
218221
219222 inline void endSyncMark (TracePointCode code) {
220- UNUSED_PARAM (code);
221- // "E|<pid>"
222- std::string message = std::string (" E|" ) + std::to_string (m_pid);
223- writeFTraceMarker (message.c_str ());
223+ // "E|<pid>|<name>"
224+ addMark (' E' , tracePointCodeName (code).spanIncludingNullTerminator ());
224225 }
225226
226227 inline void beginAsyncMark (TracePointCode code, uint64_t cookie) {
227228 // "S|<pid>|<name>|<cookie>"
228- std::string message = std::string (" S|" ) + std::to_string (m_pid) + " |" + tracePointCodeName (code).characters () + " |" + std::to_string (cookie);
229- writeFTraceMarker (message.c_str ());
229+ addMark (' S' , tracePointCodeName (code).spanIncludingNullTerminator (), " %" PRIu64, cookie);
230230 }
231231
232232 inline void endAsyncMark (TracePointCode code, uint64_t cookie) {
233233 // "F|<pid>|<name>|<cookie>"
234- std::string message = std::string (" F|" ) + std::to_string (m_pid) + " |" + tracePointCodeName (code).characters () + " |" + std::to_string (cookie);
235- writeFTraceMarker (message.c_str ());
234+ addMark (' F' , tracePointCodeName (code).spanIncludingNullTerminator ()," %" PRIu64, cookie);
236235 }
237236
238- inline void instantMark (TracePointCode code) {
237+ inline void instantMark (TracePointCode code, uint64_t data1, uint64_t data2, uint64_t data3, uint64_t data4 ) {
239238 // "I|<pid>|<name>"
240- std::string message = std::string (" I|" ) + std::to_string (m_pid) + " |" + tracePointCodeName (code).characters ();
241- writeFTraceMarker (message.c_str ());
239+ addMark (' I' , tracePointCodeName (code).spanIncludingNullTerminator ()," %" PRIu64 " ,%" PRIu64 " ,%" PRIu64 " ,%" PRIu64, data1, data2, data3, data4);
242240 }
243241
244- inline void writeFTraceMarker (const char * message) {
242+ inline void writeFTraceMarker (const char * message, size_t len ) {
245243 RELEASE_ASSERT (m_traceMarkerFd >= 0 );
246244
245+ size_t offset = 0 ;
246+
247247 // make sure no other thread is writing at the same time
248248 std::lock_guard<std::mutex> lock (m_mutex);
249- write (m_traceMarkerFd, message, strlen (message));
249+ while (len > 0 ) {
250+ ssize_t ret;
251+
252+ do {
253+ ret = write (m_traceMarkerFd, message + offset, len);
254+ } while (ret < 0 && errno == EINTR);
255+
256+ if (ret <= 0 )
257+ break ;
258+
259+ len -= ret;
260+ offset += ret;
261+ }
250262 }
251263
252264 SystemTracingFTrace () {
@@ -490,4 +502,6 @@ class SystemTracingFTrace {
490502
491503} // namespace WTF
492504
493- #endif // USE(LINUX_FTRACE)
505+ using WTF::SystemTracingFTrace;
506+
507+ #endif // USE(LINUX_FTRACE)
0 commit comments