dont allow ordinary delete

This commit is contained in:
Jeff Hill
2002-10-23 23:32:30 +00:00
parent 4cd67a4e27
commit 8a0504616e
3 changed files with 42 additions and 64 deletions

View File

@@ -29,6 +29,7 @@
*/
#include <new>
#include <stdexcept>
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
@@ -41,8 +42,6 @@
#include "cadef.h"
#include "db_access.h" // for INVALID_DB_REQ
epicsSingleton < tsFreeList < class nciu, 1024 > > nciu::pFreeList;
nciu::nciu ( cac & cacIn, netiiu & iiuIn, cacChannelNotify & chanIn,
const char *pNameIn, cacChannel::priLev pri ) :
cacChannel ( chanIn ),
@@ -76,12 +75,21 @@ nciu::nciu ( cac & cacIn, netiiu & iiuIn, cacChannelNotify & chanIn,
nciu::~nciu ()
{
// care is taken so that a lock is not applied during this phase
this->cacCtx.uninstallChannel ( *this );
delete [] this->pNameStr;
}
void nciu::destroy ()
{
// care is taken so that a lock is not applied during this phase
this->cacCtx.destroyChannel ( *this );
}
void nciu::operator delete ( void * pCadaver )
{
throw std::logic_error
( "compiler is confused about placement delete" );
}
void nciu::initiateConnect ()
{
this->cacCtx.initiateConnect ( *this );

View File

@@ -35,7 +35,7 @@
#include "tsDLList.h"
#include "tsFreeList.h"
#include "epicsMutex.h"
#include "epicsSingleton.h"
#include "cxxCompilerDepPlacementDelete.h"
#ifdef nciuh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
@@ -66,7 +66,8 @@ class nciu : public cacChannel, public tsDLNode < nciu >,
public:
nciu ( cac &, netiiu &, cacChannelNotify &,
const char *pNameIn, cacChannel::priLev );
~nciu (); // force pool allocation
~nciu ();
void destroy ();
void connect ( unsigned nativeType,
unsigned nativeCount, unsigned sid, bool v41Ok );
void connect ();
@@ -76,8 +77,6 @@ public:
bool searchMsg ( class udpiiu & iiu, unsigned & retryNoForThisChannel );
void createChannelRequest ( class tcpiiu & iiu );
bool identifierEquivelence ( unsigned idToMatch );
void * operator new ( size_t size );
void operator delete ( void *pCadaver, size_t size );
void beaconAnomalyNotify ();
void serviceShutdownNotify ();
void accessRightsStateChange ( const caAccessRights & );
@@ -98,6 +97,10 @@ public:
void writeException ( epicsGuard < callbackMutex > &,
int status, const char *pContext, unsigned type, arrayElementCount count );
cacChannel::priLev getPriority () const;
void * operator new ( size_t size, tsFreeList < class nciu, 1024 > & );
# ifdef CXX_PLACEMENT_DELETE
void operator delete ( void *, tsFreeList < class nciu, 1024 > & );
# endif
private:
caAccessRights accessRightState;
cac & cacCtx;
@@ -129,20 +132,27 @@ private:
bool ca_v42_ok () const;
void hostName ( char *pBuf, unsigned bufLength ) const;
static void stringVerify ( const char *pStr, const unsigned count );
static epicsSingleton < tsFreeList < class nciu, 1024 > > pFreeList;
nciu ( const nciu & );
nciu & operator = ( const nciu & );
void * operator new ( size_t );
void operator delete ( void * );
void * operator new [] ( size_t );
void operator delete [] ( void * );
};
inline void * nciu::operator new ( size_t size )
inline void * nciu::operator new ( size_t size,
tsFreeList < class nciu, 1024 > & freeList )
{
return nciu::pFreeList->allocate ( size );
return freeList.allocate ( size );
}
inline void nciu::operator delete ( void *pCadaver, size_t size )
#ifdef CXX_PLACEMENT_DELETE
inline void nciu::operator delete ( void * pCadaver,
tsFreeList < class nciu, 1024 > & freeList )
{
nciu::pFreeList->release ( pCadaver, size );
freeList.release ( pCadaver, sizeof ( nciu ) );
}
#endif
inline bool nciu::identifierEquivelence ( unsigned idToMatch )
{

View File

@@ -27,17 +27,7 @@
#define netIOh
#include "nciu.h"
// does the compiler support placement delete
#if defined (_MSC_VER) && ( _MSC_VER >= 1200 )
# define NETIO_PLACEMENT_DELETE
#elif defined ( __HP_aCC ) && ( _HP_aCC > 033300 )
# define NETIO_PLACEMENT_DELETE
#elif defined ( __BORLANDC__ ) && ( __BORLANDC__ > 0x550 )
# define NETIO_PLACEMENT_DELETE
#else
# define NETIO_PLACEMENT_DELETE
#endif
#include "cxxCompilerDepPlacementDelete.h"
// SUN PRO generates multiply defined symbols if the baseNMIU
// destructor is virtual (therefore it is protected).
@@ -96,7 +86,7 @@ private:
void operator delete ( void * );
void * operator new ( size_t,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & );
# if defined ( NETIO_PLACEMENT_DELETE )
# if defined ( CXX_PLACEMENT_DELETE )
void operator delete ( void *,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & );
# endif
@@ -129,7 +119,7 @@ private:
void operator delete ( void * );
void * operator new ( size_t,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & );
# if defined ( NETIO_PLACEMENT_DELETE )
# if defined ( CXX_PLACEMENT_DELETE )
void operator delete ( void *,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & );
# endif
@@ -161,7 +151,7 @@ private:
void operator delete ( void * );
void * operator new ( size_t,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & );
# if defined ( NETIO_PLACEMENT_DELETE )
# if defined ( CXX_PLACEMENT_DELETE )
void operator delete ( void *,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & );
# endif
@@ -185,24 +175,14 @@ inline void * netSubscription::operator new ( size_t size,
return freeList.allocate ( size );
}
#if defined ( NETIO_PLACEMENT_DELETE )
#if defined ( CXX_PLACEMENT_DELETE )
inline void netSubscription::operator delete ( void *pCadaver,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList )
{
freeList.release ( pCadaver, sizeof ( netSubscription ) );
freeList.release ( pCadaver );
}
#endif
inline void * netSubscription::operator new ( size_t sizeIn )
{
return ::operator new ( sizeIn );
}
inline void netSubscription::operator delete ( void * p )
{
::operator delete ( p );
}
inline netSubscription * netSubscription::factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList,
nciu &chan, unsigned type, arrayElementCount count,
@@ -246,24 +226,14 @@ inline void * netReadNotifyIO::operator new ( size_t size,
return freeList.allocate ( size );
}
#if defined ( NETIO_PLACEMENT_DELETE )
#if defined ( CXX_PLACEMENT_DELETE )
inline void netReadNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > &freeList )
{
freeList.release ( pCadaver, sizeof ( netWriteNotifyIO ) );
freeList.release ( pCadaver );
}
#endif
inline void * netReadNotifyIO::operator new ( size_t sizeIn )
{
return ::operator new ( sizeIn );
}
inline void netReadNotifyIO::operator delete ( void * p )
{
::operator delete ( p );
}
inline netWriteNotifyIO * netWriteNotifyIO::factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > &freeList,
nciu &chan, cacWriteNotify &notify )
@@ -277,22 +247,12 @@ inline void * netWriteNotifyIO::operator new ( size_t size,
return freeList.allocate ( size );
}
#if defined ( NETIO_PLACEMENT_DELETE )
#if defined ( CXX_PLACEMENT_DELETE )
inline void netWriteNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > &freeList )
{
freeList.release ( pCadaver, sizeof ( netWriteNotifyIO ) );
freeList.release ( pCadaver );
}
#endif
inline void * netWriteNotifyIO::operator new ( size_t sizeIn )
{
return ::operator new ( sizeIn );
}
inline void netWriteNotifyIO::operator delete ( void * p )
{
::operator delete ( p );
}
#endif // ifdef netIOh