Files
epics-base/src/libCom/cppStd/epicsListBase.cpp
2002-07-12 21:35:43 +00:00

54 lines
1.6 KiB
C++

/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
// epicsListBase.cpp
// Author: Andrew Johnson
// Date: October 2000
#ifdef __GNUG__
#pragma implementation
#endif
#define epicsExportSharedSymbols
#include "epicsListBase.h"
#include "cantProceed.h"
// epicsListNodePool
epicsMutex epicsListNodePool::_mutex;
epicsListLink epicsListNodePool::_store;
epicsShareFunc epicsShareAPI epicsListNodePool::~epicsListNodePool() {
while (_blocks.hasNext()) {
epicsListNodeBlock* block =
static_cast<epicsListNodeBlock*>(_blocks.extract());
block->reset();
_mutex.lock();
_store.append(block);
_mutex.unlock();
}
}
epicsShareFunc void epicsShareAPI epicsListNodePool::extend() {
assert(!_free.hasNext());
epicsListNodeBlock* block = 0;
if (_store.hasNext()) {
_mutex.lock();
if (_store.hasNext())
block = static_cast<epicsListNodeBlock*>(_store.extract());
_mutex.unlock();
}
if (block == 0)
block = new epicsListNodeBlock;
if (block == 0) // in case new didn't throw...
cantProceed("epicsList: out of memory");
_blocks.append(block);
_free.set(block->first());
}