summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-06-28 15:23:18 +0000
committerBenny Prijono <bennylp@teluu.com>2006-06-28 15:23:18 +0000
commitba4c0662d0f0896ebc73d9259f64a38e58517075 (patch)
tree51ac83b6924cd52f9378a321d2d86bef5645da34
parentf7f385b10e9b7a6dce0ca896005c0493ab335584 (diff)
Fixed bug in ioqueue IOCP: accept() callback is called with new socket handle already reset to -1
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@559 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjlib/src/pj/ioqueue_winnt.c2
-rw-r--r--pjlib/src/pjlib-test/ioq_tcp.c21
-rw-r--r--pjlib/src/pjlib-test/test.h2
3 files changed, 18 insertions, 7 deletions
diff --git a/pjlib/src/pj/ioqueue_winnt.c b/pjlib/src/pj/ioqueue_winnt.c
index 4586c5ca..5c2a79d9 100644
--- a/pjlib/src/pj/ioqueue_winnt.c
+++ b/pjlib/src/pj/ioqueue_winnt.c
@@ -184,7 +184,6 @@ static void ioqueue_on_accept_complete(ioqueue_accept_rec *accept_overlapped)
if (accept_overlapped->newsock_ptr)
*accept_overlapped->newsock_ptr = accept_overlapped->newsock;
accept_overlapped->operation = 0;
- accept_overlapped->newsock = PJ_INVALID_SOCKET;
}
static void erase_connecting_socket( pj_ioqueue_t *ioqueue, unsigned pos)
@@ -632,6 +631,7 @@ static pj_bool_t poll_iocp( HANDLE hIocp, DWORD dwTimeout,
(pj_ioqueue_op_key_t*)pOv,
accept_rec->newsock,
PJ_SUCCESS);
+ accept_rec->newsock = PJ_INVALID_SOCKET;
}
break;
case PJ_IOQUEUE_OP_CONNECT:
diff --git a/pjlib/src/pjlib-test/ioq_tcp.c b/pjlib/src/pjlib-test/ioq_tcp.c
index 8f2d74d0..7f004d9f 100644
--- a/pjlib/src/pjlib-test/ioq_tcp.c
+++ b/pjlib/src/pjlib-test/ioq_tcp.c
@@ -82,11 +82,22 @@ static void on_ioqueue_accept(pj_ioqueue_key_t *key,
pj_sock_t sock,
int status)
{
- PJ_UNUSED_ARG(sock);
-
- callback_accept_key = key;
- callback_accept_op = op_key;
- callback_accept_status = status;
+ if (sock == PJ_INVALID_SOCKET) {
+
+ if (status != PJ_SUCCESS) {
+ /* Ignore. Could be blocking error */
+ app_perror(".....warning: received error in on_ioqueue_accept() callback",
+ status);
+ } else {
+ callback_accept_status = -61;
+ PJ_LOG(3,("", "..... on_ioqueue_accept() callback was given "
+ "invalid socket and status is %d", status));
+ }
+ } else {
+ callback_accept_key = key;
+ callback_accept_op = op_key;
+ callback_accept_status = status;
+ }
}
static void on_ioqueue_connect(pj_ioqueue_key_t *key, int status)
diff --git a/pjlib/src/pjlib-test/test.h b/pjlib/src/pjlib-test/test.h
index 53400e23..52600866 100644
--- a/pjlib/src/pjlib-test/test.h
+++ b/pjlib/src/pjlib-test/test.h
@@ -48,7 +48,7 @@
#define INCLUDE_UDP_IOQUEUE_TEST GROUP_NETWORK
#define INCLUDE_TCP_IOQUEUE_TEST GROUP_NETWORK
#define INCLUDE_IOQUEUE_PERF_TEST GROUP_NETWORK
-#define INCLUDE_IOQUEUE_UNREG_TEST 1 // GROUP_NETWORK
+#define INCLUDE_IOQUEUE_UNREG_TEST GROUP_NETWORK
#define INCLUDE_FILE_TEST GROUP_FILE
#define INCLUDE_ECHO_SERVER 0