diff --git a/src/common/Object.cpp b/src/common/Object.cpp index dc7df2306..31ed9dbba 100644 --- a/src/common/Object.cpp +++ b/src/common/Object.cpp @@ -21,8 +21,6 @@ // LOVE #include "Object.h" -#include - namespace love { @@ -31,6 +29,12 @@ Object::Object() { } +Object::Object(const Object & /*other*/) + // New objects should always have a reference count of 1. + : count(1) +{ +} + Object::~Object() { } @@ -42,13 +46,17 @@ int Object::getReferenceCount() const void Object::retain() { - ++count; + std::atomic_fetch_add_explicit(&count, 1, std::memory_order_relaxed); } void Object::release() { - if (--count <= 0) + // http://www.boost.org/doc/libs/1_56_0/doc/html/atomic/usage_examples.html + if (std::atomic_fetch_sub_explicit(&count, 1, std::memory_order_release) == 1) + { + std::atomic_thread_fence(std::memory_order_acquire); delete this; + } } } // love diff --git a/src/common/Object.h b/src/common/Object.h index 791c1dac1..740f1b368 100644 --- a/src/common/Object.h +++ b/src/common/Object.h @@ -21,6 +21,8 @@ #ifndef LOVE_OBJECT_H #define LOVE_OBJECT_H +#include + namespace love { @@ -40,6 +42,7 @@ public: * Constructor. Sets reference count to one. **/ Object(); + Object(const Object &other); /** * Destructor. @@ -155,7 +158,7 @@ public: private: // The reference count. - int count; + std::atomic count; }; // Object diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index 6e4c34130..5987d2646 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -26,7 +26,6 @@ #include "Object.h" #include "Reference.h" #include "StringMap.h" -#include // C++ #include @@ -36,22 +35,15 @@ namespace love { -static thread::Mutex *gcmutex = nullptr; - /** * Called when an object is collected. The object is released * once in this function, possibly deleting it. **/ static int w__gc(lua_State *L) { - if (!gcmutex) - gcmutex = thread::newMutex(); - Proxy *p = (Proxy *) lua_touserdata(L, 1); Object *object = (Object *) p->data; - thread::Lock lock(gcmutex); - object->release(); return 0;