File: WidgetTraceEvent.cpp

package info (click to toggle)
thunderbird 1%3A52.8.0-1~deb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 1,710,120 kB
  • sloc: cpp: 5,081,109; ansic: 2,051,982; python: 458,727; java: 241,615; xml: 193,367; asm: 178,649; sh: 81,881; makefile: 24,703; perl: 16,874; objc: 4,389; yacc: 1,816; ada: 1,697; lex: 1,257; pascal: 1,251; cs: 879; exp: 499; php: 436; lisp: 258; awk: 152; sed: 51; ruby: 47; csh: 27
file content (96 lines) | stat: -rw-r--r-- 2,141 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* 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/. */

#include "mozilla/WidgetTraceEvent.h"
#include "mozilla/StaticPtr.h"
#include "nsThreadUtils.h"
#include <mozilla/CondVar.h>
#include <mozilla/Mutex.h>

using mozilla::CondVar;
using mozilla::Mutex;
using mozilla::MutexAutoLock;

namespace mozilla {
  class TracerRunnable : public Runnable {
    public:
      TracerRunnable() {
        mTracerLock = new Mutex("TracerRunnable");
        mTracerCondVar = new CondVar(*mTracerLock, "TracerRunnable");
        mMainThread = do_GetMainThread();
      }

      ~TracerRunnable() {
        delete mTracerCondVar;
        delete mTracerLock;
        mTracerLock = nullptr;
        mTracerCondVar = nullptr;
      }

      virtual nsresult Run() {
        MutexAutoLock lock(*mTracerLock);
        mHasRun = true;
        mTracerCondVar->Notify();
        return NS_OK;
      }

      bool Fire() {
        if (!mTracerLock || !mTracerCondVar) {
          return false;
        }

        MutexAutoLock lock(*mTracerLock);
        mHasRun = false;
        mMainThread->Dispatch(this, NS_DISPATCH_NORMAL);
        while (!mHasRun) {
          mTracerCondVar->Wait();
        }
        return true;
      }

      void Signal() {
        MutexAutoLock lock(*mTracerLock);
        mHasRun = true;
        mTracerCondVar->Notify();
      }

    private:
      Mutex* mTracerLock;
      CondVar* mTracerCondVar;
      bool mHasRun;
      nsCOMPtr<nsIThread> mMainThread;
  };

  StaticRefPtr<TracerRunnable> sTracerRunnable;

  bool InitWidgetTracing()
  {
    if (!sTracerRunnable) {
      sTracerRunnable = new TracerRunnable();
    }
    return true;
  }

  void CleanUpWidgetTracing()
  {
    sTracerRunnable = nullptr;
  }

  bool FireAndWaitForTracerEvent()
  {
    if (sTracerRunnable) {
      return sTracerRunnable->Fire();
    }

    return false;
  }

  void SignalTracerThread()
  {
    if (sTracerRunnable) {
      return sTracerRunnable->Signal();
    }
  }
} // namespace mozilla