mirror of
https://github.com/quizhizhe/LiteLoaderBDS-1.16.40.git
synced 2025-06-07 12:18:11 +00:00
76 lines
2.2 KiB
C++
76 lines
2.2 KiB
C++
#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_
|