Skip to content

Instantly share code, notes, and snippets.

@ffAudio
Last active July 15, 2020 11:43
Show Gist options
  • Select an option

  • Save ffAudio/5244737c56dced734182f4eacbff40a3 to your computer and use it in GitHub Desktop.

Select an option

Save ffAudio/5244737c56dced734182f4eacbff40a3 to your computer and use it in GitHub Desktop.
A juce AutoReleasePool
#include <JuceHeader.h>
class AutoReleasePool : private juce::Timer
{
public:
using Ptr = juce::ReferenceCountedObjectPtr<juce::ReferenceCountedObject>;
AutoReleasePool()
{
startTimerHz (1);
}
void addToPool (Ptr object)
{
for (auto& item : pool)
if (item.get() == object.get())
return;
pool.push_back (object);
}
int getNumObjects() const
{
juce::MessageManagerLock lock;
return int (pool.size());
}
private:
void timerCallback() override
{
pool.erase (std::remove_if (pool.begin(), pool.end(),
[](auto& item)
{
return item->getReferenceCount() < 2;
}),
pool.end());
}
std::vector<Ptr> pool;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AutoReleasePool)
};
class FooObject : public juce::ReferenceCountedObject
{
public:
FooObject() = default;
using Ptr = juce::ReferenceCountedObjectPtr<FooObject>;
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FooObject)
};
//==============================================================================
int main (int argc, char* argv[])
{
juce::ScopedJuceInitialiser_GUI app;
AutoReleasePool pool;
{
FooObject::Ptr object (new FooObject());
pool.addToPool (object);
for (int i = 0; i < 5; ++i)
{
DBG ("Elements in pool " << pool.getNumObjects());
juce::Thread::sleep (500);
juce::MessageManager::getInstance()->runDispatchLoopUntil (500);
}
}
juce::MessageManager::getInstance()->runDispatchLoopUntil (1000);
DBG ("Elements in pool " << pool.getNumObjects());
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment