This is Unofficial EPICS BASE Doxygen Site
ipAddrToAsciiTransactionPrivate Class Reference
+ Inheritance diagram for ipAddrToAsciiTransactionPrivate:
+ Collaboration diagram for ipAddrToAsciiTransactionPrivate:

Public Member Functions

 ipAddrToAsciiTransactionPrivate (class ipAddrToAsciiEnginePrivate &engineIn)
 
virtual ~ipAddrToAsciiTransactionPrivate ()
 
osiSockAddr address () const
 
void show (unsigned level) const
 
void * operator new (size_t size, tsFreeList< ipAddrToAsciiTransactionPrivate, 0x80 > &)
 
 epicsPlacementDeleteOperator ((void *, tsFreeList< ipAddrToAsciiTransactionPrivate, 0x80 > &)) osiSockAddr addr
 
void ipAddrToAscii (const osiSockAddr &, ipAddrToAsciiCallBack &)
 
void release ()
 
void operator delete (void *)
 
- Public Member Functions inherited from tsDLNode< ipAddrToAsciiTransactionPrivate >
 tsDLNode ()
 
 tsDLNode (const tsDLNode< ipAddrToAsciiTransactionPrivate > &)
 
const tsDLNode< ipAddrToAsciiTransactionPrivate > & operator= (const tsDLNode< ipAddrToAsciiTransactionPrivate > &)
 

Public Attributes

ipAddrToAsciiEnginePrivateengine
 
ipAddrToAsciiCallBackpCB
 
bool pending
 

Additional Inherited Members

- Protected Member Functions inherited from ipAddrToAsciiTransaction
virtual ~ipAddrToAsciiTransaction ()=0
 

Detailed Description

Definition at line 38 of file ipAddrToAsciiAsynchronous.cpp.

Constructor & Destructor Documentation

ipAddrToAsciiTransactionPrivate::ipAddrToAsciiTransactionPrivate ( class ipAddrToAsciiEnginePrivate engineIn)

Definition at line 360 of file ipAddrToAsciiAsynchronous.cpp.

360  :
361  engine ( engineIn ), pCB ( 0 ), pending ( false )
362 {
363  memset ( & this->addr, '\0', sizeof ( this->addr ) );
364  this->addr.sa.sa_family = AF_UNSPEC;
365 }
ipAddrToAsciiTransactionPrivate::~ipAddrToAsciiTransactionPrivate ( )
virtual

Definition at line 373 of file ipAddrToAsciiAsynchronous.cpp.

374 {
375  ipAddrToAsciiGlobal *pGlobal = this->engine.pEngine;
376  bool last;
377  {
378  epicsGuard < epicsMutex > guard ( pGlobal->mutex );
379  while ( this->pending ) {
380  if ( pGlobal->pCurrent == this &&
381  pGlobal->callbackInProgress &&
382  ! pGlobal->thread.isCurrentThread() ) {
383  // cancel from another thread while callback in progress
384  // waits for callback to complete
385  assert ( pGlobal->cancelPendingCount < UINT_MAX );
386  pGlobal->cancelPendingCount++;
387  {
388  epicsGuardRelease < epicsMutex > unguard ( guard );
389  pGlobal->destructorBlockEvent.wait ();
390  }
391  assert ( pGlobal->cancelPendingCount > 0u );
392  pGlobal->cancelPendingCount--;
393  if ( ! this->pending ) {
394  if ( pGlobal->cancelPendingCount ) {
395  pGlobal->destructorBlockEvent.signal ();
396  }
397  break;
398  }
399  }
400  else {
401  if ( pGlobal->pCurrent == this ) {
402  // cancel from callback, or while lookup in progress
403  pGlobal->pCurrent = 0;
404  }
405  else {
406  // cancel before lookup starts
407  pGlobal->labor.remove ( *this );
408  }
409  this->pending = false;
410  }
411  }
412  assert(this->engine.refcount>0);
413  last = 0==--this->engine.refcount;
414  }
415  if(last) {
416  delete &this->engine;
417  }
418 }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
static ipAddrToAsciiGlobal * pEngine

Member Function Documentation

osiSockAddr ipAddrToAsciiTransactionPrivate::address ( ) const
virtual

Implements ipAddrToAsciiTransaction.

Definition at line 457 of file ipAddrToAsciiAsynchronous.cpp.

