| Index: third_party/WebKit/Source/platform/heap/SelfKeepAlive.h
|
| diff --git a/third_party/WebKit/Source/platform/heap/SelfKeepAlive.h b/third_party/WebKit/Source/platform/heap/SelfKeepAlive.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..76c50b5a226af8527528191e66003be6b3fe4f7a
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/platform/heap/SelfKeepAlive.h
|
| @@ -0,0 +1,83 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef SelfKeepAlive_h
|
| +#define SelfKeepAlive_h
|
| +
|
| +#include "platform/heap/Persistent.h"
|
| +#include "wtf/Allocator.h"
|
| +#include "wtf/Assertions.h"
|
| +
|
| +namespace blink {
|
| +
|
| +// SelfKeepAlive<Object> is the idiom to use for objects that have to keep
|
| +// themselves temporarily alive and cannot rely on there being some
|
| +// external reference in that interval:
|
| +//
|
| +// class Opener {
|
| +// public:
|
| +// ...
|
| +// void open()
|
| +// {
|
| +// // Retain a self-reference while in an open()ed state:
|
| +// m_keepAlive = this;
|
| +// ....
|
| +// }
|
| +//
|
| +// void close()
|
| +// {
|
| +// // Clear self-reference that ensured we were kept alive while opened.
|
| +// m_keepAlive.clear();
|
| +// ....
|
| +// }
|
| +//
|
| +// private:
|
| +// ...
|
| +// SelfKeepAlive m_keepAlive;
|
| +// };
|
| +//
|
| +// The responsibility to call clear() in a timely fashion resides with the implementation
|
| +// of the object.
|
| +//
|
| +//
|
| +template<typename Self>
|
| +class SelfKeepAlive final {
|
| + DISALLOW_NEW();
|
| +public:
|
| + SelfKeepAlive()
|
| + {
|
| + }
|
| +
|
| + explicit SelfKeepAlive(Self* self)
|
| + {
|
| + assign(self);
|
| + }
|
| +
|
| + SelfKeepAlive& operator=(Self* self)
|
| + {
|
| + assign(self);
|
| + return *this;
|
| + }
|
| +
|
| + void clear()
|
| + {
|
| + m_keepAlive.clear();
|
| + }
|
| +
|
| + explicit operator bool() const { return m_keepAlive; }
|
| +
|
| +private:
|
| + void assign(Self* self)
|
| + {
|
| + ASSERT(!m_keepAlive || m_keepAlive.get() == self);
|
| + m_keepAlive = self;
|
| + }
|
| +
|
| + GC_PLUGIN_IGNORE("420515")
|
| + Persistent<Self> m_keepAlive;
|
| +};
|
| +
|
| +} // namespace blink
|
| +
|
| +#endif // SelfKeepAlive_h
|
|
|