1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 /* SpiderMonkey TraceLogger APIs. */
8 #ifndef js_TraceLoggerAPI_h
9 #define js_TraceLoggerAPI_h
13 #include "js/TypeDecls.h"
18 }; // namespace mozilla
22 // Used to lock any tracelogger activities, and consequently, will also block
23 // any further JS execution when a thread hits an atomic tracelogger activity
24 // such as payload creation.
25 class AutoTraceLoggerLockGuard
{
27 AutoTraceLoggerLockGuard();
28 ~AutoTraceLoggerLockGuard();
31 // An implementation type must be defined in order to gather data using the
32 // TraceLoggerCollectorBuffer. Each implementation must define the type that is
33 // being collected in the buffer, along with a static method that is used to
34 // actually write into the buffer from the tracelogger.
35 struct TraceLoggerDictionaryImpl
{
36 using ImplType
= char;
37 static size_t NextChunk(JSContext
* cx
, size_t* dataIndex
, ImplType buffer
[],
41 struct TraceLoggerIdImpl
{
42 using ImplType
= uint32_t;
43 static size_t NextChunk(JSContext
* cx
, size_t* dataIndex
, ImplType buffer
[],
47 struct TraceLoggerLineNoImpl
{
48 using ImplType
= int32_t;
49 static size_t NextChunk(JSContext
* cx
, size_t* dataIndex
, ImplType buffer
[],
53 struct TraceLoggerColNoImpl
{
54 using ImplType
= int32_t;
55 static size_t NextChunk(JSContext
* cx
, size_t* dataIndex
, ImplType buffer
[],
59 struct TraceLoggerTimeStampImpl
{
60 using ImplType
= mozilla::TimeStamp
;
61 static size_t NextChunk(JSContext
* cx
, size_t* dataIndex
, ImplType buffer
[],
65 struct TraceLoggerDurationImpl
{
66 using ImplType
= double;
67 static size_t NextChunk(JSContext
* cx
, size_t* dataIndex
, ImplType buffer
[],
71 // Buffer that is used to retrieve tracelogger data in fixed size chunks so that
72 // allocation of a large array is not necessary. The TraceLoggerCollectorBuffer
73 // class will manage an internal state which points to the next data index being
74 // collected. Each call to NextChunk will also clobber the internal buffer used
77 class TraceLoggerCollectorBuffer
{
78 using ImplType
= typename
T::ImplType
;
83 Iterator(ImplType
* buffer
, size_t index
)
84 : iteratorIndex(index
), buf(buffer
) {}
86 Iterator
operator++() {
91 bool operator!=(const Iterator
& other
) const {
92 return iteratorIndex
!= other
.iteratorIndex
;
95 ImplType
operator*() const { return buf
[iteratorIndex
]; }
102 explicit TraceLoggerCollectorBuffer(AutoTraceLoggerLockGuard
& lockGuard
,
103 JSContext
* cx
= nullptr,
104 size_t length
= 4096)
105 : cx_(cx
), length_(length
), dataIndex_(0), bufferIndex_(0) {
106 buffer_
= js_pod_malloc
<ImplType
>(length
);
109 ~TraceLoggerCollectorBuffer() { js_free(buffer_
); }
111 Iterator
begin() const { return Iterator(buffer_
, 0); }
113 Iterator
end() const { return Iterator(buffer_
, bufferIndex_
); }
115 ImplType
* internalBuffer() const { return buffer_
; }
118 bufferIndex_
= T::NextChunk(cx_
, &dataIndex_
, buffer_
, length_
);
119 return (bufferIndex_
!= 0) ? true : false;
130 #ifdef JS_TRACE_LOGGING
132 // Initialize the trace logger. This must be called before using any of the
133 // other trace logging functions.
134 extern JS_PUBLIC_API
bool InitTraceLogger();
136 // Return whether the trace logger is supported in this browser session.
137 extern JS_PUBLIC_API
bool TraceLoggerSupported();
139 // Begin trace logging events. This will activate some of the
140 // textId's for various events and set the global option
141 // JSJITCOMPILER_ENABLE_TRACELOGGER to true.
142 // This does nothing except return if the trace logger is already active.
143 extern JS_PUBLIC_API
void StartTraceLogger(JSContext
* cx
);
145 // Stop trace logging events. All textId's will be set to false, and the
146 // global JSJITCOMPILER_ENABLE_TRACELOGGER will be set to false.
147 // This does nothing except return if the trace logger is not active.
148 extern JS_PUBLIC_API
void StopTraceLogger(JSContext
* cx
);
150 // Clear and free any event data that was recorded by the trace logger.
151 extern JS_PUBLIC_API
void ResetTraceLogger(void);
153 // Spew trace logger statistics.
154 extern JS_PUBLIC_API
void SpewTraceLoggerThread(JSContext
* cx
);
156 // Spew trace logger statistics.
157 extern JS_PUBLIC_API
void SpewTraceLoggerForCurrentProcess();
160 // Define empty inline functions for when trace logging compilation is not
161 // enabled. TraceLogging.cpp will not be built in that case so we need to
162 // provide something for any routines that reference these.
163 inline bool InitTraceLogger() { return true; }
164 inline bool TraceLoggerSupported() { return false; }
165 inline void StartTraceLogger(JSContext
* cx
) {}
166 inline void StopTraceLogger(JSContext
* cx
) {}
167 inline void ResetTraceLogger(void) {}
168 inline void SpewTraceLoggerThread(JSContext
* cx
) {}
169 inline void SpewTraceLoggerForCurrentProcess() {}
170 inline size_t TraceLoggerDictionaryImpl::NextChunk(JSContext
* cx
,
176 inline size_t TraceLoggerIdImpl::NextChunk(JSContext
* cx
, size_t* dataIndex
,
181 inline size_t TraceLoggerTimeStampImpl::NextChunk(JSContext
* cx
,
187 inline size_t TraceLoggerDurationImpl::NextChunk(JSContext
* cx
,
193 inline size_t TraceLoggerLineNoImpl::NextChunk(JSContext
* cx
, size_t* dataIndex
,
198 inline size_t TraceLoggerColNoImpl::NextChunk(JSContext
* cx
, size_t* dataIndex
,
203 inline AutoTraceLoggerLockGuard::AutoTraceLoggerLockGuard() {}
204 inline AutoTraceLoggerLockGuard::~AutoTraceLoggerLockGuard() {}
206 using TraceLoggerDictionaryBuffer
=
207 TraceLoggerCollectorBuffer
<JS::TraceLoggerDictionaryImpl
>;
208 using TraceLoggerIdBuffer
= TraceLoggerCollectorBuffer
<JS::TraceLoggerIdImpl
>;
209 using TraceLoggerTimeStampBuffer
=
210 TraceLoggerCollectorBuffer
<JS::TraceLoggerTimeStampImpl
>;
211 using TraceLoggerDurationBuffer
=
212 TraceLoggerCollectorBuffer
<JS::TraceLoggerDurationImpl
>;
213 using TraceLoggerLineNoBuffer
=
214 TraceLoggerCollectorBuffer
<JS::TraceLoggerLineNoImpl
>;
215 using TraceLoggerColNoBuffer
=
216 TraceLoggerCollectorBuffer
<JS::TraceLoggerColNoImpl
>;
219 #endif /* js_TraceLoggerAPI_h */