DDS_WaitSet* waitset = DDS_WaitSet_new();
DDS_Condition* cond1 = ...; DDS_Condition* cond2 = DDS_StatusCondition_as_condition( DDS_Entity_get_statuscondition(entity)); DDS_Condition* cond3 = DDS_ReadCondition_as_condition( DDS_DataReader_create_readcondition( reader, DDS_NOT_READ_SAMPLE_STATE, DDS_ANY_VIEW_STATE, DDS_ANY_INSTANCE_STATE)); DDS_Condition* cond4 = DDS_GuardCondition_as_condition( DDS_GuardCondition_new()); DDS_Condition* cond5 = ...; DDS_ReturnCode_t retcode; retcode = DDS_WaitSet_attach_condition(waitset, cond1); if (retcode != DDS_RETCODE_OK) { /* ... error */ } retcode = DDS_WaitSet_attach_condition(waitset, cond2); if (retcode != DDS_RETCODE_OK) { /* ... error */ } retcode = DDS_WaitSet_attach_condition(waitset, cond3); if (retcode != DDS_RETCODE_OK) { /* ... error */ } retcode = DDS_WaitSet_attach_condition(waitset, cond4); if (retcode != DDS_RETCODE_OK) { /* ... error */ } retcode = DDS_WaitSet_attach_condition(waitset, cond5); if (retcode != DDS_RETCODE_OK) { /* ... error */ }
timeout
, whichever occurs first #define TRUE 1 #define FALSE 0 struct DDS_Duration_t timeout = { 0, 1000000 }; /* 1ms */ struct DDS_ConditionSeq active_conditions = DDS_SEQUENCE_INITIALIZER; /* holder for active conditions */ int is_cond1_triggered = FALSE; int is_cond2_triggered = FALSE; int i; DDS_ReturnCode_t retcode; retcode = DDS_WaitSet_wait(waitset, &active_conditions, &timeout); if (retcode != DDS_RETCODE_OK) { /* ... check for cause of failure */ } else { /* success */ if (DDS_ConditionSeq_get_length(&active_conditions) == 0) { /* timeout! */ printf("Wait timed out!! None of the conditions was triggered.\n"); } else { /* check if "cond1" or "cond2" are triggered: */ for(i = 0; i < DDS_ConditionSeq_get_length(&active_conditions); ++i) { if (DDS_ConditionSeq_get(&active_conditions, i) == cond1) { printf("Cond1 was triggered!"); is_cond1_triggered = TRUE; } if (DDS_ConditionSeq_get(&active_conditions, i) == cond2) { printf("Cond2 was triggered!"); is_cond2_triggered = TRUE; } if (is_cond1_triggered && is_cond2_triggered) { break; } } } } if (is_cond1_triggered) { /* ... do something because "cond1" was triggered ... */ } if (is_cond2_triggered) { /* ... do something because "cond2" was triggered ... */ }
DDS_WaitSet_delete(waitset); waitset = NULL;