static void* d_waitsetEventHandler( void* userData) { d_subscriber subscriber; d_durability durability; d_admin admin; c_iter events; d_waitsetEntity we; c_time time; d_waitsetHelper helper; u_waitset userWaitset; u_waitsetEvent event; u_result ur; helper = d_waitsetHelper(userData); we = helper->entity; subscriber = d_waitsetGetSubscriber(helper->waitset); admin = d_subscriberGetAdmin(subscriber); durability = d_adminGetDurability(admin); time.seconds = 1; time.nanoseconds = 0; userWaitset = helper->userWaitset; ur = U_RESULT_OK; while((helper->terminate == FALSE) && (ur == U_RESULT_OK)) { events = NULL; if(helper->waitset->timedWait == TRUE){ ur = u_waitsetTimedWaitEvents(userWaitset, time,&events); } else { ur = u_waitsetWaitEvents(userWaitset,&events); } if(events && (ur == U_RESULT_OK)){/* events may be null if waitset was deleted*/ event = u_waitsetEvent(c_iterTakeFirst(events)); while(event){ /* Only dispatch event when durability is not terminating */ if (d_durabilityGetState(durability) != D_STATE_TERMINATING){ we->action(we->dispatcher, event, we->usrData); } u_waitsetEventFree(event); event = u_waitsetEvent(c_iterTakeFirst(events)); } c_iterFree(events); } } if(ur != U_RESULT_OK){ d_printTimedEvent(durability, D_LEVEL_SEVERE, we->name, "Waitset no longer available (result: %d). Fatal error, terminating now...\n", ur); OS_REPORT_1(OS_ERROR, D_CONTEXT_DURABILITY, 0, "Waitset no longer available (result: %d). Fatal error, terminating now...\n", ur); d_durabilityTerminate(durability); } return NULL; }
c_bool d_publisherDeleteDataWrite( d_publisher publisher, d_deleteData message, d_networkAddress addressee) { c_bool result; u_result ur; int resendCount; c_bool terminate; d_durability durability; OS_UNUSED_ARG(addressee); result = FALSE; assert(d_objectIsValid(d_object(publisher), D_PUBLISHER) == TRUE); if(publisher){ if(publisher->enabled == TRUE){ terminate = FALSE; resendCount = 0; durability = d_adminGetDurability(publisher->admin); d_publisherInitMessage(publisher, d_message(message)); d_message(message)->sequenceNumber = publisher->deleteDataNumber++; while((!result) && (!terminate)){ ur = u_writerWrite(publisher->deleteDataWriter, message, v_timeGet(), U_INSTANCEHANDLE_NIL); if(ur == U_RESULT_OK){ result = TRUE; } else if(ur == U_RESULT_TIMEOUT) { terminate = d_durabilityMustTerminate(durability); resendCount++; if(terminate){ d_printTimedEvent(durability, D_LEVEL_SEVERE, D_THREAD_UNSPECIFIED, "Failed to resend d_deleteData message, because durability is terminating.\n"); OS_REPORT(OS_WARNING, D_CONTEXT_DURABILITY, 0, "Failed to send d_deleteData message, because durability is terminating."); } else if((resendCount == 1) || ((resendCount % 5) == 0)){ d_printTimedEvent(durability, D_LEVEL_WARNING, D_THREAD_UNSPECIFIED, "Already tried to resend d_deleteData message '%d' times.\n", resendCount); if(resendCount != 1){ OS_REPORT_1(OS_WARNING, D_CONTEXT_DURABILITY, 0, "Already tried to resend d_deleteData message '%d' times.", resendCount); } } } else { d_printTimedEvent(durability, D_LEVEL_SEVERE, D_THREAD_UNSPECIFIED, "Write of d_deleteData message FAILED with result %d.\n", ur); OS_REPORT_1(OS_ERROR, D_CONTEXT_DURABILITY, 0, "Write of d_deleteData message FAILED with result %d.", ur); d_durabilityTerminate(durability, TRUE); terminate = d_durabilityMustTerminate(durability); } } } } return result; }
c_bool d_publisherStatusWrite( d_publisher publisher, d_status message, d_networkAddress addressee) { c_bool result; u_result ur; int resendCount; c_bool terminate; d_durability durability; OS_UNUSED_ARG(addressee); result = FALSE; assert(d_objectIsValid(d_object(publisher), D_PUBLISHER) == TRUE); if(publisher){ if(publisher->enabled == TRUE){ terminate = FALSE; resendCount = 0; durability = d_adminGetDurability(publisher->admin); d_publisherInitMessage(publisher, d_message(message)); d_message(message)->sequenceNumber = publisher->statusNumber++; while((!result) && (!terminate)){ ur = u_writerWrite(publisher->statusWriter, message, v_timeGet(), U_INSTANCEHANDLE_NIL); if(ur == U_RESULT_OK){ result = TRUE; } else if(ur == U_RESULT_TIMEOUT) { terminate = d_durabilityMustTerminate(durability); if(!terminate && d_message(message)->senderState == D_STATE_TERMINATING){ /* ES 21 - okt - 2011: * if durability is not yet terminating, but the message being written * does indicate that termination of durability is imminent, then we have * to prevent durability from constantly retrying in the case of a TIMEOUT * of the datawriter. The standard timeout provided to the write will ensure * the write is tried during the period of the timeout. But once that timeout is * exceeded then it is fruitless to continue try to write the terminating message * Without this specific code, durability will hang when terminating is caused * by splice daemon terminating. */ terminate = TRUE; } resendCount++; if(terminate){ d_printTimedEvent(durability, D_LEVEL_SEVERE, D_THREAD_UNSPECIFIED, "Failed to resend d_status message, because durability is terminating.\n"); OS_REPORT(OS_WARNING, D_CONTEXT_DURABILITY, 0, "Failed to send d_status message, because durability is terminating."); } else if((resendCount == 1) || ((resendCount % 5) == 0)){ d_printTimedEvent(durability, D_LEVEL_WARNING, D_THREAD_UNSPECIFIED, "Already tried to resend d_status message '%d' times.\n", resendCount); if(resendCount != 1){ OS_REPORT_1(OS_WARNING, D_CONTEXT_DURABILITY, 0, "Already tried to resend d_status message '%d' times.", resendCount); } } } else { d_printTimedEvent(durability, D_LEVEL_SEVERE, D_THREAD_UNSPECIFIED, "Write of d_status message FAILED with result %d.\n", ur); OS_REPORT_1(OS_ERROR, D_CONTEXT_DURABILITY, 0, "Write of d_status message FAILED with result %d.", ur); d_durabilityTerminate(durability, TRUE); terminate = d_durabilityMustTerminate(durability); } } } } return result; }