Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=d0edffffda0d24ef743a4c56fac391793d998800

commit d0edffffda0d24ef743a4c56fac391793d998800
Author: Michel Hermier <[email protected]>
Date:   Tue May 13 09:51:54 2014 +0200

libpacman: Implement a basic refcounter for Object.

diff --git a/lib/libpacman/object.cpp b/lib/libpacman/object.cpp
index ad9b300..511fb5c 100644
--- a/lib/libpacman/object.cpp
+++ b/lib/libpacman/object.cpp
@@ -29,20 +29,37 @@

using namespace libpacman;

+void Object::operator delete(void *ptr)
+{
+       free(ptr);
+}
+
void *Object::operator new(std::size_t size)
{
return f_zalloc(size);
}

-void *Object::operator new[](std::size_t size)
+Object::Object()
+       : m_reference_counter(1)
{
-       return f_zalloc(size);
}

Object::~Object()
{
}

+void Object::acquire() const
+{
+       ++m_reference_counter;
+}
+
+void Object::release() const
+{
+       if(--m_reference_counter == 0) {
+               delete this;
+       }
+}
+
int Object::get(unsigned val, unsigned long *data) const
{
return -1;
diff --git a/lib/libpacman/object.h b/lib/libpacman/object.h
index e6b3f12..facbfab 100644
--- a/lib/libpacman/object.h
+++ b/lib/libpacman/object.h
@@ -29,13 +29,23 @@ namespace libpacman
class Object
{
public:
+       void operator delete(void *ptr);
void *operator new(std::size_t size);
-       void *operator new[](std::size_t size);

+       Object();
virtual ~Object();

+       void acquire() const;
+       void release() const;
+
virtual int get(unsigned val, unsigned long *data) const;
virtual int set(unsigned val, unsigned long data);
+
+private:
+       void operator delete[](void *ptr);
+       void *operator new[](std::size_t size);
+
+       mutable unsigned m_reference_counter;
};

}
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to