INT32 pmdSignalTestEntryPoint( pmdEDUCB *cb, void *arg ) { pmdEDUCB *mainCB = ( pmdEDUCB* )arg ; INT32 interval = pmdGetOptionCB()->getSignalInterval() ; UINT32 timeCounter = 0 ; while( !cb->isDisconnected() ) { ossSleep( OSS_ONE_SEC ) ; ++timeCounter ; interval = pmdGetOptionCB()->getSignalInterval() ; if ( interval > 0 && timeCounter > (UINT32)interval ) { ossPThreadKill( mainCB->getThreadID(), OSS_TEST_SIGNAL ) ; timeCounter = 0 ; } } return SDB_OK ; }
// PD_TRACE_DECLARE_FUNCTION ( SDB_PMDEDUUSERTRAPHNDL, "pmdEDUUserTrapHandler" ) void pmdEDUUserTrapHandler( OSS_HANDPARMS ) { #if defined( SDB_ENGINE ) INT32 rc = SDB_OK ; PD_TRACE_ENTRY ( SDB_PMDEDUUSERTRAPHNDL ); oss_edu_data * pEduData = NULL ; const CHAR *dumpPath = ossGetTrapExceptionPath () ; if ( !dumpPath ) { goto done ; } pEduData = ossGetThreadEDUData() ; if ( NULL == pEduData ) { goto done ; } if ( OSS_AM_I_INSIDE_SIGNAL_HANDLER( pEduData ) ) { goto done ; } OSS_ENTER_SIGNAL_HANDLER( pEduData ) ; if ( signum == OSS_STACK_DUMP_SIGNAL ) { PD_LOG ( PDEVENT, "Signal %d is received, " "prepare to dump stack for all threads", signum ) ; std::set<pthread_t>::iterator it ; std::set<pthread_t> tidList ; pmdGetKRCB()->getEDUMgr()->getEDUThreadID ( tidList ) ; for ( it = tidList.begin(); it != tidList.end(); ++it ) { if ( 0 == (*it) ) { continue ; } rc = ossPThreadKill ( (*it), OSS_STACK_DUMP_SIGNAL_INTERNAL ) ; if ( rc ) { PD_LOG ( PDWARNING, "Failed to send signal %d to thread %llu, " "errno = %d", OSS_STACK_DUMP_SIGNAL_INTERNAL, (*it), ossGetLastError() ) ; } } ossMemTrace ( dumpPath ) ; } else if ( signum == OSS_STACK_DUMP_SIGNAL_INTERNAL ) { PD_LOG ( PDEVENT, "Signal %d is received, " "prepare to dump stack for %u:%u", signum, ossGetCurrentProcessID(), ossGetCurrentThreadID() ) ; ossStackTrace( OSS_HANDARGS, dumpPath ) ; } else { PD_LOG ( PDWARNING, "Unexpected signal is received: %d", signum ) ; } OSS_LEAVE_SIGNAL_HANDLER( pEduData ) ; done : PD_TRACE1 ( SDB_PMDEDUUSERTRAPHNDL, PD_PACK_INT(rc) ); PD_TRACE_EXIT ( SDB_PMDEDUUSERTRAPHNDL ) ; #endif // SDB_ENGINE return ; }