Česky
Kamil Dudka

Share Library (C++)

File detail

Name:Downloadsharelib.cpp [Download]
Location: sharelib > src > sharelib
Size:3.0 KB
Last modification:2007-08-27 01:16

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");
}