Browse Source

Reference counting for love objects in 0.9.2 is now atomic (using SDL's atomic operation functions.)

Alex Szpakowski 10 years ago
parent
commit
811f574ef6
3 changed files with 15 additions and 10 deletions
  1. 5 7
      src/common/Object.cpp
  2. 9 2
      src/common/Object.h
  3. 1 1
      src/modules/math/wrap_Math.cpp

+ 5 - 7
src/common/Object.cpp

@@ -21,33 +21,31 @@
 // LOVE
 #include "Object.h"
 
-#include <stdio.h>
-
 namespace love
 {
 
 Object::Object()
-	: count(1)
 {
+	count.value = 1;
 }
 
 Object::~Object()
 {
 }
 
-int Object::getReferenceCount() const
+int Object::getReferenceCount()
 {
-	return count;
+	return SDL_AtomicGet(&count);
 }
 
 void Object::retain()
 {
-	++count;
+	SDL_AtomicIncRef(&count);
 }
 
 void Object::release()
 {
-	if (--count <= 0)
+	if (SDL_AtomicDecRef(&count))
 		delete this;
 }
 

+ 9 - 2
src/common/Object.h

@@ -21,6 +21,13 @@
 #ifndef LOVE_OBJECT_H
 #define LOVE_OBJECT_H
 
+/**
+ * NOTE: the fact that an SDL header is included in such a widely used header
+ * file is only temporary - in the LOVE 0.10+ codebase we use atomics from
+ * C++11's standard library.
+ **/
+#include <SDL_atomic.h>
+
 namespace love
 {
 
@@ -50,7 +57,7 @@ public:
 	 * Gets the reference count of this Object.
 	 * @returns The reference count.
 	 **/
-	int getReferenceCount() const;
+	int getReferenceCount();
 
 	/**
 	 * Retains the Object, i.e. increases the
@@ -155,7 +162,7 @@ public:
 private:
 
 	// The reference count.
-	int count;
+	SDL_atomic_t count;
 
 }; // Object
 

+ 1 - 1
src/modules/math/wrap_Math.cpp

@@ -247,7 +247,7 @@ int w_isConvex(lua_State *L)
 		}
 	}
 
-	lua_pushboolean(L, Math::instance.isConvex(vertices));
+	luax_pushboolean(L, Math::instance.isConvex(vertices));
 	return 1;
 }