diff --git a/src/core/ddsc/src/dds_reader.c b/src/core/ddsc/src/dds_reader.c index be1c045..c969768 100644 --- a/src/core/ddsc/src/dds_reader.c +++ b/src/core/ddsc/src/dds_reader.c @@ -253,25 +253,26 @@ void dds_reader_status_cb (void *ventity, const status_cb_data_t *data) st->not_alive_count_change++; break; case LIVELINESS_CHANGED_REMOVE_NOT_ALIVE: + st->not_alive_count--; + st->not_alive_count_change--; break; case LIVELINESS_CHANGED_REMOVE_ALIVE: st->alive_count--; - st->not_alive_count++; - st->not_alive_count_change++; + st->alive_count_change--; break; case LIVELINESS_CHANGED_ALIVE_TO_NOT_ALIVE: st->alive_count--; + st->alive_count_change--; st->not_alive_count++; st->not_alive_count_change++; break; case LIVELINESS_CHANGED_NOT_ALIVE_TO_ALIVE: st->not_alive_count--; + st->not_alive_count_change--; st->alive_count++; st->alive_count_change++; break; case LIVELINESS_CHANGED_TWITCH: - st->alive_count_change++; - st->not_alive_count_change++; break; } st->last_publication_handle = data->handle; diff --git a/src/core/ddsc/tests/entity_status.c b/src/core/ddsc/tests/entity_status.c index 4f1f94d..297f2cd 100644 --- a/src/core/ddsc/tests/entity_status.c +++ b/src/core/ddsc/tests/entity_status.c @@ -360,9 +360,9 @@ CU_Test(ddsc_entity, liveliness_changed, .init=init_entity_status, .fini=fini_en ret = dds_get_liveliness_changed_status (rea, &liveliness_changed); CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK); CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count, 0); - CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change, 0); - CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 1); - CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change,1); + CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change, -1); + CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 0); + CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change,0); CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_i_hdl); /* Second call should reset the changed count. */ @@ -370,7 +370,7 @@ CU_Test(ddsc_entity, liveliness_changed, .init=init_entity_status, .fini=fini_en CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK); CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count, 0); CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change, 0); - CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 1); + CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 0); CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change,0); CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_i_hdl); } diff --git a/src/core/ddsc/tests/listener.c b/src/core/ddsc/tests/listener.c index 2b5aa00..49a2915 100644 --- a/src/core/ddsc/tests/listener.c +++ b/src/core/ddsc/tests/listener.c @@ -1196,9 +1196,9 @@ CU_Test(ddsc_listener, liveliness_changed, .init=init_triggering_test, .fini=fin CU_ASSERT_EQUAL_FATAL(triggered & DDS_LIVELINESS_CHANGED_STATUS, DDS_LIVELINESS_CHANGED_STATUS); CU_ASSERT_EQUAL_FATAL(cb_reader, g_reader); CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.alive_count, 0); - CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.alive_count_change, 0); - CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.not_alive_count, 1); - CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.not_alive_count_change, 1); + CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.alive_count_change, -1); + CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.not_alive_count, 0); + CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.not_alive_count_change, 0); CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.last_publication_handle, writer_hdl); /* The listener should have reset the count_change. */ @@ -1206,7 +1206,7 @@ CU_Test(ddsc_listener, liveliness_changed, .init=init_triggering_test, .fini=fin CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK); CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count, 0); CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change, 0); - CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 1); + CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 0); CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change, 0); CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_hdl); } diff --git a/src/core/ddsc/tests/liveliness.c b/src/core/ddsc/tests/liveliness.c index 189752a..cf876aa 100644 --- a/src/core/ddsc/tests/liveliness.c +++ b/src/core/ddsc/tests/liveliness.c @@ -530,7 +530,7 @@ CU_Test(ddsc_liveliness, create_delete_writer_stress, .init = liveliness_init, . dds_entity_t waitset; dds_qos_t *wqos; struct dds_liveliness_changed_status lstatus; - uint32_t wr_cnt = 0; + uint32_t alive_writers_auto = 0, alive_writers_man = 0; char name[100]; dds_qos_t *rqos; dds_attach_t triggered; @@ -556,6 +556,7 @@ CU_Test(ddsc_liveliness, create_delete_writer_stress, .init = liveliness_init, . dds_qset_liveliness(wqos, DDS_LIVELINESS_MANUAL_BY_PARTICIPANT, DDS_MSECS (500)); CU_ASSERT_FATAL((writers[0] = dds_create_writer(g_pub_participant, pub_topic, wqos, NULL)) > 0); CU_ASSERT_EQUAL_FATAL(dds_waitset_wait(waitset, &triggered, 1, DDS_MSECS(1000)), 1); + alive_writers_man++; /* create writers */ for (n = 1; n < MAX_WRITERS; n++) @@ -565,24 +566,37 @@ CU_Test(ddsc_liveliness, create_delete_writer_stress, .init = liveliness_init, . dds_write (writers[n], &sample); if (n % 3 == 2) dds_delete(writers[n]); + else if (n % 2) + alive_writers_auto++; + else + alive_writers_man++; } dds_delete_qos(wqos); + printf("alive_writers_auto: %d, alive_writers_man: %d\n", alive_writers_auto, alive_writers_man); - /* wait for all writers to become alive */ - while (wr_cnt < MAX_WRITERS) + /* wait for auto liveliness writers to become alive and manual-by-pp writers to become not-alive */ + do { CU_ASSERT_EQUAL_FATAL(dds_get_liveliness_changed_status (reader, &lstatus), DDS_RETCODE_OK); - wr_cnt += (uint32_t)lstatus.alive_count_change; + printf("alive: %d, not-alive: %d\n", lstatus.alive_count, lstatus.not_alive_count); dds_sleepfor (DDS_MSECS(50)); } - CU_ASSERT_EQUAL_FATAL (wr_cnt, MAX_WRITERS); + while (lstatus.alive_count != alive_writers_auto || lstatus.not_alive_count != alive_writers_man); /* cleanup remaining writers */ - for (n = 0; n < wr_cnt; n++) + for (n = 0; n < MAX_WRITERS; n++) { if (n % 3 != 2) CU_ASSERT_EQUAL_FATAL(dds_delete(writers[n]), DDS_RETCODE_OK); } + /* wait for alive_count and not_alive_count to become 0 */ + do + { + CU_ASSERT_EQUAL_FATAL(dds_get_liveliness_changed_status (reader, &lstatus), DDS_RETCODE_OK); + printf("alive: %d, not: %d\n", lstatus.alive_count, lstatus.not_alive_count); + dds_sleepfor (DDS_MSECS(50)); + } + while (lstatus.alive_count > 0 || lstatus.not_alive_count > 0); CU_ASSERT_EQUAL_FATAL(dds_waitset_detach(waitset, reader), DDS_RETCODE_OK); CU_ASSERT_EQUAL_FATAL(dds_delete(waitset), DDS_RETCODE_OK); CU_ASSERT_EQUAL_FATAL(dds_delete(reader), DDS_RETCODE_OK);