mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Bug 1325526 - Remove IPC message overhead for TaskTracer being disabled. r=cyu
This commit is contained in:
parent
a73e3b7ea9
commit
05cd0a68ef
@ -20,6 +20,11 @@
|
||||
|
||||
#ifdef MOZ_TASK_TRACER
|
||||
using namespace mozilla::tasktracer;
|
||||
|
||||
#define MSG_HEADER_SZ (GetOrCreateTraceInfo() == nullptr ? \
|
||||
sizeof(Header) : sizeof(HeaderTaskTracer))
|
||||
#else
|
||||
#define MSG_HEADER_SZ sizeof(Header)
|
||||
#endif
|
||||
|
||||
namespace IPC {
|
||||
@ -31,23 +36,27 @@ Message::~Message() {
|
||||
}
|
||||
|
||||
Message::Message()
|
||||
: Pickle(sizeof(Header)) {
|
||||
: Pickle(MSG_HEADER_SZ) {
|
||||
MOZ_COUNT_CTOR(IPC::Message);
|
||||
header()->routing = header()->type = header()->flags = 0;
|
||||
#if defined(OS_POSIX)
|
||||
header()->num_fds = 0;
|
||||
#endif
|
||||
#ifdef MOZ_TASK_TRACER
|
||||
GetCurTraceInfo(&header()->source_event_id,
|
||||
&header()->parent_task_id,
|
||||
&header()->source_event_type);
|
||||
if (UseTaskTracerHeader()) {
|
||||
header()->flags |= TASKTRACER_BIT;
|
||||
HeaderTaskTracer* _header = static_cast<HeaderTaskTracer*>(header());
|
||||
GetCurTraceInfo(&_header->source_event_id,
|
||||
&_header->parent_task_id,
|
||||
&_header->source_event_type);
|
||||
}
|
||||
#endif
|
||||
InitLoggingVariables();
|
||||
}
|
||||
|
||||
Message::Message(int32_t routing_id, msgid_t type, NestedLevel nestedLevel, PriorityValue priority,
|
||||
MessageCompression compression, const char* const aName)
|
||||
: Pickle(sizeof(Header)) {
|
||||
: Pickle(MSG_HEADER_SZ) {
|
||||
MOZ_COUNT_CTOR(IPC::Message);
|
||||
header()->routing = routing_id;
|
||||
header()->type = type;
|
||||
@ -68,15 +77,27 @@ Message::Message(int32_t routing_id, msgid_t type, NestedLevel nestedLevel, Prio
|
||||
header()->cookie = 0;
|
||||
#endif
|
||||
#ifdef MOZ_TASK_TRACER
|
||||
GetCurTraceInfo(&header()->source_event_id,
|
||||
&header()->parent_task_id,
|
||||
&header()->source_event_type);
|
||||
if (UseTaskTracerHeader()) {
|
||||
header()->flags |= TASKTRACER_BIT;
|
||||
HeaderTaskTracer* _header = static_cast<HeaderTaskTracer*>(header());
|
||||
GetCurTraceInfo(&_header->source_event_id,
|
||||
&_header->parent_task_id,
|
||||
&_header->source_event_type);
|
||||
}
|
||||
#endif
|
||||
InitLoggingVariables(aName);
|
||||
}
|
||||
|
||||
#ifndef MOZ_TASK_TRACER
|
||||
#define MSG_HEADER_SZ_DATA sizeof(Header)
|
||||
#else
|
||||
#define MSG_HEADER_SZ_DATA \
|
||||
(reinterpret_cast<const Header*>(data)->flags & TASKTRACER_BIT ? \
|
||||
sizeof(HeaderTaskTracer) : sizeof(Header))
|
||||
#endif
|
||||
|
||||
Message::Message(const char* data, int data_len)
|
||||
: Pickle(sizeof(Header), data, data_len)
|
||||
: Pickle(MSG_HEADER_SZ_DATA, data, data_len)
|
||||
{
|
||||
MOZ_COUNT_CTOR(IPC::Message);
|
||||
InitLoggingVariables();
|
||||
@ -152,31 +173,44 @@ void *MessageTask() {
|
||||
|
||||
void
|
||||
Message::TaskTracerDispatch() {
|
||||
header()->task_id = GenNewUniqueTaskId();
|
||||
uintptr_t* vtab = reinterpret_cast<uintptr_t*>(&MessageTask);
|
||||
LogVirtualTablePtr(header()->task_id,
|
||||
header()->source_event_id,
|
||||
vtab);
|
||||
LogDispatch(header()->task_id,
|
||||
header()->parent_task_id,
|
||||
header()->source_event_id,
|
||||
header()->source_event_type);
|
||||
if (header()->flags & TASKTRACER_BIT) {
|
||||
HeaderTaskTracer* _header = static_cast<HeaderTaskTracer*>(header());
|
||||
_header->task_id = GenNewUniqueTaskId();
|
||||
uintptr_t* vtab = reinterpret_cast<uintptr_t*>(&MessageTask);
|
||||
LogVirtualTablePtr(_header->task_id,
|
||||
_header->source_event_id,
|
||||
vtab);
|
||||
LogDispatch(_header->task_id,
|
||||
_header->parent_task_id,
|
||||
_header->source_event_id,
|
||||
_header->source_event_type);
|
||||
}
|
||||
}
|
||||
|
||||
Message::AutoTaskTracerRun::AutoTaskTracerRun(Message& aMsg)
|
||||
: mMsg(aMsg)
|
||||
, mTaskId(mMsg.header()->task_id)
|
||||
, mSourceEventId(mMsg.header()->source_event_id) {
|
||||
LogBegin(mMsg.header()->task_id,
|
||||
mMsg.header()->source_event_id);
|
||||
SetCurTraceInfo(mMsg.header()->source_event_id,
|
||||
mMsg.header()->task_id,
|
||||
mMsg.header()->source_event_type);
|
||||
, mTaskId(0)
|
||||
, mSourceEventId(0) {
|
||||
if (mMsg.header()->flags & TASKTRACER_BIT) {
|
||||
const HeaderTaskTracer* _header =
|
||||
static_cast<HeaderTaskTracer*>(mMsg.header());
|
||||
LogBegin(_header->task_id,
|
||||
_header->source_event_id);
|
||||
SetCurTraceInfo(_header->source_event_id,
|
||||
_header->task_id,
|
||||
_header->source_event_type);
|
||||
mTaskId = _header->task_id;
|
||||
mSourceEventId = _header->source_event_id;
|
||||
} else {
|
||||
SetCurTraceInfo(0, 0, SourceEventType::Unknown);
|
||||
}
|
||||
}
|
||||
|
||||
Message::AutoTaskTracerRun::~AutoTaskTracerRun() {
|
||||
AddLabel("IPC Message %s", mMsg.name());
|
||||
LogEnd(mTaskId, mSourceEventId);
|
||||
if (mTaskId) {
|
||||
AddLabel("IPC Message %s", mMsg.name());
|
||||
LogEnd(mTaskId, mSourceEventId);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -232,11 +232,24 @@ class Message : public Pickle {
|
||||
static void Log(const Message* msg, std::wstring* l) {
|
||||
}
|
||||
|
||||
static int HeaderSizeFromData(const char* range_start,
|
||||
const char* range_end) {
|
||||
#ifdef MOZ_TASK_TRACER
|
||||
return ((static_cast<unsigned int>(range_end - range_start) >= sizeof(Header)) &&
|
||||
(reinterpret_cast<const Header*>(range_start)->flags &
|
||||
TASKTRACER_BIT)) ?
|
||||
sizeof(HeaderTaskTracer) : sizeof(Header);
|
||||
#else
|
||||
return sizeof(Header);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Figure out how big the message starting at range_start is. Returns 0 if
|
||||
// there's no enough data to determine (i.e., if [range_start, range_end) does
|
||||
// not contain enough of the message header to know the size).
|
||||
static uint32_t MessageSize(const char* range_start, const char* range_end) {
|
||||
return Pickle::MessageSize(sizeof(Header), range_start, range_end);
|
||||
return Pickle::MessageSize(HeaderSizeFromData(range_start, range_end),
|
||||
range_start, range_end);
|
||||
}
|
||||
|
||||
#if defined(OS_POSIX)
|
||||
@ -300,6 +313,9 @@ class Message : public Pickle {
|
||||
COMPRESS_BIT = 0x0080,
|
||||
COMPRESSALL_BIT = 0x0100,
|
||||
CONSTRUCTOR_BIT = 0x0200,
|
||||
#ifdef MOZ_TASK_TRACER
|
||||
TASKTRACER_BIT = 0x0400,
|
||||
#endif
|
||||
};
|
||||
|
||||
struct Header : Pickle::Header {
|
||||
@ -323,20 +339,42 @@ class Message : public Pickle {
|
||||
uint32_t interrupt_local_stack_depth;
|
||||
// Sequence number
|
||||
int32_t seqno;
|
||||
};
|
||||
|
||||
#ifdef MOZ_TASK_TRACER
|
||||
/**
|
||||
* The type is used as headers of Messages only if TaskTracer is
|
||||
* enabled, or type |Header| would be used instead.
|
||||
*/
|
||||
struct HeaderTaskTracer : public Header {
|
||||
uint64_t task_id;
|
||||
uint64_t source_event_id;
|
||||
uint64_t parent_task_id;
|
||||
mozilla::tasktracer::SourceEventType source_event_type;
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_TASK_TRACER
|
||||
bool UseTaskTracerHeader() const {
|
||||
return sizeof(HeaderTaskTracer) == (size() - payload_size());
|
||||
}
|
||||
|
||||
Header* header() {
|
||||
return UseTaskTracerHeader() ?
|
||||
headerT<HeaderTaskTracer>() : headerT<Header>();
|
||||
}
|
||||
const Header* header() const {
|
||||
return UseTaskTracerHeader() ?
|
||||
headerT<HeaderTaskTracer>() : headerT<Header>();
|
||||
}
|
||||
#else
|
||||
Header* header() {
|
||||
return headerT<Header>();
|
||||
}
|
||||
const Header* header() const {
|
||||
return headerT<Header>();
|
||||
}
|
||||
#endif
|
||||
|
||||
void InitLoggingVariables(const char* const name="???");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user