blob: e6d42cf0ff20280f0d53157960167a1ed5371474 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <map>
#include <GLcommon/objectNameManager.h>
NameSpace::NameSpace(NamedObjectType p_type, GlobalNameSpace *globalNameSpace) :
m_nextName(0),
m_type(p_type),
m_globalNameSpace(globalNameSpace)
{
}
NameSpace::~NameSpace()
{
for (NamesMap::iterator n = m_localToGlobalMap.begin();
n != m_localToGlobalMap.end();
n++) {
m_globalNameSpace->deleteName(m_type, (*n).second);
}
}
unsigned int
NameSpace::genName(unsigned int p_localName, bool genGlobal)
{
unsigned int localName = p_localName;
if (localName == 0) {
do {
localName = ++m_nextName;
} while( localName == 0 || m_localToGlobalMap.find(localName) != m_localToGlobalMap.end() );
}
if (genGlobal) {
unsigned int globalName = m_globalNameSpace->genName(m_type);
m_localToGlobalMap[localName] = globalName;
}
return localName;
}
unsigned int
NameSpace::getGlobalName(unsigned int p_localName)
{
NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
if (n != m_localToGlobalMap.end()) {
// object found - return its global name map
return (*n).second;
}
// object does not exist;
return 0;
}
unsigned int
NameSpace::getLocalName(unsigned int p_globalName)
{
for(NamesMap::iterator it = m_localToGlobalMap.begin(); it != m_localToGlobalMap.end();it++){
if((*it).second == p_globalName){
// object found - return its local name
return (*it).first;
}
}
// object does not exist;
return 0;
}
void
NameSpace::deleteName(unsigned int p_localName)
{
NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
if (n != m_localToGlobalMap.end()) {
m_globalNameSpace->deleteName(m_type, (*n).second);
m_localToGlobalMap.erase(p_localName);
}
}
bool
NameSpace::isObject(unsigned int p_localName)
{
return (m_localToGlobalMap.find(p_localName) != m_localToGlobalMap.end() );
}
void
NameSpace::replaceGlobalName(unsigned int p_localName, unsigned int p_globalName)
{
NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
if (n != m_localToGlobalMap.end()) {
m_globalNameSpace->deleteName(m_type, (*n).second);
(*n).second = p_globalName;
}
}
typedef std::pair<NamedObjectType, unsigned int> ObjectIDPair;
typedef std::map<ObjectIDPair, ObjectDataPtr> ObjectDataMap;
ShareGroup::ShareGroup(GlobalNameSpace *globalNameSpace)
{
mutex_init(&m_lock);
for (int i=0; i<NUM_OBJECT_TYPES; i++) {
m_nameSpace[i] = new NameSpace((NamedObjectType)i, globalNameSpace);
}
m_objectsData = NULL;
}
ShareGroup::~ShareGroup()
{
mutex_lock(&m_lock);
for (int t = 0; t < NUM_OBJECT_TYPES; t++) {
delete m_nameSpace[t];
}
ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
if (map) delete map;
mutex_unlock(&m_lock);
mutex_destroy(&m_lock);
}
unsigned int
ShareGroup::genName(NamedObjectType p_type, unsigned int p_localName)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
mutex_lock(&m_lock);
unsigned int localName = m_nameSpace[p_type]->genName(p_localName);
mutex_unlock(&m_lock);
return localName;
}
unsigned int
ShareGroup::getGlobalName(NamedObjectType p_type, unsigned int p_localName)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
mutex_lock(&m_lock);
unsigned int globalName = m_nameSpace[p_type]->getGlobalName(p_localName);
mutex_unlock(&m_lock);
return globalName;
}
unsigned int
ShareGroup::getLocalName(NamedObjectType p_type, unsigned int p_globalName)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
mutex_lock(&m_lock);
unsigned int localName = m_nameSpace[p_type]->getLocalName(p_globalName);
mutex_unlock(&m_lock);
return localName;
}
void
ShareGroup::deleteName(NamedObjectType p_type, unsigned int p_localName)
{
if (p_type >= NUM_OBJECT_TYPES) return;
mutex_lock(&m_lock);
m_nameSpace[p_type]->deleteName(p_localName);
ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
if (map) {
map->erase( ObjectIDPair(p_type, p_localName) );
}
mutex_unlock(&m_lock);
}
bool
ShareGroup::isObject(NamedObjectType p_type, unsigned int p_localName)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
mutex_lock(&m_lock);
bool exist = m_nameSpace[p_type]->isObject(p_localName);
mutex_unlock(&m_lock);
return exist;
}
void
ShareGroup::replaceGlobalName(NamedObjectType p_type, unsigned int p_localName, unsigned int p_globalName)
{
if (p_type >= NUM_OBJECT_TYPES) return;
mutex_lock(&m_lock);
m_nameSpace[p_type]->replaceGlobalName(p_localName, p_globalName);
mutex_unlock(&m_lock);
}
void
ShareGroup::setObjectData(NamedObjectType p_type, unsigned int p_localName, ObjectDataPtr data)
{
if (p_type >= NUM_OBJECT_TYPES) return;
mutex_lock(&m_lock);
ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
if (!map) {
map = new ObjectDataMap();
m_objectsData = map;
}
ObjectIDPair id( p_type, p_localName );
map->insert( std::pair<ObjectIDPair, ObjectDataPtr>(id, data) );
mutex_unlock(&m_lock);
}
ObjectDataPtr
ShareGroup::getObjectData(NamedObjectType p_type, unsigned int p_localName)
{
ObjectDataPtr ret;
if (p_type >= NUM_OBJECT_TYPES) return ret;
mutex_lock(&m_lock);
ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
if (map) {
ObjectDataMap::iterator i = map->find( ObjectIDPair(p_type, p_localName) );
if (i != map->end()) ret = (*i).second;
}
mutex_unlock(&m_lock);
return ret;
}
ObjectNameManager::ObjectNameManager(GlobalNameSpace *globalNameSpace) :
m_globalNameSpace(globalNameSpace)
{
mutex_init(&m_lock);
}
ObjectNameManager::~ObjectNameManager()
{
mutex_destroy(&m_lock);
}
ShareGroupPtr
ObjectNameManager::createShareGroup(void *p_groupName)
{
mutex_lock(&m_lock);
ShareGroupPtr shareGroupReturn;
ShareGroupsMap::iterator s( m_groups.find(p_groupName) );
if (s != m_groups.end()) {
shareGroupReturn = (*s).second;
}
else {
//
// Group does not exist, create new group
//
shareGroupReturn = ShareGroupPtr( new ShareGroup(m_globalNameSpace) );
m_groups.insert( std::pair<void *, ShareGroupPtr>(p_groupName, shareGroupReturn) );
}
mutex_unlock(&m_lock);
return shareGroupReturn;
}
ShareGroupPtr
ObjectNameManager::getShareGroup(void *p_groupName)
{
mutex_lock(&m_lock);
ShareGroupPtr shareGroupReturn(NULL);
ShareGroupsMap::iterator s( m_groups.find(p_groupName) );
if (s != m_groups.end()) {
shareGroupReturn = (*s).second;
}
mutex_unlock(&m_lock);
return shareGroupReturn;
}
ShareGroupPtr
ObjectNameManager::attachShareGroup(void *p_groupName, void *p_existingGroupName)
{
mutex_lock(&m_lock);
ShareGroupPtr shareGroupReturn;
ShareGroupsMap::iterator s( m_groups.find(p_existingGroupName) );
if (s == m_groups.end()) {
// ShareGroup did not found !!!
mutex_unlock(&m_lock);
return ShareGroupPtr(NULL);
}
shareGroupReturn = (*s).second;
if (m_groups.find(p_groupName) == m_groups.end())
{
m_groups.insert( std::pair<void *, ShareGroupPtr>(p_groupName, shareGroupReturn) );
}
mutex_unlock(&m_lock);
return shareGroupReturn;
}
void
ObjectNameManager::deleteShareGroup(void *p_groupName)
{
mutex_lock(&m_lock);
ShareGroupsMap::iterator s( m_groups.find(p_groupName) );
if (s != m_groups.end()) {
m_groups.erase(s);
}
mutex_unlock(&m_lock);
}
void *ObjectNameManager::getGlobalContext()
{
void *ret = NULL;
mutex_lock(&m_lock);
if (m_groups.size() > 0) ret = (*m_groups.begin()).first;
mutex_unlock(&m_lock);
return ret;
}