// Function: cmptShutdown // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be stoped from an external source. // If the component is in the running state, this function will terminate all threads running in this file // This function will also close the Jms connection to the Node Manager and check out the component from the Node Manager int cmptShutdown(void) { double timeOutSec; if(cmpt->state != JAUS_SHUTDOWN_STATE) // Execute the shutdown routines only if the component is running { cmptRun = FALSE; timeOutSec = getTimeSeconds() + CMPT_THREAD_TIMEOUT_SEC; while(cmptThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(cmptThreadId); cmptThreadRunning = FALSE; cError("cmpt: cmptThread Shutdown Improperly\n"); break; } } nodeManagerClose(cmptNmi); // Close Node Manager Connection jausSubsystemDestroy(cmpt->node->subsystem); jausNodeDestroy(cmpt->node); jausServicesDestroy(cmpt->services); cmpt->state = JAUS_SHUTDOWN_STATE; propertiesDestroy(cmptProperties); } return 0; }
// Function: wdShutdown // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be stoped from an external source. // If the component is in the running state, this function will terminate all threads running in this file // This function will also close the Jms connection to the Node Manager and check out the component from the Node Manager int wdShutdown(void) { double timeOutSec; if(wd && wd->state != JAUS_SHUTDOWN_STATE) // Execute the shutdown routines only if the component is running { wdRun = FALSE; timeOutSec = getTimeSeconds() + WD_THREAD_TIMEOUT_SEC; while(wdThreadRunning) { SLEEP_MS(1000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(wdThreadId); wdThreadRunning = FALSE; //cError("wd: wdThread Shutdown Improperly\n"); break; } } nodeManagerClose(wdNmi); // Close Node Manager Connection jausSubsystemDestroy(wd->node->subsystem); jausNodeDestroy(wd->node); jausServicesDestroy(wd->services); wd->state = JAUS_SHUTDOWN_STATE; propertiesDestroy(wdProperties); } return 0; }
void ojCmptDestroy(OjCmpt ojCmpt) { RejectComponentControlMessage rejectComponentControl; JausMessage txMessage; int i = 0; if(ojCmpt->run == TRUE) { ojCmpt->run = FALSE; pthread_cond_signal(&ojCmpt->nmi->recvCondition); pthread_join(ojCmpt->thread, NULL); } if(ojCmpt->jaus->controller.active) { // Terminate control of current component rejectComponentControl = rejectComponentControlMessageCreate(); jausAddressCopy(rejectComponentControl->source, ojCmpt->jaus->address); jausAddressCopy(rejectComponentControl->destination, ojCmpt->jaus->controller.address); txMessage = rejectComponentControlMessageToJausMessage(rejectComponentControl); nodeManagerSend(ojCmpt->nmi, txMessage); jausMessageDestroy(txMessage); rejectComponentControlMessageDestroy(rejectComponentControl); } for(i=0; i<OJ_CMPT_MAX_INCOMING_SC_COUNT; i++) { if(ojCmpt->inConnection[i]) { if(ojCmpt->inConnection[i]->isActive) { scManagerTerminateServiceConnection(ojCmpt->nmi, ojCmpt->inConnection[i]); } serviceConnectionDestroy(ojCmpt->inConnection[i]); } } if(ojCmpt->messageCallback) { free(ojCmpt->messageCallback); } if(ojCmpt->nmi) { nodeManagerClose(ojCmpt->nmi); // Close Node Manager Connection } free(ojCmpt->jaus->identification); ojCmpt->jaus->identification = NULL; jausComponentDestroy(ojCmpt->jaus); free(ojCmpt); };
int ojCmptRun(OjCmpt ojCmpt) { pthread_attr_t attr; // Thread attributed for the component threads spawned in this function ojCmpt->run = TRUE; pthread_attr_init(&attr); if(pthread_create(&ojCmpt->thread, &attr, ojCmptThread, (void*)ojCmpt) != 0) { nodeManagerClose(ojCmpt->nmi); // Close Node Manager Connection free(ojCmpt->jaus->identification); ojCmpt->jaus->identification = NULL; jausComponentDestroy(ojCmpt->jaus); free(ojCmpt); pthread_attr_destroy(&attr); return -1; } pthread_attr_destroy(&attr); return 0; }