| // Copyright 2011 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ |
| #define BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ |
| |
| #include "base/base_export.h" |
| #include "base/memory/raw_ptr_exclusion.h" |
| #include "base/threading/thread_checker.h" |
| |
| namespace base::mac { |
| |
| // ScopedNSAutoreleasePool creates an autorelease pool when instantiated and |
| // pops it when destroyed. This allows an autorelease pool to be maintained in |
| // ordinary C++ code without bringing in any direct Objective-C dependency. |
| // |
| // Before using, please be aware that the semantics of autorelease pools do not |
| // match the semantics of a C++ class. In particular, recycling or destructing a |
| // pool lower on the stack destroys all pools higher on the stack, which does |
| // not mesh well with the existence of C++ objects for each pool. |
| // |
| // TODO(https://crbug.com/1424190): Enforce stack-only use via the |
| // STACK_ALLOCATED annotation. |
| // |
| // Use this class only in C++ code; use @autoreleasepool in Obj-C(++) code. |
| |
| class BASE_EXPORT ScopedNSAutoreleasePool { |
| public: |
| ScopedNSAutoreleasePool(); |
| |
| ScopedNSAutoreleasePool(const ScopedNSAutoreleasePool&) = delete; |
| ScopedNSAutoreleasePool& operator=(const ScopedNSAutoreleasePool&) = delete; |
| ScopedNSAutoreleasePool(ScopedNSAutoreleasePool&&) = delete; |
| ScopedNSAutoreleasePool& operator=(ScopedNSAutoreleasePool&&) = delete; |
| |
| ~ScopedNSAutoreleasePool(); |
| |
| // Clear out the pool in case its position on the stack causes it to be alive |
| // for long periods of time (such as the entire length of the app). Only use |
| // then when you're certain the items currently in the pool are no longer |
| // needed. |
| void Recycle(); |
| |
| private: |
| // This field is not a raw_ptr<> because it is a pointer to an Objective-C |
| // object. |
| RAW_PTR_EXCLUSION void* autorelease_pool_ GUARDED_BY_CONTEXT(thread_checker_); |
| |
| THREAD_CHECKER(thread_checker_); |
| }; |
| |
| } // namespace base::mac |
| |
| #endif // BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ |