ncs_leap_startup return code error if the node_id file is missing.
The return code error is expected. But in the ticket-3266 support
for running agent before opensafd. So the test case SysfIpcTest
need to running under opensaf cluster.
In this ticket, I move the unit test run as google-test to the apitest
---
opensaf.spec.in | 1 +
src/base/Makefile.am | 19 ++-
src/base/apitest/Makefile.am | 18 +++
src/base/apitest/basetest.c | 78 +++++++++
src/base/apitest/basetest.h | 28 ++++
src/base/apitest/sysf_ipc_test.c | 265 +++++++++++++++++++++++++++++++
src/base/tests/sysf_ipc_test.cc | 238 ---------------------------
7 files changed, 408 insertions(+), 239 deletions(-)
create mode 100644 src/base/apitest/Makefile.am
create mode 100644 src/base/apitest/basetest.c
create mode 100644 src/base/apitest/basetest.h
create mode 100644 src/base/apitest/sysf_ipc_test.c
delete mode 100644 src/base/tests/sysf_ipc_test.cc
diff --git a/opensaf.spec.in b/opensaf.spec.in
index 6c6b61500..703615af0 100644
--- a/opensaf.spec.in
+++ b/opensaf.spec.in
@@ -1526,6 +1526,7 @@ fi
%{_bindir}/logtest
%{_bindir}/saflogtest
%{_bindir}/logtestfr
+%{_bindir}/basetest
%{_bindir}/msgtest
%{_bindir}/ntftest
%{_bindir}/ntf_search_criteria_test.sh
diff --git a/src/base/Makefile.am b/src/base/Makefile.am
index 5082175cf..367b21910 100644
--- a/src/base/Makefile.am
+++ b/src/base/Makefile.am
@@ -191,7 +191,6 @@ bin_testleap_LDFLAGS = \
bin_testleap_SOURCES = \
src/base/tests/sa_tmr_test.cc \
- src/base/tests/sysf_ipc_test.cc \
src/base/tests/sysf_tmr_test.cc
bin_testleap_LDADD = \
@@ -280,3 +279,21 @@ bin_core_common_test_LDADD = \
$(GTEST_DIR)/lib/libgtest_main.la \
$(GMOCK_DIR)/lib/libgmock.la \
$(GMOCK_DIR)/lib/libgmock_main.la
+
+bin_PROGRAMS += bin/basetest
+
+noinst_HEADERS += \
+ src/base/apitest/basetest.h
+
+bin_basetest_CFLAGS = $(AM_CFLAGS) -Wformat=1
+
+bin_basetest_CPPFLAGS = $(AM_CPPFLAGS)
+
+bin_basetest_SOURCES = \
+ src/base/apitest/basetest.c \
+ src/base/apitest/sysf_ipc_test.c
+
+bin_basetest_LDADD = \
+ lib/libapitest.la \
+ lib/libosaf_common.la \
+ lib/libopensaf_core.la
diff --git a/src/base/apitest/Makefile.am b/src/base/apitest/Makefile.am
new file mode 100644
index 000000000..6abef4edb
--- /dev/null
+++ b/src/base/apitest/Makefile.am
@@ -0,0 +1,18 @@
+# -*- OpenSAF -*-
+#
+# (C) Copyright 2021 The OpenSAF Foundation
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+# under the GNU Lesser General Public License Version 2.1, February 1999.
+# The complete license can be accessed from the following location:
+# http://opensource.org/licenses/lgpl-license.php
+# See the Copying file included with the OpenSAF distribution for full
+# licensing terms.
+#
+# Author(s): Ericsson AB
+#
+
+all:
+ $(MAKE) -C ../../.. bin/basetest
diff --git a/src/base/apitest/basetest.c b/src/base/apitest/basetest.c
new file mode 100644
index 000000000..6af7e9329
--- /dev/null
+++ b/src/base/apitest/basetest.c
@@ -0,0 +1,78 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2021 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "base/apitest/basetest.h"
+#include <unistd.h>
+
+void usage(const char *progname)
+{
+ printf("Usage: %s [-h] [--help] [suite [testcase]]\n\n", progname);
+ printf("OPTIONS:\n");
+ printf("\t-h, --help this help\n");
+ printf("\tsuite suite for testing. 0 for listing all tests\n");
+ printf("\ttestcase test case for testing in specific suite\n");
+}
+
+int main(int argc, char **argv)
+{
+ int suite = ALL_SUITES, tcase = ALL_TESTS;
+ int rc = 0;
+ int i;
+ int index = 0;
+ int failed = 0;
+ char *endptr;
+
+ srandom(getpid());
+
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
+ usage(basename(argv[0]));
+ return 0;
+ } else if (index == 0) {
+ suite = strtol(argv[i], &endptr, 10);
+ if (endptr && *endptr) {
+ failed = 1;
+ } else {
+ index++;
+ }
+ } else if (index == 1) {
+ tcase = strtol(argv[i], &endptr, 10);
+ if (endptr && *endptr) {
+ failed = 1;
+ } else {
+ index++;
+ }
+ } else {
+ failed = 1;
+ }
+
+ if (failed) {
+ fprintf(stderr,
+ "Try '%s --help' for more information\n",
+ argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
+
+ if (suite == 0) {
+ test_list();
+ } else {
+ rc = test_run(suite, tcase);
+ }
+
+ return rc;
+}
diff --git a/src/base/apitest/basetest.h b/src/base/apitest/basetest.h
new file mode 100644
index 000000000..9217b36f2
--- /dev/null
+++ b/src/base/apitest/basetest.h
@@ -0,0 +1,28 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2021 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#ifndef BASE_APITEST_BASETEST_H_
+#define BASE_APITEST_BASETEST_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "osaf/apitest/utest.h"
+#include "osaf/apitest/util.h"
+
+#endif // BASE_APITEST_BASETEST_H_
diff --git a/src/base/apitest/sysf_ipc_test.c b/src/base/apitest/sysf_ipc_test.c
new file mode 100644
index 000000000..dcdcfce07
--- /dev/null
+++ b/src/base/apitest/sysf_ipc_test.c
@@ -0,0 +1,265 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2021 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "base/apitest/basetest.h"
+#include "base/ncs_main_papi.h"
+#include "base/sysf_ipc.h"
+#include <poll.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdatomic.h>
+#include <string.h>
+#include <unistd.h>
+
+atomic_int no_of_msgs_sent;
+SYSF_MBX mbox;
+
+typedef struct message_ {
+ struct message_ *next;
+ NCS_IPC_PRIORITY prio;
+ int seq_no;
+} Message;
+
+static bool mbox_clean(NCSCONTEXT arg, NCSCONTEXT msg)
+{
+ Message *curr;
+
+ /* clean the entire mailbox */
+ for (curr = (Message *)msg; curr;) {
+ Message *temp = curr;
+ curr = curr->next;
+
+ free(temp);
+ }
+ return true;
+}
+
+static int send_msg(NCS_IPC_PRIORITY prio, int seq_no)
+{
+ Message *msg = NULL;
+
+ msg = (Message *)calloc(1, sizeof(Message));
+ msg->prio = prio;
+ msg->seq_no = seq_no;
+ return m_NCS_IPC_SEND(&mbox, msg, prio);
+}
+
+static bool recv_msg(NCS_IPC_PRIORITY prio, int seq_no)
+{
+ Message *msg;
+
+ bool is_success = false;
+
+ msg = (Message *)(ncs_ipc_non_blk_recv(&mbox));
+ if (msg == NULL) {
+ fprintf(stderr, "ncs_ipc_non_blk_recv failed\n");
+ } else {
+ is_success = msg->prio == prio && msg->seq_no == seq_no;
+ free(msg);
+ }
+ return is_success;
+}
+
+static void *message_sender()
+{
+ srand(time(NULL));
+
+ Message *msg = NULL;
+ for (int i = 0; i < 60; ++i) {
+ int prio = (random() % 3) + 1;
+ msg = (Message *)calloc(1, sizeof(Message));
+ msg->prio = (NCS_IPC_PRIORITY)prio;
+ msg->seq_no = i;
+
+ int rc = m_NCS_IPC_SEND(&mbox, msg, msg->prio);
+ assert(rc == NCSCC_RC_SUCCESS && "m_NCS_IPC_SEND failed");
+
+ no_of_msgs_sent++;
+
+ sched_yield();
+ }
+ return NULL;
+}
+
+static void *message_receiver()
+{
+ NCS_SEL_OBJ mbox_fd;
+ struct pollfd fds;
+ bool done = false;
+ Message *msg;
+ int no_of_msgs_received = 0;
+
+ mbox_fd = ncs_ipc_get_sel_obj(&mbox);
+
+ fds.fd = mbox_fd.rmv_obj;
+ fds.events = POLLIN;
+
+ while (!done) {
+ int rc = poll(&fds, 1, -1);
+
+ if (rc == -1) {
+ if (errno == EINTR) {
+ continue;
+ }
+ assert(rc == 0);
+ }
+
+ if (fds.revents & POLLIN) {
+ while ((msg = (Message *)(ncs_ipc_non_blk_recv(
+ &mbox))) != NULL) {
+ no_of_msgs_received++;
+
+ if (msg->seq_no == 4711) {
+ done = true;
+ }
+ free(msg);
+ }
+ }
+ }
+
+ rc_validate(no_of_msgs_received, no_of_msgs_sent);
+ return NULL;
+}
+
+void test_send_receive_message(void)
+{
+ Message *msg;
+ int rc = NCSCC_RC_SUCCESS;
+
+ if ((rc = ncs_leap_startup()) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "ncs_leap_startup failed\n");
+ test_validate(rc, NCSCC_RC_SUCCESS);
+ goto leap_shutdown;
+ }
+
+ if ((rc = m_NCS_IPC_CREATE(&mbox)) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_CREATE failed\n");
+ test_validate(rc, NCSCC_RC_SUCCESS);
+ goto ipc_release;
+ }
+
+ if ((rc = m_NCS_IPC_ATTACH(&mbox)) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_ATTACH failed\n");
+ test_validate(rc, NCSCC_RC_SUCCESS);
+ goto ipc_detach;
+ }
+
+ NCS_IPC_PRIORITY prio[] = {
+ NCS_IPC_PRIORITY_LOW, NCS_IPC_PRIORITY_NORMAL,
+ NCS_IPC_PRIORITY_HIGH, NCS_IPC_PRIORITY_VERY_HIGH};
+ // send messages
+ for (size_t i = 0; i < 8; i++) {
+ if ((rc = send_msg(prio[i / 2], i % 2 == 0 ? 1 : 2)) !=
+ NCSCC_RC_SUCCESS) {
+ test_validate(rc, NCSCC_RC_SUCCESS);
+ goto tear_down;
+ }
+ }
+
+ // receive messages
+ for (size_t i = 8; i > 0; i--) {
+ if (!recv_msg(prio[(i - 1) / 2], i % 2 == 0 ? 1 : 2)) {
+ test_validate(false, true);
+ goto tear_down;
+ }
+ }
+
+ msg = (Message *)(ncs_ipc_non_blk_recv(&mbox));
+ bool is_null = msg == NULL ? true : false;
+ test_validate(is_null, true);
+
+tear_down:
+ipc_detach:
+ if (m_NCS_IPC_DETACH(&mbox, mbox_clean, 0) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_DETACH failed\n");
+ }
+
+ipc_release:
+ if (m_NCS_IPC_RELEASE(&mbox, 0) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_RELEASE failed\n");
+ }
+
+leap_shutdown:
+ ncs_leap_shutdown();
+}
+
+void test_thread_send_receive_message(void)
+{
+ pthread_t sndr_thread[5];
+ pthread_t msg_receiver;
+ int rc = NCSCC_RC_SUCCESS;
+
+ if ((rc = ncs_leap_startup()) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "ncs_leap_startup failed\n");
+ test_validate(rc, NCSCC_RC_SUCCESS);
+ goto leap_shutdown;
+ }
+
+ if ((rc = m_NCS_IPC_CREATE(&mbox)) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_CREATE failed\n");
+ test_validate(rc, NCSCC_RC_SUCCESS);
+ goto ipc_release;
+ }
+
+ if ((rc = m_NCS_IPC_ATTACH(&mbox)) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_ATTACH failed\n");
+ test_validate(rc, NCSCC_RC_SUCCESS);
+ goto ipc_detach;
+ }
+
+ srand(time(NULL));
+ assert(!pthread_create(&msg_receiver, NULL, message_receiver, NULL));
+
+ for (int i = 0; i < 5; ++i) {
+ assert(!pthread_create(&sndr_thread[i], NULL, message_sender,
+ NULL));
+ }
+
+ for (int i = 0; i < 5; ++i) {
+ pthread_join(sndr_thread[i], NULL);
+ }
+
+ sched_yield();
+
+ no_of_msgs_sent++;
+
+ send_msg(NCS_IPC_PRIORITY_LOW, 4711);
+
+ pthread_join(msg_receiver, NULL);
+
+ipc_detach:
+ if (m_NCS_IPC_DETACH(&mbox, mbox_clean, 0) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_DETACH failed\n");
+ }
+
+ipc_release:
+ if (m_NCS_IPC_RELEASE(&mbox, 0) != NCSCC_RC_SUCCESS) {
+ fprintf(stderr, "m_NCS_IPC_RELEASE failed\n");
+ }
+
+leap_shutdown:
+ ncs_leap_shutdown();
+}
+
+__attribute__((constructor)) static void sysf_ipc_test_constructor(void)
+{
+ test_suite_add(1, "SysfIpcTest");
+ test_case_add(1, test_send_receive_message,
+ "Tests send and receive messages");
+ test_case_add(1, test_thread_send_receive_message,
+ "Tests threads sending and receiving messages");
+}
diff --git a/src/base/tests/sysf_ipc_test.cc b/src/base/tests/sysf_ipc_test.cc
deleted file mode 100644
index c6ce83197..000000000
--- a/src/base/tests/sysf_ipc_test.cc
+++ /dev/null
@@ -1,238 +0,0 @@
-/* -*- OpenSAF -*-
- *
- * (C) Copyright 2015 The OpenSAF Foundation
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
- * under the GNU Lesser General Public License Version 2.1, February 1999.
- * The complete license can be accessed from the following location:
- * http://opensource.org/licenses/lgpl-license.php
- * See the Copying file included with the OpenSAF distribution for full
- * licensing terms.
- *
- * Author(s): Ericsson AB
- *
- */
-
-#include <poll.h>
-#include <sched.h>
-#include <unistd.h>
-#include <atomic>
-#include <cstdlib>
-#include <ctime>
-#include <iostream>
-#include <string>
-#include <thread>
-#include "base/ncs_main_papi.h"
-#include "base/sysf_ipc.h"
-#include "gtest/gtest.h"
-
-typedef struct message_ {
- struct message_ *next;
- NCS_IPC_PRIORITY prio;
- int seq_no;
-} Message;
-
-bool mbox_clean(NCSCONTEXT arg, NCSCONTEXT msg) {
- Message *curr;
-
- /* clean the entire mailbox */
- for (curr = (Message *)msg; curr;) {
- Message *temp = curr;
- curr = curr->next;
-
- delete temp;
- }
- return true;
-}
-
-// The fixture for testing c-function sysf_ipc
-class SysfIpcTest : public ::testing::Test {
- public:
- protected:
- SysfIpcTest() {
- // Setup work can be done here for each test.
- no_of_msgs_sent = 0;
- }
-
- virtual ~SysfIpcTest() {
- // Cleanup work that doesn't throw exceptions here.
- }
-
- // If the constructor and destructor are not enough for setting up
- // and cleaning up each test, you can define the following methods:
-
- // cppcheck-suppress unusedFunction
- virtual void SetUp() {
- // Code here will be called immediately after the constructor (right
- // before each test).
- ncs_leap_startup();
- // see ticket #1629, return code should be ok
- // ASSERT_EQ(rc, NCSCC_RC_SUCCESS);
-
- int rc = m_NCS_IPC_CREATE(&mbox);
- ASSERT_EQ(rc, NCSCC_RC_SUCCESS);
-
- rc = m_NCS_IPC_ATTACH(&mbox);
- ASSERT_EQ(rc, NCSCC_RC_SUCCESS);
- }
-
- // cppcheck-suppress unusedFunction
- virtual void TearDown() {
- // Code here will be called immediately after each test (right
- // before the destructor).
- int rc = m_NCS_IPC_DETACH(&mbox, mbox_clean, 0);
- ASSERT_EQ(rc, NCSCC_RC_SUCCESS);
-
- rc = m_NCS_IPC_RELEASE(&mbox, 0);
- ASSERT_EQ(rc, NCSCC_RC_SUCCESS);
-
- // see ticket #1629, calling ncs_leap_shutdown causes a segv.
- // ncs_leap_shutdown();
- }
-
- void send_msg(NCS_IPC_PRIORITY prio, int seq_no) {
- Message *msg;
-
- msg = new Message;
- msg->prio = prio;
- msg->seq_no = seq_no;
- int rc = m_NCS_IPC_SEND(&mbox, msg, prio);
- ASSERT_EQ(rc, NCSCC_RC_SUCCESS);
- }
-
- void recv_msg(NCS_IPC_PRIORITY prio, int seq_no) {
- Message *msg;
-
- msg = reinterpret_cast<Message *>(ncs_ipc_non_blk_recv(&mbox));
- ASSERT_TRUE(msg != NULL);
- ASSERT_EQ(msg->prio, prio);
- ASSERT_EQ(msg->seq_no, seq_no);
- delete msg;
- }
-
- //
- static void MessageReceiver();
-
- //
- static void MessageSender() {
- srand(time(NULL));
-
- for (int i = 0; i < 60; ++i) {
- Message *msg = new Message;
-
- int prio = (random() % 3) + 1;
- msg->prio = (NCS_IPC_PRIORITY)prio;
- msg->seq_no = i;
-
- int rc = m_NCS_IPC_SEND(&mbox, msg, msg->prio);
- EXPECT_EQ(rc, NCSCC_RC_SUCCESS);
-
- no_of_msgs_sent++;
-
- sched_yield();
- }
- }
-
- // Objects declared here can be used by all tests in the test case.
-
- static SYSF_MBX mbox;
- static std::atomic<int> no_of_msgs_sent;
-};
-
-SYSF_MBX SysfIpcTest::mbox{0};
-std::atomic<int> SysfIpcTest::no_of_msgs_sent{0};
-
-void SysfIpcTest::MessageReceiver() {
- NCS_SEL_OBJ mbox_fd;
- pollfd fds;
- bool done = false;
- Message *msg;
- int no_of_msgs_received{0};
-
- mbox_fd = ncs_ipc_get_sel_obj(&mbox);
-
- fds.fd = mbox_fd.rmv_obj;
- fds.events = POLLIN;
-
- while (!done) {
- int rc = poll(&fds, 1, -1);
-
- if (rc == -1) {
- if (errno == EINTR) {
- continue;
- }
- ASSERT_EQ(rc, 0);
- }
-
- if (fds.revents & POLLIN) {
- while ((msg = reinterpret_cast<Message *>(ncs_ipc_non_blk_recv(&mbox)))
!=
- NULL) {
- no_of_msgs_received++;
-
- if (msg->seq_no == 4711) {
- done = true;
- }
-
- delete msg;
- }
- }
- }
-
- ASSERT_EQ(no_of_msgs_received, no_of_msgs_sent);
-}
-
-// Tests send and receive
-TEST_F(SysfIpcTest, TestSendReceiveMessage) {
- Message *msg;
-
- // send messages
- send_msg(NCS_IPC_PRIORITY_LOW, 1);
- send_msg(NCS_IPC_PRIORITY_LOW, 2);
- send_msg(NCS_IPC_PRIORITY_NORMAL, 1);
- send_msg(NCS_IPC_PRIORITY_NORMAL, 2);
- send_msg(NCS_IPC_PRIORITY_HIGH, 1);
- send_msg(NCS_IPC_PRIORITY_HIGH, 2);
- send_msg(NCS_IPC_PRIORITY_VERY_HIGH, 1);
- send_msg(NCS_IPC_PRIORITY_VERY_HIGH, 2);
-
- // receive messages
- recv_msg(NCS_IPC_PRIORITY_VERY_HIGH, 1);
- recv_msg(NCS_IPC_PRIORITY_VERY_HIGH, 2);
- recv_msg(NCS_IPC_PRIORITY_HIGH, 1);
- recv_msg(NCS_IPC_PRIORITY_HIGH, 2);
- recv_msg(NCS_IPC_PRIORITY_NORMAL, 1);
- recv_msg(NCS_IPC_PRIORITY_NORMAL, 2);
- recv_msg(NCS_IPC_PRIORITY_LOW, 1);
- recv_msg(NCS_IPC_PRIORITY_LOW, 2);
-
- msg = reinterpret_cast<Message *>(ncs_ipc_non_blk_recv(&mbox));
- EXPECT_TRUE(msg == NULL);
-}
-
-// Tests threads sending and receiving messages
-TEST_F(SysfIpcTest, TestThreadsSendReceiveMessage) {
- std::thread sndr_thread[5];
- srand(time(NULL));
-
- std::thread msg_receiver{MessageReceiver};
-
- ASSERT_EQ(msg_receiver.joinable(), true);
-
- for (int i = 0; i < 5; ++i) {
- sndr_thread[i] = std::thread{MessageSender};
- }
-
- for (int i = 0; i < 5; ++i) {
- sndr_thread[i].join();
- }
-
- sched_yield();
-
- no_of_msgs_sent++;
-
- send_msg(NCS_IPC_PRIORITY_LOW, 4711);
-
- msg_receiver.join();
-}
--
2.25.1
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel