Commit 467e6fd1 authored by Michael Graff's avatar Michael Graff

make the same change to win32/socket.c here as was made on v9_5 to fix connected UDP sockets

parent 896f8836
2443. [bug] win32: UDP connect() would not generate an event,
and so connected UDP sockets would never clean up.
Fix this by doing an immediate WSAConnect() rather
than an io completion port type for UDP.
2442. [bug] A lock could be destroyed twice. [RT# 18626]
2441. [bug] isc_radix_insert() could copy radix tree nodes
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: socket.c,v 1.69 2008/09/12 04:46:25 marka Exp $ */
/* $Id: socket.c,v 1.70 2008/09/16 17:19:01 explorer Exp $ */
/* This code uses functions which are only available on Server 2003 and
* higher, and Windows XP and higher.
......@@ -86,14 +86,6 @@ LPFN_CONNECTEX ISCConnectEx;
LPFN_ACCEPTEX ISCAcceptEx;
LPFN_GETACCEPTEXSOCKADDRS ISCGetAcceptExSockaddrs;
/*
* 0 = no debugging, 1 = write to file "socket.log" in working directory.
*/
#define XXXMLG_DEBUG 0
#if XXXMLG_DEBUG
FILE *logfile = NULL;
#endif
/*
* Run expensive internal consistancy checks.
*/
......@@ -823,20 +815,10 @@ socket_log(int lineno, isc_socket_t *sock, isc_sockaddr_t *address,
char msgbuf[2048];
char peerbuf[256];
va_list ap;
#if XXXMLG_DEBUG
char timebuf[128];
isc_time_t now;
#endif
#if XXXMLG_DEBUG
isc_time_now(&now);
isc_time_formattimestamp(&now, timebuf, sizeof timebuf);
#endif
#if XXXMLG_DEBUG == 0
if (!isc_log_wouldlog(isc_lctx, level))
return;
#endif
va_start(ap, fmt);
vsnprintf(msgbuf, sizeof(msgbuf), fmt, ap);
......@@ -846,28 +828,14 @@ socket_log(int lineno, isc_socket_t *sock, isc_sockaddr_t *address,
isc_log_iwrite(isc_lctx, category, module, level,
msgcat, msgset, message,
"socket %p line %d: %s", sock, lineno, msgbuf);
#if XXXMLG_DEBUG
if (logfile)
fprintf(logfile, "%s socket %p line %d: %s:\n",
timebuf, sock, lineno, msgbuf);
#endif
} else {
isc_sockaddr_format(address, peerbuf, sizeof(peerbuf));
isc_log_iwrite(isc_lctx, category, module, level,
msgcat, msgset, message,
"socket %p line %d peer %s: %s", sock, lineno,
peerbuf, msgbuf);
#if XXXMLG_DEBUG
if (logfile)
fprintf(logfile, "%s socket %p line %d: %s: %s\n",
timebuf, sock, lineno, peerbuf, msgbuf);
#endif
}
#if XXXMLG_DEBUG
if (logfile)
fflush(logfile);
#endif
}
/*
......@@ -2479,10 +2447,6 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
if (maxsocks != 0)
return (ISC_R_NOTIMPLEMENTED);
#if XXXMLG_DEBUG
logfile = fopen("socket.log", "w");
#endif
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);
......@@ -2534,11 +2498,6 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
int i;
isc_mem_t *mctx;
#if XXXMLG_DEBUG
if (logfile)
fclose(logfile);
#endif
/*
* Destroy a socket manager.
*/
......@@ -3345,34 +3304,39 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
}
ISC_LINK_INIT(cdev, ev_link);
/*
* Queue io completion for an accept().
*/
lpo = (IoCompletionInfo *)HeapAlloc(hHeapHandle,
HEAP_ZERO_MEMORY,
sizeof(IoCompletionInfo));
lpo->cdev = cdev;
lpo->request_type = SOCKET_CONNECT;
sock->address = *addr;
ISCConnectEx(sock->fd, &addr->type.sa, addr->length,
NULL, 0, NULL, (LPOVERLAPPED)lpo);
if (sock->type == isc_sockettype_tcp) {
/*
* Queue io completion for an accept().
*/
lpo = (IoCompletionInfo *)HeapAlloc(hHeapHandle,
HEAP_ZERO_MEMORY,
sizeof(IoCompletionInfo));
lpo->cdev = cdev;
lpo->request_type = SOCKET_CONNECT;
/*
* Attach to task.
*/
isc_task_attach(task, &ntask);
cdev->ev_sender = ntask;
sock->address = *addr;
ISCConnectEx(sock->fd, &addr->type.sa, addr->length,
NULL, 0, NULL, (LPOVERLAPPED)lpo);
sock->pending_connect = 1;
_set_state(sock, SOCK_CONNECT);
/*
* Attach to task.
*/
isc_task_attach(task, &ntask);
cdev->ev_sender = ntask;
/*
* Enqueue the request.
*/
sock->connect_ev = cdev;
sock->pending_iocp++;
sock->pending_connect = 1;
_set_state(sock, SOCK_CONNECT);
/*
* Enqueue the request.
*/
sock->connect_ev = cdev;
sock->pending_iocp++;
} else {
WSAConnect(sock->fd, &addr->type.sa, addr->length, NULL, NULL, NULL, NULL);
cdev->result = ISC_R_SUCCESS;
isc_task_send(task, (isc_event_t **)&cdev);
}
CONSISTENT(sock);
UNLOCK(&sock->lock);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment