lts/src/tracing/node_trace_writer.h
#ifndef SRC_TRACING_NODE_TRACE_WRITER_H_
#define SRC_TRACING_NODE_TRACE_WRITER_H_
#include <sstream>
#include <queue>
#include "libplatform/v8-tracing.h"
#include "tracing/agent.h"
#include "uv.h"
namespace node {
namespace tracing {
using v8::platform::tracing::TraceObject;
using v8::platform::tracing::TraceWriter;
class NodeTraceWriter : public AsyncTraceWriter {
public:
explicit NodeTraceWriter(const std::string& log_file_pattern);
~NodeTraceWriter() override;
void InitializeOnThread(uv_loop_t* loop) override;
void AppendTraceEvent(TraceObject* trace_event) override;
void Flush(bool blocking) override;
static const int kTracesPerFile = 1 << 19;
private:
struct WriteRequest {
std::string str;
int highest_request_id;
};
void AfterWrite();
void StartWrite(uv_buf_t buf);
void OpenNewFileForStreaming();
void WriteToFile(std::string&& str, int highest_request_id);
void WriteSuffix();
void FlushPrivate();
static void ExitSignalCb(uv_async_t* signal);
uv_loop_t* tracing_loop_ = nullptr;
// Triggers callback to initiate writing the contents of stream_ to disk.
uv_async_t flush_signal_;
// Triggers callback to close async objects, ending the tracing thread.
uv_async_t exit_signal_;
// Prevents concurrent R/W on state related to serialized trace data
// before it's written to disk, namely stream_ and total_traces_
// as well as json_trace_writer_.
Mutex stream_mutex_;
// Prevents concurrent R/W on state related to write requests.
// If both mutexes are locked, request_mutex_ has to be locked first.
Mutex request_mutex_;
// Allows blocking calls to Flush() to wait on a condition for
// trace events to be written to disk.
ConditionVariable request_cond_;
// Used to wait until async handles have been closed.
ConditionVariable exit_cond_;
int fd_ = -1;
uv_fs_t write_req_;
std::queue<WriteRequest> write_req_queue_;
int num_write_requests_ = 0;
int highest_request_id_completed_ = 0;
int total_traces_ = 0;
int file_num_ = 0;
std::string log_file_pattern_;
std::ostringstream stream_;
std::unique_ptr<TraceWriter> json_trace_writer_;
bool exited_ = false;
};
} // namespace tracing
} // namespace node
#endif // SRC_TRACING_NODE_TRACE_WRITER_H_