Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/xpcom/threads/MainThreadQueue.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
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/. */
6
7
#ifndef mozilla_MainThreadQueue_h
8
#define mozilla_MainThreadQueue_h
9
10
#include "mozilla/Attributes.h"
11
#include "mozilla/EventQueue.h"
12
#include "mozilla/RefPtr.h"
13
#include "mozilla/UniquePtr.h"
14
#include "nsThread.h"
15
#include "PrioritizedEventQueue.h"
16
17
namespace mozilla {
18
19
template<typename SynchronizedQueueT, typename InnerQueueT>
20
inline already_AddRefed<nsThread>
21
CreateMainThread(nsIIdlePeriod* aIdlePeriod, SynchronizedQueueT** aSynchronizedQueue = nullptr)
22
3
{
23
3
  using MainThreadQueueT = PrioritizedEventQueue<InnerQueueT>;
24
3
25
3
  auto queue = MakeUnique<MainThreadQueueT>(
26
3
    MakeUnique<InnerQueueT>(EventPriority::High),
27
3
    MakeUnique<InnerQueueT>(EventPriority::Input),
28
3
    MakeUnique<InnerQueueT>(EventPriority::Normal),
29
3
    MakeUnique<InnerQueueT>(EventPriority::Idle),
30
3
    do_AddRef(aIdlePeriod));
31
3
32
3
  MainThreadQueueT* prioritized = queue.get();
33
3
34
3
  RefPtr<SynchronizedQueueT> synchronizedQueue = new SynchronizedQueueT(std::move(queue));
35
3
36
3
  prioritized->SetMutexRef(synchronizedQueue->MutexRef());
37
3
38
3
  // Setup "main" thread
39
3
  RefPtr<nsThread> mainThread = new nsThread(WrapNotNull(synchronizedQueue), nsThread::MAIN_THREAD, 0);
40
3
41
3
#ifndef RELEASE_OR_BETA
42
3
  prioritized->SetNextIdleDeadlineRef(mainThread->NextIdleDeadlineRef());
43
3
#endif
44
3
45
3
  if (aSynchronizedQueue) {
46
0
    synchronizedQueue.forget(aSynchronizedQueue);
47
0
  }
48
3
  return mainThread.forget();
49
3
}
Unexecuted instantiation: already_AddRefed<nsThread> mozilla::CreateMainThread<mozilla::detail::SchedulerEventQueue, mozilla::LabeledEventQueue>(nsIIdlePeriod*, mozilla::detail::SchedulerEventQueue**)
Unexecuted instantiation: already_AddRefed<nsThread> mozilla::CreateMainThread<mozilla::detail::SchedulerEventQueue, mozilla::EventQueue>(nsIIdlePeriod*, mozilla::detail::SchedulerEventQueue**)
Unexecuted instantiation: already_AddRefed<nsThread> mozilla::CreateMainThread<mozilla::ThreadEventQueue<mozilla::PrioritizedEventQueue<mozilla::LabeledEventQueue> >, mozilla::LabeledEventQueue>(nsIIdlePeriod*, mozilla::ThreadEventQueue<mozilla::PrioritizedEventQueue<mozilla::LabeledEventQueue> >**)
already_AddRefed<nsThread> mozilla::CreateMainThread<mozilla::ThreadEventQueue<mozilla::PrioritizedEventQueue<mozilla::EventQueue> >, mozilla::EventQueue>(nsIIdlePeriod*, mozilla::ThreadEventQueue<mozilla::PrioritizedEventQueue<mozilla::EventQueue> >**)
Line
Count
Source
22
3
{
23
3
  using MainThreadQueueT = PrioritizedEventQueue<InnerQueueT>;
24
3
25
3
  auto queue = MakeUnique<MainThreadQueueT>(
26
3
    MakeUnique<InnerQueueT>(EventPriority::High),
27
3
    MakeUnique<InnerQueueT>(EventPriority::Input),
28
3
    MakeUnique<InnerQueueT>(EventPriority::Normal),
29
3
    MakeUnique<InnerQueueT>(EventPriority::Idle),
30
3
    do_AddRef(aIdlePeriod));
31
3
32
3
  MainThreadQueueT* prioritized = queue.get();
33
3
34
3
  RefPtr<SynchronizedQueueT> synchronizedQueue = new SynchronizedQueueT(std::move(queue));
35
3
36
3
  prioritized->SetMutexRef(synchronizedQueue->MutexRef());
37
3
38
3
  // Setup "main" thread
39
3
  RefPtr<nsThread> mainThread = new nsThread(WrapNotNull(synchronizedQueue), nsThread::MAIN_THREAD, 0);
40
3
41
3
#ifndef RELEASE_OR_BETA
42
3
  prioritized->SetNextIdleDeadlineRef(mainThread->NextIdleDeadlineRef());
43
3
#endif
44
3
45
3
  if (aSynchronizedQueue) {
46
0
    synchronizedQueue.forget(aSynchronizedQueue);
47
0
  }
48
3
  return mainThread.forget();
49
3
}
50
51
} // namespace mozilla
52
53
#endif // mozilla_MainThreadQueue_h