diff options
author | Gil Pitney <gil.pitney@linaro.org> | 2014-10-28 18:00:42 -0700 |
---|---|---|
committer | Gil Pitney <gil.pitney@linaro.org> | 2014-10-28 18:00:42 -0700 |
commit | 61b2c94d9e64758e55730be6a3fc9006c171db85 (patch) | |
tree | f564f09ebf93ba293dfa225bd374df6f1f37aa01 /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.cpp | 115 |
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; +} |