Ticket #474: option in ioqueue to control concurrency (to allow/disallow simultaneous/multiple callback calls)

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1789 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjlib/src/pjlib-test/ioq_tcp.c b/pjlib/src/pjlib-test/ioq_tcp.c
index c6e117d..106a964 100644
--- a/pjlib/src/pjlib-test/ioq_tcp.c
+++ b/pjlib/src/pjlib-test/ioq_tcp.c
@@ -232,7 +232,7 @@
 /*
  * Compliance test for success scenario.
  */
-static int compliance_test_0(void)
+static int compliance_test_0(pj_bool_t allow_concur)
 {
     pj_sock_t ssock=-1, csock0=-1, csock1=-1;
     pj_sockaddr_in addr, client_addr, rmt_addr;
@@ -292,6 +292,13 @@
 	status=-20; goto on_error;
     }
 
+    // Concurrency
+    rc = pj_ioqueue_set_default_concurrency(ioque, allow_concur);
+    if (rc != PJ_SUCCESS) {
+        app_perror("...ERROR in pj_ioqueue_set_default_concurrency()", rc);
+	status=-21; goto on_error;
+    }
+
     // Register server socket and client socket.
     rc = pj_ioqueue_register_sock(pool, ioque, ssock, NULL, &test_cb, &skey);
     if (rc == PJ_SUCCESS)
@@ -458,7 +465,7 @@
  * Compliance test for failed scenario.
  * In this case, the client connects to a non-existant service.
  */
-static int compliance_test_1(void)
+static int compliance_test_1(pj_bool_t allow_concur)
 {
     pj_sock_t csock1=PJ_INVALID_SOCKET;
     pj_sockaddr_in addr;
@@ -479,6 +486,12 @@
 	status=-20; goto on_error;
     }
 
+    // Concurrency
+    rc = pj_ioqueue_set_default_concurrency(ioque, allow_concur);
+    if (rc != PJ_SUCCESS) {
+	status=-21; goto on_error;
+    }
+
     // Create client socket
     rc = pj_sock_socket(pj_AF_INET(), pj_SOCK_STREAM(), 0, &csock1);
     if (rc != PJ_SUCCESS) {
@@ -581,7 +594,7 @@
 /*
  * Repeated connect/accept on the same listener socket.
  */
-static int compliance_test_2(void)
+static int compliance_test_2(pj_bool_t allow_concur)
 {
 #if defined(PJ_SYMBIAN) && PJ_SYMBIAN!=0
     enum { MAX_PAIR = 1, TEST_LOOP = 2 };
@@ -648,6 +661,13 @@
     }
 
 
+    // Concurrency
+    rc = pj_ioqueue_set_default_concurrency(ioque, allow_concur);
+    if (rc != PJ_SUCCESS) {
+        app_perror("...ERROR in pj_ioqueue_set_default_concurrency()", rc);
+	return -11;
+    }
+
     // Allocate buffers for send and receive.
     send_buf = (char*)pj_pool_alloc(pool, bufsize);
     recv_buf = (char*)pj_pool_alloc(pool, bufsize);
@@ -887,26 +907,28 @@
 }
 
 
-int tcp_ioqueue_test()
+static int tcp_ioqueue_test_impl(pj_bool_t allow_concur)
 {
     int status;
 
+    PJ_LOG(3,(THIS_FILE, "..testing with concurency=%d", allow_concur));
+
     PJ_LOG(3, (THIS_FILE, "..%s compliance test 0 (success scenario)",
 	       pj_ioqueue_name()));
-    if ((status=compliance_test_0()) != 0) {
+    if ((status=compliance_test_0(allow_concur)) != 0) {
 	PJ_LOG(1, (THIS_FILE, "....FAILED (status=%d)\n", status));
 	return status;
     }
     PJ_LOG(3, (THIS_FILE, "..%s compliance test 1 (failed scenario)",
                pj_ioqueue_name()));
-    if ((status=compliance_test_1()) != 0) {
+    if ((status=compliance_test_1(allow_concur)) != 0) {
 	PJ_LOG(1, (THIS_FILE, "....FAILED (status=%d)\n", status));
 	return status;
     }
 
     PJ_LOG(3, (THIS_FILE, "..%s compliance test 2 (repeated accept)",
                pj_ioqueue_name()));
-    if ((status=compliance_test_2()) != 0) {
+    if ((status=compliance_test_2(allow_concur)) != 0) {
 	PJ_LOG(1, (THIS_FILE, "....FAILED (status=%d)\n", status));
 	return status;
     }
@@ -914,6 +936,21 @@
     return 0;
 }
 
+int tcp_ioqueue_test()
+{
+    int rc;
+
+    rc = tcp_ioqueue_test_impl(PJ_TRUE);
+    if (rc != 0)
+	return rc;
+
+    rc = tcp_ioqueue_test_impl(PJ_FALSE);
+    if (rc != 0)
+	return rc;
+
+    return 0;
+}
+
 #endif	/* PJ_HAS_TCP */