From: <do...@us...> - 2004-09-30 19:47:35
|
Update of /cvsroot/aolserver/aolserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7388/nsd Modified Files: Tag: aolserver_v40_bp sockcallback.c tclhttp.c Log Message: Implement Ns_SockCancelCallbackEx() in order to correctly cancel actions in the SockCallbackThread. Fix for SF Bug #1037196. Backported from HEAD for 4.0.9. Index: sockcallback.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/sockcallback.c,v retrieving revision 1.12.2.1 retrieving revision 1.12.2.2 diff -C2 -d -r1.12.2.1 -r1.12.2.2 *** sockcallback.c 29 Sep 2004 18:59:13 -0000 1.12.2.1 --- sockcallback.c 30 Sep 2004 19:47:25 -0000 1.12.2.2 *************** *** 101,110 **** *---------------------------------------------------------------------- * ! * Ns_SockCancelCallback -- * ! * Remove a callback registered on a socket. * * Results: ! * None. * * Side effects: --- 101,111 ---- *---------------------------------------------------------------------- * ! * Ns_SockCancelCallback, Ns_SockCancelCallbackEx -- * ! * Remove a callback registered on a socket. Optionally execute ! * a callback from the SockCallbackThread. * * Results: ! * NS_OK/NS_ERROR * * Side effects: *************** *** 117,121 **** Ns_SockCancelCallback(SOCKET sock) { ! (void) Queue(sock, NULL, NULL, 0); } --- 118,128 ---- Ns_SockCancelCallback(SOCKET sock) { ! (void) Ns_SockCancelCallbackEx(sock, NULL, NULL); ! } ! ! int ! Ns_SockCancelCallbackEx(SOCKET sock, Ns_SockProc *proc, void *arg) ! { ! return Queue(sock, proc, arg, NS_SOCK_CANCEL); } *************** *** 294,298 **** when[0] = NS_SOCK_READ; when[1] = NS_SOCK_WRITE; ! when[2] = NS_SOCK_EXCEPTION; max = 100; pfds = ns_malloc(sizeof(struct pollfd) * max); --- 301,305 ---- when[0] = NS_SOCK_READ; when[1] = NS_SOCK_WRITE; ! when[2] = NS_SOCK_EXCEPTION | NS_SOCK_DROP; max = 100; pfds = ns_malloc(sizeof(struct pollfd) * max); *************** *** 323,329 **** ns_free(Tcl_GetHashValue(hPtr)); } ! Tcl_SetHashValue(hPtr, cbPtr); cbPtr = cbPtr->nextPtr; - } --- 330,346 ---- ns_free(Tcl_GetHashValue(hPtr)); } ! if (cbPtr->when & NS_SOCK_CANCEL) { ! if (cbPtr->proc != NULL) { ! (void) (*cbPtr->proc)(cbPtr->sock, cbPtr->arg, ! NS_SOCK_CANCEL); ! } ! if (!new) { ! Tcl_DeleteHashEntry(hPtr); ! } ! ns_free(cbPtr); ! } else { ! Tcl_SetHashValue(hPtr, cbPtr); ! } cbPtr = cbPtr->nextPtr; } Index: tclhttp.c =================================================================== RCS file: /cvsroot/aolserver/aolserver/nsd/tclhttp.c,v retrieving revision 1.16.2.4 retrieving revision 1.16.2.5 diff -C2 -d -r1.16.2.4 -r1.16.2.5 *** tclhttp.c 29 Sep 2004 18:59:13 -0000 1.16.2.4 --- tclhttp.c 30 Sep 2004 19:47:25 -0000 1.16.2.5 *************** *** 530,534 **** state = httpPtr->state; if (!(state & REQ_DONE)) { ! Ns_SockCallback(httpPtr->sock, HttpCancel, httpPtr, NS_SOCK_ANY); while (!(httpPtr->state & REQ_DONE)) { Ns_CondWait(&cond, &lock); --- 530,534 ---- state = httpPtr->state; if (!(state & REQ_DONE)) { ! Ns_SockCancelCallbackEx(httpPtr->sock, HttpCancel, httpPtr); while (!(httpPtr->state & REQ_DONE)) { Ns_CondWait(&cond, &lock); |