Phil Lodwick : winsock/tests: select wakeup on closesocket.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 14 07:27:34 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 53b93af3b97aff32719a4e015810b04d471a36b6
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=53b93af3b97aff32719a4e015810b04d471a36b6
Author: Phil Lodwick <Phil.Lodwick at EFI.COM>
Date: Tue Feb 14 10:38:49 2006 +0100
winsock/tests: select wakeup on closesocket.
- Change select timeout from 2 seconds to 500 microseconds.
- Add test to make sure select wakes up after a closesocket.
- Add test to make sure listen fails without bind.
---
dlls/winsock/tests/sock.c | 60 +++++++++++++++++++++++++++++++++++++++++----
1 files changed, 55 insertions(+), 5 deletions(-)
diff --git a/dlls/winsock/tests/sock.c b/dlls/winsock/tests/sock.c
index ae9184e..005c34e 100644
--- a/dlls/winsock/tests/sock.c
+++ b/dlls/winsock/tests/sock.c
@@ -128,6 +128,13 @@ typedef struct client_memory
char *recv_buf;
} client_memory;
+/* SelectReadThread thread parameters */
+typedef struct select_thread_params
+{
+ SOCKET s;
+ BOOL ReadKilled;
+} select_thread_params;
+
/**************** Static variables ***************/
static DWORD tls; /* Thread local storage index */
@@ -1317,13 +1324,38 @@ static void test_WSAStringToAddressW(voi
"WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
}
+static VOID WINAPI SelectReadThread(select_thread_params *par)
+{
+ fd_set readfds;
+ int ret;
+ struct sockaddr_in addr;
+ struct timeval select_timeout;
+
+ FD_ZERO(&readfds);
+ FD_SET(par->s, &readfds);
+ select_timeout.tv_sec=5;
+ select_timeout.tv_usec=0;
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = inet_addr(SERVERIP);
+ addr.sin_port = htons(SERVERPORT);
+
+ do_bind(par->s, (struct sockaddr *)&addr, sizeof(addr));
+ wsa_ok(listen(par->s, SOMAXCONN ), 0 ==, "SelectReadThread (%lx): listen failed: %d\n");
+
+ SetEvent(server_ready);
+ ret = select(par->s+1, &readfds, NULL, NULL, &select_timeout);
+ par->ReadKilled = (ret == 1);
+}
+
static void test_select(void)
{
SOCKET fdRead, fdWrite;
fd_set readfds, writefds, exceptfds;
- int maxfd;
+ unsigned int maxfd;
int ret;
struct timeval select_timeout;
+ select_thread_params thread_params;
+ HANDLE thread_handle;
fdRead = socket(AF_INET, SOCK_STREAM, 0);
ok( (fdRead != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
@@ -1337,8 +1369,8 @@ static void test_select(void)
FD_SET(fdWrite, &writefds);
FD_SET(fdRead, &exceptfds);
FD_SET(fdWrite, &exceptfds);
- select_timeout.tv_sec=2;
- select_timeout.tv_usec=0;
+ select_timeout.tv_sec=0;
+ select_timeout.tv_usec=500;
maxfd = fdRead;
if (fdWrite > maxfd)
@@ -1354,10 +1386,28 @@ static void test_select(void)
ok ( !FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
ok ( !FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n");
- ret = closesocket(fdRead);
- ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
+ todo_wine {
+ ok ((listen(fdWrite, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
+ }
ret = closesocket(fdWrite);
ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
+
+ thread_params.s = fdRead;
+ thread_params.ReadKilled = FALSE;
+ server_ready = CreateEventW(NULL, TRUE, FALSE, NULL);
+ thread_handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) &SelectReadThread, &thread_params, 0, NULL );
+ ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %ld\n", GetLastError());
+
+ WaitForSingleObject (server_ready, INFINITE);
+ Sleep(2000);
+ ret = closesocket(fdRead);
+ ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
+
+ WaitForSingleObject (thread_handle, TEST_TIMEOUT * 1000);
+ todo_wine {
+ ok ( (thread_params.ReadKilled), "closesocket did not wakeup select\n");
+ }
+
}
/**************** Main program ***************/
More information about the wine-cvs
mailing list