123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /****************************************************************************
- Copyright (c) 2010-2012 cocos2d-x.org
- Copyright (c) 2013-2017 Chukong Technologies Inc.
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- #include "base/CCAutoreleasePool.h"
- #include "base/ccMacros.h"
- NS_CC_BEGIN
- AutoreleasePool::AutoreleasePool()
- : _name("")
- #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
- , _isClearing(false)
- #endif
- {
- _managedObjectArray.reserve(150);
- PoolManager::getInstance()->push(this);
- }
- AutoreleasePool::AutoreleasePool(const std::string &name)
- : _name(name)
- #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
- , _isClearing(false)
- #endif
- {
- _managedObjectArray.reserve(150);
- PoolManager::getInstance()->push(this);
- }
- AutoreleasePool::~AutoreleasePool()
- {
- CCLOGINFO("deallocing AutoreleasePool: %p", this);
- clear();
-
- PoolManager::getInstance()->pop();
- }
- void AutoreleasePool::addObject(Ref* object)
- {
- _managedObjectArray.push_back(object);
- }
- void AutoreleasePool::clear()
- {
- #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
- _isClearing = true;
- #endif
- std::vector<Ref*> releasings;
- releasings.swap(_managedObjectArray);
- for (const auto &obj : releasings)
- {
- obj->release();
- }
- #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
- _isClearing = false;
- #endif
- }
- bool AutoreleasePool::contains(Ref* object) const
- {
- for (const auto& obj : _managedObjectArray)
- {
- if (obj == object)
- return true;
- }
- return false;
- }
- void AutoreleasePool::dump()
- {
- CCLOG("autorelease pool: %s, number of managed object %d\n", _name.c_str(), static_cast<int>(_managedObjectArray.size()));
- CCLOG("%20s%20s%20s", "Object pointer", "Object id", "reference count");
- for (const auto &obj : _managedObjectArray)
- {
- CCLOG("%20p%20u\n", obj, obj->getReferenceCount());
- }
- }
- //--------------------------------------------------------------------
- //
- // PoolManager
- //
- //--------------------------------------------------------------------
- PoolManager* PoolManager::s_singleInstance = nullptr;
- PoolManager* PoolManager::getInstance()
- {
- if (s_singleInstance == nullptr)
- {
- s_singleInstance = new (std::nothrow) PoolManager();
- // Add the first auto release pool
- new AutoreleasePool("cocos2d autorelease pool");
- }
- return s_singleInstance;
- }
- void PoolManager::destroyInstance()
- {
- delete s_singleInstance;
- s_singleInstance = nullptr;
- }
- PoolManager::PoolManager()
- {
- _releasePoolStack.reserve(10);
- }
- PoolManager::~PoolManager()
- {
- CCLOGINFO("deallocing PoolManager: %p", this);
-
- while (!_releasePoolStack.empty())
- {
- AutoreleasePool* pool = _releasePoolStack.back();
-
- delete pool;
- }
- }
- AutoreleasePool* PoolManager::getCurrentPool() const
- {
- return _releasePoolStack.back();
- }
- bool PoolManager::isObjectInPools(Ref* obj) const
- {
- for (const auto& pool : _releasePoolStack)
- {
- if (pool->contains(obj))
- return true;
- }
- return false;
- }
- void PoolManager::push(AutoreleasePool *pool)
- {
- _releasePoolStack.push_back(pool);
- }
- void PoolManager::pop()
- {
- CC_ASSERT(!_releasePoolStack.empty());
- _releasePoolStack.pop_back();
- }
- NS_CC_END
|