458 {
459  return this->addr;
460 }
ipAddrToAsciiTransactionPrivate::epicsPlacementDeleteOperator ( (void *, tsFreeList< ipAddrToAsciiTransactionPrivate, 0x80 > &)  )
void ipAddrToAsciiTransactionPrivate::ipAddrToAscii ( const osiSockAddr addrIn,
ipAddrToAsciiCallBack cbIn 
)
virtual

Implements ipAddrToAsciiTransaction.

Definition at line 420 of file ipAddrToAsciiAsynchronous.cpp.

422 {
423  bool success;
424  ipAddrToAsciiGlobal *pGlobal = this->engine.pEngine;
425 
426  {
427  epicsGuard < epicsMutex > guard ( pGlobal->mutex );
428 
429  if (this->engine.released) {
430  errlogPrintf("Warning: ipAddrToAscii on transaction with release()'d ipAddrToAsciiEngine");
431  success = false;
432 
433  } else if ( !this->pending && pGlobal->labor.count () < 16u ) {
434  // put some reasonable limit on queue expansion
435  this->addr = addrIn;
436  this->pCB = & cbIn;
437  this->pending = true;
438  pGlobal->labor.add ( *this );
439  success = true;
440  }
441  else {
442  success = false;
443  }
444  }
445 
446  if ( success ) {
447  pGlobal->laborEvent.signal ();
448  }
449  else {
450  char autoNameTmp[256];
451  sockAddrToDottedIP ( & addrIn.sa, autoNameTmp,
452  sizeof ( autoNameTmp ) );
453  cbIn.transactionComplete ( autoNameTmp );
454  }
455 }
unsigned epicsStdCall sockAddrToDottedIP(const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:118
virtual void transactionComplete(const char *pHostName)=0
struct sockaddr sa
Definition: osiSock.h:158
static ipAddrToAsciiGlobal * pEngine
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
void ipAddrToAsciiTransactionPrivate::operator delete ( void *  )

Definition at line 271 of file ipAddrToAsciiAsynchronous.cpp.

272 {
273  // Visual C++ .net appears to require operator delete if
274  // placement operator delete is defined? I smell a ms rat
275  // because if I declare placement new and delete, but
276  // comment out the placement delete definition there are
277  // no undefined symbols.
278  errlogPrintf ( "%s:%d this compiler is confused about placement delete - memory was probably leaked",
279  __FILE__, __LINE__ );
280 }
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
void * ipAddrToAsciiTransactionPrivate::operator new ( size_t  size,
tsFreeList< ipAddrToAsciiTransactionPrivate, 0x80 > &  freeList 
)
inline

Definition at line 257 of file ipAddrToAsciiAsynchronous.cpp.

259 {
260  return freeList.allocate ( size );
261 }
void * allocate(size_t size)
Definition: tsFreeList.h:126
void ipAddrToAsciiTransactionPrivate::release ( )
virtual

Implements ipAddrToAsciiTransaction.

Definition at line 367 of file ipAddrToAsciiAsynchronous.cpp.

368 {
370  this->engine.pEngine->transactionFreeList.release ( this );
371 }
static ipAddrToAsciiGlobal * pEngine
void ipAddrToAsciiTransactionPrivate::show ( unsigned  level) const
virtual

Implements ipAddrToAsciiTransaction.

Definition at line 462 of file ipAddrToAsciiAsynchronous.cpp.

463 {
464  epicsGuard < epicsMutex > guard ( this->engine.pEngine->mutex );
465  char ipAddr [64];
466  sockAddrToDottedIP ( &this->addr.sa, ipAddr, sizeof ( ipAddr ) );
467  printf ( "ipAddrToAsciiTransactionPrivate for address %s\n", ipAddr );
468  if ( level > 0u ) {
469  printf ( "\tengine %p\n",
470  static_cast <void *> ( & this->engine ) );
471  this->pCB->show ( level - 1u );
472  }
473 }
unsigned epicsStdCall sockAddrToDottedIP(const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:118
#define printf
Definition: epicsStdio.h:41
virtual void show(unsigned level) const
static ipAddrToAsciiGlobal * pEngine

Member Data Documentation

ipAddrToAsciiEnginePrivate& ipAddrToAsciiTransactionPrivate::engine

Definition at line 51 of file ipAddrToAsciiAsynchronous.cpp.

ipAddrToAsciiCallBack* ipAddrToAsciiTransactionPrivate::pCB

Definition at line 52 of file ipAddrToAsciiAsynchronous.cpp.

bool ipAddrToAsciiTransactionPrivate::pending

Definition at line 53 of file ipAddrToAsciiAsynchronous.cpp.


The documentation for this class was generated from the following file: