| Index: include/private/GrSingleOwner.h
|
| diff --git a/include/private/GrSingleOwner.h b/include/private/GrSingleOwner.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e793e9e9737990b7f76d7649a8344921f0ab3e27
|
| --- /dev/null
|
| +++ b/include/private/GrSingleOwner.h
|
| @@ -0,0 +1,52 @@
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrSingleOwner_DEFINED
|
| +#define GrSingleOwner_DEFINED
|
| +
|
| +#include "SkTypes.h"
|
| +
|
| +#ifdef SK_DEBUG
|
| +#include "SkMutex.h"
|
| +#include "SkThreadID.h"
|
| +
|
| +// This is a debug tool to verify an object is only being used from one thread at a time.
|
| +class GrSingleOwner {
|
| +public:
|
| + GrSingleOwner() : fOwner(kIllegalThreadID), fReentranceCount(0) {}
|
| +
|
| + struct AutoEnforce {
|
| + AutoEnforce(GrSingleOwner* so) : fSO(so) { fSO->enter(); }
|
| + ~AutoEnforce() { fSO->exit(); }
|
| +
|
| + GrSingleOwner* fSO;
|
| + };
|
| +
|
| +private:
|
| + void enter() {
|
| + SkAutoMutexAcquire lock(fMutex);
|
| + SkThreadID self = SkGetThreadID();
|
| + SkASSERT(fOwner == self || fOwner == kIllegalThreadID);
|
| + fReentranceCount++;
|
| + fOwner = self;
|
| + }
|
| +
|
| + void exit() {
|
| + SkAutoMutexAcquire lock(fMutex);
|
| + fReentranceCount--;
|
| + if (fReentranceCount == 0) {
|
| + fOwner = kIllegalThreadID;
|
| + }
|
| + }
|
| +
|
| + SkMutex fMutex;
|
| + SkThreadID fOwner; // guarded by fMutex
|
| + int fReentranceCount; // guarded by fMutex
|
| +};
|
| +#endif
|
| +
|
| +#endif
|
|
|