Share Library (C++)
File detail
Source code
/**
* @file sharelib.cpp
* @brief Share library interface
* @author Kamil Dudka, xdudka00@gmail.com
* @date 2007-05-15
* @ingroup core
*/
#include "sharelib.h"
#include "SharedSegment.h"
#include "SegmentHeader.h"
#ifdef _LINUX
# define SIZE_MAX ULONG_MAX
#endif
using namespace Share;
ShareException::ShareException (const char *message)
{
message_ = new char [strlen (message) + 1];
strcpy (message_, message);
}
ShareException::ShareException (const ShareException &e):
std::bad_alloc(e)
{
message_ = new char [strlen (e.message_) + 1];
strcpy (message_, e.message_);
}
ShareException::~ShareException() throw ()
{
delete[] message_;
}
const char* ShareException::message() const
{
return message_;
}
/**
* Pointer to ShareManager singleton object.
*/
ShareManager *ShareManager::instance_= 0;
ShareManager *ShareManager::instance ()
{
if (!instance_)
instance_= new ShareManager;
return instance_;
}
void ShareManager::destroySelf ()
{
delete instance_;
instance_= 0;
}
ShareManager::ShareManager ():
segment_ (0),
atAddr_ (0)
{
// FIXME: Check this on Win32
atexit (ShareManager::destroySelf);
}
ShareManager::~ShareManager ()
{
/* if (segment_)
detachSegment();*/
}
void ShareManager::initDebugMode (SharedSegment *segment)
{
segment_ = segment;
atAddr_ = static_cast<SegmentHeader *> (segment_-> atAddress());
}
void ShareManager::destroySegment()
{
atAddr_-> ~SegmentHeader();
segment_-> destroy();
}
void ShareManager::createSegment (const char *name, size_t size) throw (ShareException)
{
if (segment_)
throw ShareException ("ShareManager: Segment already attached - invalid createSegment() call");
segment_ = new SharedSegment (name, SegmentHeader::sizeNeeded (name, size));
atAddr_ = static_cast<SegmentHeader *> (segment_-> atAddress());
new (atAddr_) SegmentHeader (name, size);
atAddr_-> notifyAttach();
}
void ShareManager::attachSegment (const char *name) throw (ShareException)
{
if (segment_)
throw ShareException ("ShareManager: Segment already attached - invalid attachSegment() call");
segment_ = new SharedSegment (name);
atAddr_ = static_cast<SegmentHeader *> (segment_-> atAddress());
atAddr_-> notifyAttach();
}
void ShareManager::detachSegment () throw ()
{
if (atAddr_) {
atAddr_-> notifyDetach();
if (atAddr_-> shouldBeDestroyed())
this-> destroySegment();
delete segment_;
segment_ = 0;
atAddr_ = 0;
}
}
void ShareManager::unlinkSegment () throw ()
{
if (atAddr_)
atAddr_-> unlink();
}
void* ShareManager::alloc (size_t size) throw (ShareException)
{
return (atAddr_)?
atAddr_-> alloc (size):
::operator new (size);
}
void ShareManager::free (void *addr) throw ()
{
if (atAddr_)
atAddr_-> free (addr);
else
::operator delete (addr);
}
size_t ShareManager::available ()
{
return (atAddr_)?
atAddr_-> available():
SIZE_MAX - 1;
}
const char* ShareManager::name ()
{
if (segment_)
return segment_ -> name();
else
throw ShareException ("ShareManager: No segment attached - invalid name() call");
}