michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim:set ts=2 sw=2 sts=2 et cindent: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef TRACED_TASK_COMMON_H michael@0: #define TRACED_TASK_COMMON_H michael@0: michael@0: #include "base/task.h" michael@0: #include "GeckoTaskTracer.h" michael@0: #include "nsCOMPtr.h" michael@0: #include "nsThreadUtils.h" michael@0: michael@0: namespace mozilla { michael@0: namespace tasktracer { michael@0: michael@0: class TracedTaskCommon michael@0: { michael@0: public: michael@0: TracedTaskCommon(); michael@0: virtual ~TracedTaskCommon() {} michael@0: michael@0: protected: michael@0: void Init(); michael@0: michael@0: // Sets up the metadata on the current thread's TraceInfo for this task. michael@0: // After Run(), ClearTraceInfo is called to reset the metadata. michael@0: void SetTraceInfo(); michael@0: void ClearTraceInfo(); michael@0: michael@0: // Its own task Id, an unique number base on its thread Id and a last unique michael@0: // task Id stored in its TraceInfo. michael@0: uint64_t mTaskId; michael@0: michael@0: uint64_t mSourceEventId; michael@0: SourceEventType mSourceEventType; michael@0: }; michael@0: michael@0: class TracedRunnable : public TracedTaskCommon michael@0: , public nsRunnable michael@0: { michael@0: public: michael@0: NS_DECL_NSIRUNNABLE michael@0: michael@0: TracedRunnable(nsIRunnable* aOriginalObj); michael@0: michael@0: private: michael@0: virtual ~TracedRunnable() {} michael@0: michael@0: nsCOMPtr mOriginalObj; michael@0: }; michael@0: michael@0: class TracedTask : public TracedTaskCommon michael@0: , public Task michael@0: { michael@0: public: michael@0: TracedTask(Task* aOriginalObj); michael@0: ~TracedTask() michael@0: { michael@0: if (mOriginalObj) { michael@0: delete mOriginalObj; michael@0: mOriginalObj = nullptr; michael@0: } michael@0: } michael@0: michael@0: virtual void Run(); michael@0: michael@0: private: michael@0: Task* mOriginalObj; michael@0: }; michael@0: michael@0: // FakeTracedTask is for tracking events that are not directly dispatched from michael@0: // their parents, e.g. The timer events. michael@0: class FakeTracedTask : public TracedTaskCommon michael@0: { michael@0: public: michael@0: FakeTracedTask() : TracedTaskCommon() {} michael@0: FakeTracedTask(int* aVptr); michael@0: FakeTracedTask(const FakeTracedTask& aTask); michael@0: void BeginFakeTracedTask(); michael@0: void EndFakeTracedTask(); michael@0: }; michael@0: michael@0: class AutoRunFakeTracedTask michael@0: { michael@0: public: michael@0: AutoRunFakeTracedTask(FakeTracedTask* aFakeTracedTask); michael@0: ~AutoRunFakeTracedTask(); michael@0: private: michael@0: FakeTracedTask mFakeTracedTask; michael@0: bool mInitialized; michael@0: }; michael@0: michael@0: } // namespace tasktracer michael@0: } // namespace mozilla michael@0: michael@0: #endif