Files
pcas/src/gdd/gddNewDel.cc
2004-01-28 00:04:03 +00:00

82 lines
1.7 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.
\*************************************************************************/
// Author: Jim Kowalkowski
// Date: 2/96
//
// $Id$
//
#define epicsExportSharedSymbols
#include "gddNewDel.h"
#include <stdio.h>
class gddCleanUpNode
{
public:
void* buffer;
gddCleanUpNode* next;
};
class gddCleanUp
{
public:
gddCleanUp();
~gddCleanUp();
void Add(void*);
private:
gddCleanUpNode * bufs;
epicsMutex lock;
};
static gddCleanUp * pBufferCleanUpGDD = NULL;
static epicsThreadOnceId gddCleanupOnce = EPICS_THREAD_ONCE_INIT;
extern "C" {
static void gddCleanupInit ( void * )
{
pBufferCleanUpGDD = new gddCleanUp;
assert ( pBufferCleanUpGDD );
}
}
void gddGlobalCleanupAdd ( void * pBuf )
{
epicsThreadOnce ( & gddCleanupOnce, gddCleanupInit, 0 );
pBufferCleanUpGDD->Add ( pBuf );
}
gddCleanUp::gddCleanUp() : bufs ( NULL ) {}
gddCleanUp::~gddCleanUp()
{
gddCleanUpNode *p1,*p2;
for(p1=gddCleanUp::bufs;p1;)
{
p2=p1;
p1=p1->next;
free((char*)p2->buffer);
delete p2;
}
}
void gddCleanUp::Add(void* v)
{
gddCleanUpNode* p = new gddCleanUpNode;
p->buffer=v;
{
epicsGuard < epicsMutex > guard ( lock );
p->next=gddCleanUp::bufs;
gddCleanUp::bufs=p;
}
}