gecko-dev/tools/profiler/tasktracer/TracedTaskCommon.h
Markus Stange 95eccb68b1 Bug 1382908 - Make TaskTracer build and run again. r=billm
MozReview-Commit-ID: 8SqBWgOXc6H

--HG--
extra : rebase_source : 4b5cbb34740ebd439431188dd8c6df02eeee3969
2017-07-24 18:35:07 -04:00

132 lines
3.2 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef TRACED_TASK_COMMON_H
#define TRACED_TASK_COMMON_H
#include "GeckoTaskTracer.h"
#include "nsCOMPtr.h"
#include "nsThreadUtils.h"
namespace mozilla {
namespace tasktracer {
class TracedTaskCommon
{
public:
TracedTaskCommon();
TracedTaskCommon(const TracedTaskCommon& aSrc)
: mSourceEventType(aSrc.mSourceEventType)
, mSourceEventId(aSrc.mSourceEventId)
, mParentTaskId(aSrc.mParentTaskId)
, mTaskId(aSrc.mTaskId)
, mIsTraceInfoInit(aSrc.mIsTraceInfoInit) {}
virtual ~TracedTaskCommon();
void DispatchTask(int aDelayTimeMs = 0);
void SetTLSTraceInfo() {
if (mIsTraceInfoInit) {
DoSetTLSTraceInfo();
}
}
void GetTLSTraceInfo() {
if (IsStartLogging()) {
DoGetTLSTraceInfo();
}
}
void ClearTLSTraceInfo();
private:
void DoSetTLSTraceInfo();
void DoGetTLSTraceInfo();
protected:
void Init();
// TraceInfo of TLS will be set by the following parameters, including source
// event type, source event ID, parent task ID, and task ID of this traced
// task/runnable.
SourceEventType mSourceEventType;
uint64_t mSourceEventId;
uint64_t mParentTaskId;
uint64_t mTaskId;
bool mIsTraceInfoInit;
};
class TracedRunnable : public TracedTaskCommon
, public nsIRunnable
{
public:
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIRUNNABLE
explicit TracedRunnable(already_AddRefed<nsIRunnable>&& aOriginalObj);
private:
virtual ~TracedRunnable();
nsCOMPtr<nsIRunnable> mOriginalObj;
};
/**
* This class is used to create a logical task, without a real
* runnable.
*/
class VirtualTask : public TracedTaskCommon {
public:
VirtualTask() : TracedTaskCommon() {}
VirtualTask(const VirtualTask& aSrc) : TracedTaskCommon(aSrc) {}
/**
* Initialize the task to create an unique ID, and store other
* information.
*
* This method may be called for one or more times.
*/
void Init(uintptr_t* aVPtr = nullptr) {
TracedTaskCommon::Init();
if (aVPtr) {
extern void LogVirtualTablePtr(uint64_t aTaskId, uint64_t aSourceEventId, uintptr_t* aVptr);
LogVirtualTablePtr(mTaskId, mSourceEventId, aVPtr);
}
DispatchTask();
}
/**
* Define the life-span of a VirtualTask.
*
* VirtualTask is not a real task, goes without a runnable, it's
* instances are never dispatched and ran by event loops. This
* class used to define running time as the life-span of it's
* instance.
*/
class AutoRunTask : public AutoSaveCurTraceInfo {
VirtualTask* mTask;
void StartScope(VirtualTask *aTask);
void StopScope();
public:
explicit AutoRunTask(VirtualTask *aTask)
: AutoSaveCurTraceInfo()
, mTask(aTask) {
if (HasSavedTraceInfo()) {
StartScope(aTask);
}
}
~AutoRunTask() {
if (HasSavedTraceInfo()) {
StopScope();
}
}
};
};
} // namespace tasktracer
} // namespace mozilla
#endif