handletemplates_defs.h [plain text]
#ifndef _H_HANDLETEMPLATES_DEFS
#define _H_HANDLETEMPLATES_DEFS
#include <Security/cssm.h>
#include <security_utilities/refcount.h>
#include <security_utilities/threading.h>
#include <security_utilities/globalizer.h>
#include <security_cdsa_utilities/cssmerrors.h>
#include <security_cdsa_utilities/handletemplates.h>
namespace Security
{
template <class _Handle>
TypedHandle<_Handle>::TypedHandle()
: mMyHandle(invalidHandle), mValid(false)
{
}
template <class _Handle>
TypedHandle<_Handle>::TypedHandle(_Handle h)
: mMyHandle(h), mValid(true)
{
}
template <class _Handle>
MappingHandle<_Handle>::MappingHandle() : TypedHandle<_Handle>()
{
make();
}
template <class _Handle>
void MappingHandle<_Handle>::make()
{
StLock<Mutex> _(state());
_Handle hbase = (_Handle)reinterpret_cast<uintptr_t>(this);
for (;;) {
_Handle handle = hbase ^ state().nextSeq();
if (!state().handleInUse(handle)) {
secinfo("handleobj", "create %#lx for %p", static_cast<unsigned long>(handle), this);
TypedHandle<_Handle>::setHandle(handle);
state().add(handle, this);
return;
}
}
}
template <class _Handle>
void MappingHandle<_Handle>::lock() { }
template <class _Handle>
bool MappingHandle<_Handle>::tryLock() { return true; }
template <class _Handle>
MappingHandle<_Handle>::State::State()
: sequence(1)
{
}
template <class _Handle>
bool MappingHandle<_Handle>::State::handleInUse(_Handle h)
{
return (HandleMap::find(h) != (*this).end());
}
template <class _Handle>
MappingHandle<_Handle> *MappingHandle<_Handle>::State::find(_Handle h, CSSM_RETURN error)
{
StLock<Mutex> _(*this);
typename HandleMap::const_iterator it = HandleMap::find(h);
if (it == (*this).end())
CssmError::throwMe(error);
MappingHandle<_Handle> *obj = it->second;
if (obj == NULL || obj->handle() != h)
CssmError::throwMe(error);
return obj;
}
template <class _Handle>
typename MappingHandle<_Handle>::HandleMap::iterator
MappingHandle<_Handle>::State::locate(_Handle h, CSSM_RETURN error)
{
StLock<Mutex> locker(*this);
typename HandleMap::iterator it = HandleMap::find(h);
if (it == (*this).end())
CssmError::throwMe(error);
MappingHandle<_Handle> *obj = it->second;
if (obj == NULL || obj->handle() != h)
CssmError::throwMe(error);
locker.release();
return it;
}
template <class _Handle>
void MappingHandle<_Handle>::State::add(_Handle h, MappingHandle<_Handle> *obj)
{
(*this)[h] = obj;
}
template <class _Handle>
void MappingHandle<_Handle>::State::erase(MappingHandle<_Handle> *obj)
{
if (obj->validHandle())
HandleMap::erase(obj->handle());
}
template <class _Handle>
void MappingHandle<_Handle>::State::erase(typename HandleMap::iterator &it)
{
if (it->second->validHandle())
HandleMap::erase(it);
}
template <class _Handle>
ModuleNexus<typename MappingHandle<_Handle>::State> MappingHandle<_Handle>::state;
}
#endif //_H_HANDLETEMPLATES_DEFS