aboutsummaryrefslogtreecommitdiff
path: root/src/core/object.cpp
diff options
context:
space:
mode:
authorGil Pitney <gil.pitney@linaro.org>2014-10-28 18:00:42 -0700
committerGil Pitney <gil.pitney@linaro.org>2014-10-28 18:00:42 -0700
commit61b2c94d9e64758e55730be6a3fc9006c171db85 (patch)
treef564f09ebf93ba293dfa225bd374df6f1f37aa01 /src/core/object.cpp
Initial Commit: Based on TI OpenCL v0.8, originally based on clover.shamrock_v0.8
This is a continuation of the clover OpenCL project: http://people.freedesktop.org/~steckdenis/clover based on the contributions from Texas Instruments for Keystone II DSP device: git.ti.com/opencl and adding contributions from Linaro for ARM CPU-only support. See README.txt for more info, and build instructions. Signed-off-by: Gil Pitney <gil.pitney@linaro.org>
Diffstat (limited to 'src/core/object.cpp')
-rw-r--r--src/core/object.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/core/object.cpp b/src/core/object.cpp
new file mode 100644
index 0000000..be44279
--- /dev/null
+++ b/src/core/object.cpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2011, Denis Steckelmacher <steckdenis@yahoo.fr>
+ * Copyright (c) 2012-2014, Texas Instruments Incorporated - http://www.ti.com/
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the copyright holder nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file object.cpp
+ * \brief Reference-counted object tree
+ */
+
+#include "object.h"
+
+using namespace Coal;
+
+static std::list<Object *>& getKnownObjects()
+{
+ static std::list<Object *> known_objects;
+ return known_objects;
+}
+
+
+Object::Object(Type type, Object *parent)
+: p_references(1), p_parent(parent), p_type(type), p_release_parent(true)
+{
+ if (parent)
+ parent->reference();
+
+ // Add object in the list of known objects
+ getKnownObjects().push_front(this);
+ p_it = getKnownObjects().begin();
+}
+
+Object::~Object()
+{
+ if (p_parent && p_parent->dereference() && p_release_parent)
+ delete p_parent;
+
+ // Remove object from the list of known objects
+ getKnownObjects().erase(p_it);
+}
+
+void Object::reference()
+{
+ p_references++;
+}
+
+bool Object::dereference()
+{
+ p_references--;
+ return (p_references == 0);
+}
+
+void Object::setReleaseParent (bool release)
+{
+ p_release_parent = release;
+}
+
+unsigned int Object::references() const
+{
+ return p_references;
+}
+
+Object *Object::parent() const
+{
+ return p_parent;
+}
+
+Object::Type Object::type() const
+{
+ return p_type;
+}
+
+bool Object::isA(Object::Type type) const
+{
+ // Check for null values
+ if (this == 0)
+ return false;
+
+ // Check that the value isn't garbage or freed pointer
+ std::list<Object *>::const_iterator it = getKnownObjects().begin(),
+ e = getKnownObjects().end();
+ while (it != e)
+ {
+ if (*it == this)
+ // OK, NOW it is safe to dereference this ptr:
+ return this->type() == type;
+
+ ++it;
+ }
+
+ return false;
+}