tools/profiler/TracedTaskCommon.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #include "GeckoTaskTracerImpl.h"
     8 #include "TracedTaskCommon.h"
    10 namespace mozilla {
    11 namespace tasktracer {
    13 TracedTaskCommon::TracedTaskCommon()
    14   : mSourceEventId(0)
    15   , mSourceEventType(SourceEventType::UNKNOWN)
    16 {
    17   Init();
    18 }
    20 void
    21 TracedTaskCommon::Init()
    22 {
    23   TraceInfo* info = GetOrCreateTraceInfo();
    24   NS_ENSURE_TRUE_VOID(info);
    26   mTaskId = GenNewUniqueTaskId();
    27   mSourceEventId = info->mCurTraceSourceId;
    28   mSourceEventType = info->mCurTraceSourceType;
    30   LogDispatch(mTaskId, info->mCurTaskId, mSourceEventId, mSourceEventType);
    31 }
    33 void
    34 TracedTaskCommon::SetTraceInfo()
    35 {
    36   TraceInfo* info = GetOrCreateTraceInfo();
    37   NS_ENSURE_TRUE_VOID(info);
    39   info->mCurTraceSourceId = mSourceEventId;
    40   info->mCurTraceSourceType = mSourceEventType;
    41   info->mCurTaskId = mTaskId;
    42 }
    44 void
    45 TracedTaskCommon::ClearTraceInfo()
    46 {
    47   TraceInfo* info = GetOrCreateTraceInfo();
    48   NS_ENSURE_TRUE_VOID(info);
    50   info->mCurTraceSourceId = 0;
    51   info->mCurTraceSourceType = SourceEventType::UNKNOWN;
    52   info->mCurTaskId = 0;
    53 }
    55 /**
    56  * Implementation of class TracedRunnable.
    57  */
    58 TracedRunnable::TracedRunnable(nsIRunnable* aOriginalObj)
    59   : TracedTaskCommon()
    60   , mOriginalObj(aOriginalObj)
    61 {
    62   LogVirtualTablePtr(mTaskId, mSourceEventId, *(int**)(aOriginalObj));
    63 }
    65 NS_IMETHODIMP
    66 TracedRunnable::Run()
    67 {
    68   LogBegin(mTaskId, mSourceEventId);
    70   SetTraceInfo();
    71   nsresult rv = mOriginalObj->Run();
    72   ClearTraceInfo();
    74   LogEnd(mTaskId, mSourceEventId);
    75   return rv;
    76 }
    78 /**
    79  * Implementation of class TracedTask.
    80  */
    81 TracedTask::TracedTask(Task* aOriginalObj)
    82   : TracedTaskCommon()
    83   , mOriginalObj(aOriginalObj)
    84 {
    85   LogVirtualTablePtr(mTaskId, mSourceEventId, *(int**)(aOriginalObj));
    86 }
    88 void
    89 TracedTask::Run()
    90 {
    91   LogBegin(mTaskId, mSourceEventId);
    93   SetTraceInfo();
    94   mOriginalObj->Run();
    95   ClearTraceInfo();
    97   LogEnd(mTaskId, mSourceEventId);
    98 }
   100 FakeTracedTask::FakeTracedTask(int* aVptr)
   101   : TracedTaskCommon()
   102 {
   103   LogVirtualTablePtr(mTaskId, mSourceEventId, aVptr);
   104 }
   106 FakeTracedTask::FakeTracedTask(const FakeTracedTask& aTask)
   107 {
   108   mTaskId = aTask.mTaskId;
   109   mSourceEventId = aTask.mSourceEventId;
   110   mSourceEventType = aTask.mSourceEventType;
   111 }
   113 void
   114 FakeTracedTask::BeginFakeTracedTask()
   115 {
   116   LogBegin(mTaskId, mSourceEventId);
   117   SetTraceInfo();
   118 }
   120 void
   121 FakeTracedTask::EndFakeTracedTask()
   122 {
   123   ClearTraceInfo();
   124   LogEnd(mTaskId, mSourceEventId);
   125 }
   127 AutoRunFakeTracedTask::AutoRunFakeTracedTask(FakeTracedTask* aFakeTracedTask)
   128   : mInitialized(false)
   129 {
   130   if (aFakeTracedTask) {
   131     mInitialized = true;
   132     mFakeTracedTask = *aFakeTracedTask;
   133     mFakeTracedTask.BeginFakeTracedTask();
   134   }
   135 }
   137 AutoRunFakeTracedTask::~AutoRunFakeTracedTask()
   138 {
   139   if (mInitialized) {
   140     mFakeTracedTask.EndFakeTracedTask();
   141   }
   142 }
   144 /**
   145  * CreateTracedRunnable() returns a TracedRunnable wrapping the original
   146  * nsIRunnable object, aRunnable.
   147  */
   148 already_AddRefed<nsIRunnable>
   149 CreateTracedRunnable(nsIRunnable* aRunnable)
   150 {
   151   nsCOMPtr<nsIRunnable> runnable = new TracedRunnable(aRunnable);
   152   return runnable.forget();
   153 }
   155 /**
   156  * CreateTracedTask() returns a TracedTask wrapping the original Task object,
   157  * aTask.
   158  */
   159 Task*
   160 CreateTracedTask(Task* aTask)
   161 {
   162   Task* task = new TracedTask(aTask);
   163   return task;
   164 }
   166 /**
   167  * CreateFakeTracedTask() returns a FakeTracedTask tracking the event which is
   168  * not dispatched from its parent task directly, such as timer events.
   169  */
   170 FakeTracedTask*
   171 CreateFakeTracedTask(int* aVptr)
   172 {
   173   nsAutoPtr<FakeTracedTask> task(new FakeTracedTask(aVptr));
   174   return task.forget();
   175 }
   177 } // namespace tasktracer
   178 } // namespace mozilla

mercurial