fune/gfx/layers/ipc/SynchronousTask.h
Kartikaya Gupta fb7f70182b Bug 1447299 - Ensure all APZSampler functions run on the sampler thread. r=botond
Functions in APZSampler that are only invoked without WR (e.g. from
AsyncCompositionManager only) can be asserted as running on the sampler
thread. Functions that are invoked with WR need to be bounced onto the
sampler thread. In all cases the functions are called from the
compositor thread, and so we assert that as well.

MozReview-Commit-ID: JPgGlgUUsgg

--HG--
extra : rebase_source : 8b950d3386e1e64e766b76edaa7894b251fb8664
2018-03-28 14:57:06 -04:00

65 lines
1.3 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 MOZILLA_GFX_SYNCHRONOUSTASK_H
#define MOZILLA_GFX_SYNCHRONOUSTASK_H
#include "mozilla/ReentrantMonitor.h" // for ReentrantMonitor, etc
namespace mozilla {
namespace layers {
// Helper that creates a monitor and a "done" flag, then enters the monitor.
class MOZ_STACK_CLASS SynchronousTask
{
friend class AutoCompleteTask;
public:
explicit SynchronousTask(const char* name)
: mMonitor(name),
mAutoEnter(mMonitor),
mDone(false)
{}
void Wait() {
while (!mDone) {
mMonitor.Wait();
}
}
private:
void Complete() {
mDone = true;
mMonitor.NotifyAll();
}
private:
ReentrantMonitor mMonitor;
ReentrantMonitorAutoEnter mAutoEnter;
bool mDone;
};
class MOZ_STACK_CLASS AutoCompleteTask
{
public:
explicit AutoCompleteTask(SynchronousTask* aTask)
: mTask(aTask),
mAutoEnter(aTask->mMonitor)
{
}
~AutoCompleteTask() {
mTask->Complete();
}
private:
SynchronousTask* mTask;
ReentrantMonitorAutoEnter mAutoEnter;
};
}
}
#endif