diff options
Diffstat (limited to 'otherlibs/win32unix')
-rwxr-xr-x | otherlibs/win32unix/nonblock.c | 2 | ||||
-rw-r--r-- | otherlibs/win32unix/select.c | 498 | ||||
-rw-r--r-- | otherlibs/win32unix/startup.c | 4 | ||||
-rw-r--r-- | otherlibs/win32unix/unixsupport.c | 2 | ||||
-rw-r--r-- | otherlibs/win32unix/unixsupport.h | 13 | ||||
-rw-r--r-- | otherlibs/win32unix/windbug.c | 24 | ||||
-rw-r--r-- | otherlibs/win32unix/windbug.h | 21 | ||||
-rw-r--r-- | otherlibs/win32unix/winworker.c | 62 |
8 files changed, 281 insertions, 345 deletions
diff --git a/otherlibs/win32unix/nonblock.c b/otherlibs/win32unix/nonblock.c index 733a79d89..1bf80bfc7 100755 --- a/otherlibs/win32unix/nonblock.c +++ b/otherlibs/win32unix/nonblock.c @@ -26,6 +26,7 @@ CAMLprim value unix_set_nonblock(socket) win32_maperr(WSAGetLastError()); uerror("unix_set_nonblock", Nothing); } + Flags_fd_val(socket) = Flags_fd_val(socket) | FLAGS_FD_IS_BLOCKING; return Val_unit; } @@ -38,5 +39,6 @@ CAMLprim value unix_clear_nonblock(socket) win32_maperr(WSAGetLastError()); uerror("unix_clear_nonblock", Nothing); } + Flags_fd_val(socket) = Flags_fd_val(socket) & ~FLAGS_FD_IS_BLOCKING; return Val_unit; } diff --git a/otherlibs/win32unix/select.c b/otherlibs/win32unix/select.c index efe3a32e8..b82c423cc 100644 --- a/otherlibs/win32unix/select.c +++ b/otherlibs/win32unix/select.c @@ -16,9 +16,11 @@ #include <mlvalues.h> #include <alloc.h> #include <memory.h> +#include <fail.h> #include <signals.h> #include <winsock2.h> #include <windows.h> +#include <stdio.h> #include "unixsupport.h" #include "windbug.h" #include "winworker.h" @@ -29,7 +31,7 @@ * It takes the following parameters into account: * - limitation on number of objects is mostly due to limitation * a WaitForMultipleObjects - * - there is always an event "hStop" to watch + * - there is always an event "hStop" to watch * * This lead to pick the following value as the biggest possible * value @@ -70,9 +72,7 @@ void handle_set_add (LPSELECTHANDLESET hds, HANDLE hdl) hds->nLast++; } -#ifdef DBUG - dbug_print("Adding handle %x to set %x", hdl, hds); -#endif + DEBUG_PRINT("Adding handle %x to set %x", hdl, hds); } BOOL handle_set_mem (LPSELECTHANDLESET hds, HANDLE hdl) @@ -115,7 +115,7 @@ typedef enum _SELECTHANDLETYPE { typedef enum _SELECTMODE { SELECT_MODE_NONE = 0, SELECT_MODE_READ, - SELECT_MODE_WRITE, + SELECT_MODE_WRITE, SELECT_MODE_EXCEPT, } SELECTMODE; @@ -138,17 +138,18 @@ typedef enum _SELECTTYPE { typedef struct _SELECTRESULT { LIST lst; SELECTMODE EMode; - LPVOID lpOrig; + int lpOrigIdx; } SELECTRESULT; typedef SELECTRESULT *LPSELECTRESULT; /* Data structure for query */ typedef struct _SELECTQUERY { - LIST lst; - SELECTMODE EMode; - HANDLE hFileDescr; - LPVOID lpOrig; + LIST lst; + SELECTMODE EMode; + HANDLE hFileDescr; + int lpOrigIdx; + unsigned int uFlagsFd; /* Copy of filedescr->flags_fd */ } SELECTQUERY; typedef SELECTQUERY *LPSELECTQUERY; @@ -188,24 +189,18 @@ LPSELECTDATA select_data_new (LPSELECTDATA lpSelectData, SELECTTYPE EType) /* Allocate the data structure */ LPSELECTDATA res; DWORD i; - - if (!HeapLock(GetProcessHeap())) - { - win32_maperr(GetLastError()); - uerror("select", Nothing); - } - res = (LPSELECTDATA)HeapAlloc(GetProcessHeap(), 0, sizeof(SELECTDATA)); - HeapUnlock(GetProcessHeap()); + + res = (LPSELECTDATA)caml_stat_alloc(sizeof(SELECTDATA)); /* Init common data */ list_init((LPLIST)res); list_next_set((LPLIST)res, (LPLIST)lpSelectData); res->EType = EType; res->nResultsCount = 0; - + /* Data following are dedicated to APC like call, they - will be initialized if required. For now they are set to + will be initialized if required. For now they are set to invalid values. */ res->funcWorker = NULL; @@ -222,9 +217,7 @@ void select_data_free (LPSELECTDATA lpSelectData) { DWORD i; -#ifdef DBUG - dbug_print("Freeing data of %x", lpSelectData); -#endif + DEBUG_PRINT("Freeing data of %x", lpSelectData); /* Free APC related data, if they exists */ if (lpSelectData->lpWorker != NULL) @@ -237,17 +230,11 @@ void select_data_free (LPSELECTDATA lpSelectData) lpSelectData->nResultsCount = 0; lpSelectData->nQueriesCount = 0; - if (!HeapLock(GetProcessHeap())) - { - win32_maperr(GetLastError()); - uerror("select_data_free", Nothing); - }; - HeapFree(GetProcessHeap(), 0, lpSelectData); - HeapUnlock(GetProcessHeap()); + caml_stat_free(lpSelectData); } /* Add a result to select data, return zero if something goes wrong. */ -DWORD select_data_result_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, LPVOID lpOrig) +DWORD select_data_result_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, int lpOrigIdx) { DWORD res; DWORD i; @@ -257,7 +244,7 @@ DWORD select_data_result_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, LPVOI { i = lpSelectData->nResultsCount; lpSelectData->aResults[i].EMode = EMode; - lpSelectData->aResults[i].lpOrig = lpOrig; + lpSelectData->aResults[i].lpOrigIdx = lpOrigIdx; lpSelectData->nResultsCount++; res = 1; } @@ -266,10 +253,14 @@ DWORD select_data_result_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, LPVOI } /* Add a query to select data, return zero if something goes wrong */ -DWORD select_data_query_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE hFileDescr, LPVOID lpOrig) +DWORD select_data_query_add (LPSELECTDATA lpSelectData, + SELECTMODE EMode, + HANDLE hFileDescr, + int lpOrigIdx, + unsigned int uFlagsFd) { DWORD res; - DWORD i; + DWORD i; res = 0; if (lpSelectData->nQueriesCount < MAXIMUM_SELECT_OBJECTS) @@ -277,7 +268,8 @@ DWORD select_data_query_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE i = lpSelectData->nQueriesCount; lpSelectData->aQueries[i].EMode = EMode; lpSelectData->aQueries[i].hFileDescr = hFileDescr; - lpSelectData->aQueries[i].lpOrig = lpOrig; + lpSelectData->aQueries[i].lpOrigIdx = lpOrigIdx; + lpSelectData->aQueries[i].uFlagsFd = uFlagsFd; lpSelectData->nQueriesCount++; res = 1; } @@ -286,25 +278,22 @@ DWORD select_data_query_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE } /* Search for a job that has available query slots and that match provided type. - * If none is found, create a new one. Return the corresponding SELECTDATA, and + * If none is found, create a new one. Return the corresponding SELECTDATA, and * update provided SELECTDATA head, if required. */ -LPSELECTDATA select_data_job_search (LPSELECTDATA *lppSelectData, - SELECTTYPE EType) +LPSELECTDATA select_data_job_search (LPSELECTDATA *lppSelectData, SELECTTYPE EType) { LPSELECTDATA res; - + res = NULL; - + /* Search for job */ -#ifdef DBUG - dbug_print("Searching an available job for type %d", EType); -#endif + DEBUG_PRINT("Searching an available job for type %d", EType); res = *lppSelectData; while ( res != NULL && !( - res->EType == EType + res->EType == EType && res->nQueriesCount < MAXIMUM_SELECT_OBJECTS ) ) @@ -315,9 +304,7 @@ LPSELECTDATA select_data_job_search (LPSELECTDATA *lppSelectData, /* No matching job found, create one */ if (res == NULL) { -#ifdef DBUG - dbug_print("No job for type %d found, create one", EType); -#endif + DEBUG_PRINT("No job for type %d found, create one", EType); res = select_data_new(*lppSelectData, EType); *lppSelectData = res; } @@ -337,10 +324,8 @@ void read_console_poll(HANDLE hStop, void *_data) DWORD n; LPSELECTDATA lpSelectData; LPSELECTQUERY lpQuery; - -#ifdef DBUG - dbug_print("Waiting for data on console"); -#endif + + DEBUG_PRINT("Waiting for data on console"); record; waitRes = 0; @@ -351,7 +336,7 @@ void read_console_poll(HANDLE hStop, void *_data) events[0] = hStop; events[1] = lpQuery->hFileDescr; while (lpSelectData->EState == SELECT_STATE_NONE) - { + { waitRes = WaitForMultipleObjects(2, events, FALSE, INFINITE); if (waitRes == WAIT_OBJECT_0 || check_error(lpSelectData, waitRes == WAIT_FAILED)) { @@ -368,11 +353,11 @@ void read_console_poll(HANDLE hStop, void *_data) record.Event.KeyEvent.bKeyDown && record.Event.KeyEvent.uChar.AsciiChar != 0) { - select_data_result_add(lpSelectData, lpQuery->EMode, lpQuery->lpOrig); + select_data_result_add(lpSelectData, lpQuery->EMode, lpQuery->lpOrigIdx); lpSelectData->EState = SELECT_STATE_SIGNALED; break; } - else + else { /* discard everything else and try again */ if (check_error(lpSelectData, ReadConsoleInput(lpQuery->hFileDescr, &record, 1, &n) == 0)) @@ -384,13 +369,17 @@ void read_console_poll(HANDLE hStop, void *_data) } /* Add a function to monitor console input */ -LPSELECTDATA read_console_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE hFileDescr, LPVOID lpOrig) +LPSELECTDATA read_console_poll_add (LPSELECTDATA lpSelectData, + SELECTMODE EMode, + HANDLE hFileDescr, + int lpOrigIdx, + unsigned int uFlagsFd) { LPSELECTDATA res; res = select_data_new(lpSelectData, SELECT_TYPE_CONSOLE_READ); res->funcWorker = read_console_poll; - select_data_query_add(res, SELECT_MODE_READ, hFileDescr, lpOrig); + select_data_query_add(res, SELECT_MODE_READ, hFileDescr, lpOrigIdx, uFlagsFd); return res; } @@ -402,81 +391,93 @@ LPSELECTDATA read_console_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, /* Monitor a pipe for input */ void read_pipe_poll (HANDLE hStop, void *_data) { + DWORD res; DWORD event; DWORD n; LPSELECTQUERY iterQuery; LPSELECTDATA lpSelectData; DWORD i; + DWORD wait; /* Poll pipe */ event = 0; n = 0; lpSelectData = (LPSELECTDATA)_data; + wait = 1; -#ifdef DBUG - dbug_print("Checking data pipe"); -#endif + DEBUG_PRINT("Checking data pipe"); while (lpSelectData->EState == SELECT_STATE_NONE) { for (i = 0; i < lpSelectData->nQueriesCount; i++) { iterQuery = &(lpSelectData->aQueries[i]); - if (check_error( - lpSelectData, - PeekNamedPipe( - iterQuery->hFileDescr, - NULL, - 0, - NULL, - &n, - NULL) == 0)) + res = PeekNamedPipe( + iterQuery->hFileDescr, + NULL, + 0, + NULL, + &n, + NULL); + if (check_error(lpSelectData, + (res == 0) && + (GetLastError() != ERROR_BROKEN_PIPE))) { break; }; - if (n > 0) + if ((n > 0) || (res == 0)) { lpSelectData->EState = SELECT_STATE_SIGNALED; - select_data_result_add(lpSelectData, iterQuery->EMode, iterQuery->lpOrig); + select_data_result_add(lpSelectData, iterQuery->EMode, iterQuery->lpOrigIdx); }; }; /* Alas, nothing except polling seems to work for pipes. - Check the state & stop_worker_event every 10 ms + Check the state & stop_worker_event every 10 ms */ if (lpSelectData->EState == SELECT_STATE_NONE) { - event = WaitForSingleObject(hStop, 10); + event = WaitForSingleObject(hStop, wait); + + /* Fast start: begin to wait 1, 2, 4, 8 and then 10 ms. + * If we are working with the output of a program there is + * a chance that one of the 4 first calls succeed. + */ + wait = 2 * wait; + if (wait > 10) + { + wait = 10; + }; if (event == WAIT_OBJECT_0 || check_error(lpSelectData, event == WAIT_FAILED)) { break; } } } -#ifdef DBUG - dbug_print("Finish checking data on pipe"); -#endif + DEBUG_PRINT("Finish checking data on pipe"); } /* Add a function to monitor pipe input */ -LPSELECTDATA read_pipe_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE hFileDescr, LPVOID lpOrig) +LPSELECTDATA read_pipe_poll_add (LPSELECTDATA lpSelectData, + SELECTMODE EMode, + HANDLE hFileDescr, + int lpOrigIdx, + unsigned int uFlagsFd) { LPSELECTDATA res; LPSELECTDATA hd; - + hd = lpSelectData; /* Polling pipe is a non blocking operation by default. This means that each - worker can handle many pipe. We begin to try to find a worker that is + worker can handle many pipe. We begin to try to find a worker that is polling pipe, but for which there is under the limit of pipe per worker. */ -#ifdef DBUG - dbug_print("Searching an available worker handling pipe"); -#endif + DEBUG_PRINT("Searching an available worker handling pipe"); res = select_data_job_search(&hd, SELECT_TYPE_PIPE_READ); - + /* Add a new pipe to poll */ res->funcWorker = read_pipe_poll; - select_data_query_add(res, EMode, hFileDescr, lpOrig); + select_data_query_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); return hd; } @@ -515,24 +516,25 @@ void socket_poll (HANDLE hStop, void *_data) maskEvents = FD_OOB; break; } + check_error(lpSelectData, WSAEventSelect( - (SOCKET)(iterQuery->hFileDescr), - aEvents[nEvents], + (SOCKET)(iterQuery->hFileDescr), + aEvents[nEvents], maskEvents) == SOCKET_ERROR); } - + /* Add stop event */ aEvents[nEvents] = hStop; nEvents++; if (lpSelectData->nError == 0) { - check_error(lpSelectData, + check_error(lpSelectData, WaitForMultipleObjects( - nEvents, - aEvents, - FALSE, + nEvents, + aEvents, + FALSE, INFINITE) == WAIT_FAILED); }; @@ -543,20 +545,27 @@ void socket_poll (HANDLE hStop, void *_data) iterQuery = &(lpSelectData->aQueries[i]); if (WaitForSingleObject(aEvents[i], 0) == WAIT_OBJECT_0) { -#ifdef DBUG - dbug_print("Socket %d has pending events", (i - 1)); -#endif + DEBUG_PRINT("Socket %d has pending events", (i - 1)); if (iterQuery != NULL) { - select_data_result_add(lpSelectData, iterQuery->EMode, iterQuery->lpOrig); + select_data_result_add(lpSelectData, iterQuery->EMode, iterQuery->lpOrigIdx); } } /* WSAEventSelect() automatically sets socket to nonblocking mode. Restore the blocking one. */ - iMode = 0; - check_error(lpSelectData, - WSAEventSelect((SOCKET)(iterQuery->hFileDescr), aEvents[i], 0) != 0 || - ioctlsocket((SOCKET)(iterQuery->hFileDescr), FIONBIO, &iMode) != 0); + if (iterQuery->uFlagsFd & FLAGS_FD_IS_BLOCKING) + { + DEBUG_PRINT("Restore a blocking socket"); + iMode = 1; + check_error(lpSelectData, + WSAEventSelect((SOCKET)(iterQuery->hFileDescr), aEvents[i], 0) != 0 || + ioctlsocket((SOCKET)(iterQuery->hFileDescr), FIONBIO, &iMode) != 0); + } + else + { + check_error(lpSelectData, + WSAEventSelect((SOCKET)(iterQuery->hFileDescr), aEvents[i], 0) != 0); + }; CloseHandle(aEvents[i]); aEvents[i] = INVALID_HANDLE_VALUE; @@ -565,30 +574,28 @@ void socket_poll (HANDLE hStop, void *_data) } /* Add a function to monitor socket */ -LPSELECTDATA socket_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE hFileDescr, LPVOID lpOrig) +LPSELECTDATA socket_poll_add (LPSELECTDATA lpSelectData, + SELECTMODE EMode, + HANDLE hFileDescr, + int lpOrigIdx, + unsigned int uFlagsFd) { LPSELECTDATA res; LPSELECTDATA hd; - + hd = lpSelectData; /* Polling socket can be done mulitple handle at the same time. You just need one worker to use it. Try to find if there is already a worker handling this kind of request. */ -#ifdef DBUG - dbug_print("Scanning list of worker to find one that already handle socket"); -#endif + DEBUG_PRINT("Scanning list of worker to find one that already handle socket"); res = select_data_job_search(&hd, SELECT_TYPE_SOCKET); - + /* Add a new socket to poll */ res->funcWorker = socket_poll; -#ifdef DBUG - dbug_print("Add socket %x to worker", hFileDescr); -#endif - select_data_query_add(res, EMode, hFileDescr, lpOrig); -#ifdef DBUG - dbug_print("Socket %x added", hFileDescr); -#endif + DEBUG_PRINT("Add socket %x to worker", hFileDescr); + select_data_query_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); + DEBUG_PRINT("Socket %x added", hFileDescr); return hd; } @@ -598,18 +605,22 @@ LPSELECTDATA socket_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDL /***********************/ /* Add a static result */ -LPSELECTDATA static_poll_add (LPSELECTDATA lpSelectData, SELECTMODE EMode, HANDLE hFileDescr, LPVOID lpOrig) +LPSELECTDATA static_poll_add (LPSELECTDATA lpSelectData, + SELECTMODE EMode, + HANDLE hFileDescr, + int lpOrigIdx, + unsigned int uFlagsFd) { LPSELECTDATA res; LPSELECTDATA hd; - + /* Look for an already initialized static element */ hd = lpSelectData; res = select_data_job_search(&hd, SELECT_TYPE_STATIC); - + /* Add a new query/result */ - select_data_query_add(res, EMode, hFileDescr, lpOrig); - select_data_result_add(res, EMode, lpOrig); + select_data_query_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); + select_data_result_add(res, EMode, lpOrigIdx); return hd; } @@ -637,7 +648,7 @@ static SELECTHANDLETYPE get_handle_type(value fd) { switch(GetFileType(Handle_val(fd))) { - case FILE_TYPE_DISK: + case FILE_TYPE_DISK: res = SELECT_HANDLE_DISK; break; @@ -662,120 +673,99 @@ static SELECTHANDLETYPE get_handle_type(value fd) } /* Choose what to do with given data */ -LPSELECTDATA select_data_dispatch (LPSELECTDATA lpSelectData, SELECTMODE EMode, value fd) +LPSELECTDATA select_data_dispatch (LPSELECTDATA lpSelectData, SELECTMODE EMode, value fd, int lpOrigIdx) { LPSELECTDATA res; HANDLE hFileDescr; - void *lpOrig; struct sockaddr sa; int sa_len; BOOL alreadyAdded; + unsigned int uFlagsFd; CAMLparam1(fd); res = lpSelectData; hFileDescr = Handle_val(fd); - lpOrig = (void *)fd; sa_len = sizeof(sa); alreadyAdded = FALSE; + uFlagsFd = Flags_fd_val(fd); -#ifdef DBUG - dbug_print("Begin dispatching handle %x", hFileDescr); -#endif + DEBUG_PRINT("Begin dispatching handle %x", hFileDescr); -#ifdef DBUG - dbug_print("Waiting for %d on handle %x", EMode, hFileDescr); -#endif - - /* There is only 2 way to have except mode: transmission of OOB data through + DEBUG_PRINT("Waiting for %d on handle %x", EMode, hFileDescr); + + /* There is only 2 way to have except mode: transmission of OOB data through a socket TCP/IP and through a strange interaction with a TTY. With windows, we only consider the TCP/IP except condition */ switch(get_handle_type(fd)) { case SELECT_HANDLE_DISK: -#ifdef DBUG - dbug_print("Handle %x is a disk handle", hFileDescr); -#endif + DEBUG_PRINT("Handle %x is a disk handle", hFileDescr); /* Disk is always ready in read/write operation */ if (EMode == SELECT_MODE_READ || EMode == SELECT_MODE_WRITE) { - res = static_poll_add(res, EMode, hFileDescr, lpOrig); + res = static_poll_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); }; break; case SELECT_HANDLE_CONSOLE: -#ifdef DBUG - dbug_print("Handle %x is a console handle", hFileDescr); -#endif + DEBUG_PRINT("Handle %x is a console handle", hFileDescr); /* Console is always ready in write operation, need to check for read. */ if (EMode == SELECT_MODE_READ) { - res = read_console_poll_add(res, EMode, hFileDescr, lpOrig); + res = read_console_poll_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); } else if (EMode == SELECT_MODE_WRITE) { - res = static_poll_add(res, EMode, hFileDescr, lpOrig); + res = static_poll_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); }; break; case SELECT_HANDLE_PIPE: -#ifdef DBUG - dbug_print("Handle %x is a pipe handle", hFileDescr); -#endif + DEBUG_PRINT("Handle %x is a pipe handle", hFileDescr); /* Console is always ready in write operation, need to check for read. */ if (EMode == SELECT_MODE_READ) { -#ifdef DBUG - dbug_print("Need to check availability of data on pipe"); -#endif - res = read_pipe_poll_add(res, EMode, hFileDescr, lpOrig); + DEBUG_PRINT("Need to check availability of data on pipe"); + res = read_pipe_poll_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); } else if (EMode == SELECT_MODE_WRITE) { -#ifdef DBUG - dbug_print("No need to check availability of data on pipe, write operation always possible"); -#endif - res = static_poll_add(res, EMode, hFileDescr, lpOrig); + DEBUG_PRINT("No need to check availability of data on pipe, write operation always possible"); + res = static_poll_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); }; break; case SELECT_HANDLE_SOCKET: -#ifdef DBUG - dbug_print("Handle %x is a socket handle", hFileDescr); -#endif + DEBUG_PRINT("Handle %x is a socket handle", hFileDescr); if (getsockname((SOCKET)hFileDescr, &sa, &sa_len) == SOCKET_ERROR) { if (WSAGetLastError() == WSAEINVAL) { /* Socket is not bound */ -#ifdef DBUG - dbug_print("Socket is not connected"); -#endif + DEBUG_PRINT("Socket is not connected"); if (EMode == SELECT_MODE_WRITE || EMode == SELECT_MODE_READ) { - res = static_poll_add(res, EMode, hFileDescr, lpOrig); + res = static_poll_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); alreadyAdded = TRUE; } } } if (!alreadyAdded) { - res = socket_poll_add(res, EMode, hFileDescr, lpOrig); + res = socket_poll_add(res, EMode, hFileDescr, lpOrigIdx, uFlagsFd); } break; default: -#ifdef DBUG - dbug_print("Handle %x is unknown", hFileDescr); -#endif - caml_failwith("Unknown handle"); + DEBUG_PRINT("Handle %x is unknown", hFileDescr); + win32_maperr(ERROR_INVALID_HANDLE); + uerror("select", Nothing); break; }; -#ifdef DBUG - dbug_print("Finish dispatching handle %x", hFileDescr); -#endif + DEBUG_PRINT("Finish dispatching handle %x", hFileDescr); CAMLreturnT(LPSELECTDATA, res); } @@ -793,15 +783,47 @@ static DWORD caml_list_length (value lst) CAMLreturnT(DWORD, res); } +static value find_handle(LPSELECTRESULT iterResult, value readfds, value writefds, value exceptfds) +{ + CAMLparam3(readfds, writefds, exceptfds); + CAMLlocal2(result, list); + int i; + + switch( iterResult->EMode ) + { + case SELECT_MODE_READ: + list = readfds; + break; + case SELECT_MODE_WRITE: + list = writefds; + break; + case SELECT_MODE_EXCEPT: + list = exceptfds; + break; + }; + + for(i=0; list != Val_unit && i < iterResult->lpOrigIdx; ++i ) + { + list = Field(list, 1); + } + + if (list == Val_unit) + failwith ("select.c: original file handle not found"); + + result = Field(list, 0); + + CAMLreturn( result ); +} + #define MAX(a, b) ((a) > (b) ? (a) : (b)) CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value timeout) -{ +{ /* Event associated to handle */ DWORD nEventsCount; DWORD nEventsMax; HANDLE *lpEventsDone; - + /* Data for all handles */ LPSELECTDATA lpSelectData; LPSELECTDATA iterSelectData; @@ -838,9 +860,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value CAMLlocal5 (read_list, write_list, except_list, res, l); CAMLlocal1 (fd); -#ifdef DBUG - dbug_print("in select"); -#endif + DEBUG_PRINT("in select"); nEventsCount = 0; nEventsMax = 0; @@ -856,23 +876,12 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value exceptfds_len = caml_list_length(exceptfds); hdsMax = MAX(readfds_len, MAX(writefds_len, exceptfds_len)); - if (!HeapLock(GetProcessHeap())) - { - win32_maperr(GetLastError()); - uerror("select", Nothing); - } - hdsData = (HANDLE *)HeapAlloc( - GetProcessHeap(), - 0, - sizeof(HANDLE) * hdsMax); - HeapUnlock(GetProcessHeap()); + hdsData = (HANDLE *)caml_stat_alloc(sizeof(HANDLE) * hdsMax); if (Double_val(timeout) >= 0.0) { milliseconds = 1000 * Double_val(timeout); -#ifdef DBUG - dbug_print("Will wait %d ms", milliseconds); -#endif + DEBUG_PRINT("Will wait %d ms", milliseconds); } else { @@ -881,82 +890,65 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value /* Create list of select data, based on the different list of fd to watch */ -#ifdef DBUG - dbug_print("Dispatch read fd"); -#endif + DEBUG_PRINT("Dispatch read fd"); handle_set_init(&hds, hdsData, hdsMax); + i=0; for (l = readfds; l != Val_int(0); l = Field(l, 1)) { fd = Field(l, 0); if (!handle_set_mem(&hds, Handle_val(fd))) { handle_set_add(&hds, Handle_val(fd)); - lpSelectData = select_data_dispatch(lpSelectData, SELECT_MODE_READ, fd); + lpSelectData = select_data_dispatch(lpSelectData, SELECT_MODE_READ, fd, i++); } else { -#ifdef DBUG - dbug_print("Discarding handle %x which is already monitor for read", Handle_val(fd)); -#endif + DEBUG_PRINT("Discarding handle %x which is already monitor for read", Handle_val(fd)); } } handle_set_reset(&hds); -#ifdef DBUG - dbug_print("Dispatch write fd"); -#endif + DEBUG_PRINT("Dispatch write fd"); handle_set_init(&hds, hdsData, hdsMax); + i=0; for (l = writefds; l != Val_int(0); l = Field(l, 1)) { fd = Field(l, 0); if (!handle_set_mem(&hds, Handle_val(fd))) { handle_set_add(&hds, Handle_val(fd)); - lpSelectData = select_data_dispatch(lpSelectData, SELECT_MODE_WRITE, fd); + lpSelectData = select_data_dispatch(lpSelectData, SELECT_MODE_WRITE, fd, i++); } else { -#ifdef DBUG - dbug_print("Discarding handle %x which is already monitor for write", Handle_val(fd)); -#endif + DEBUG_PRINT("Discarding handle %x which is already monitor for write", Handle_val(fd)); } } handle_set_reset(&hds); -#ifdef DBUG - dbug_print("Dispatch exceptional fd"); -#endif + DEBUG_PRINT("Dispatch exceptional fd"); handle_set_init(&hds, hdsData, hdsMax); + i=0; for (l = exceptfds; l != Val_int(0); l = Field(l, 1)) { fd = Field(l, 0); if (!handle_set_mem(&hds, Handle_val(fd))) { handle_set_add(&hds, Handle_val(fd)); - lpSelectData = select_data_dispatch(lpSelectData, SELECT_MODE_EXCEPT, fd); + lpSelectData = select_data_dispatch(lpSelectData, SELECT_MODE_EXCEPT, fd, i++); } else { -#ifdef DBUG - dbug_print("Discarding handle %x which is already monitor for exceptional", Handle_val(fd)); -#endif + DEBUG_PRINT("Discarding handle %x which is already monitor for exceptional", Handle_val(fd)); } } handle_set_reset(&hds); /* Building the list of handle to wait for */ -#ifdef DBUG - dbug_print("Building events done array"); -#endif + DEBUG_PRINT("Building events done array"); nEventsMax = list_length((LPLIST)lpSelectData); nEventsCount = 0; - if (!HeapLock(GetProcessHeap())) - { - win32_maperr(GetLastError()); - uerror("select", Nothing); - } - lpEventsDone = (HANDLE *)HeapAlloc(GetProcessHeap(), 0, sizeof(HANDLE) * nEventsMax); - HeapUnlock(GetProcessHeap()); + lpEventsDone = (HANDLE *)caml_stat_alloc(sizeof(HANDLE) * nEventsMax); iterSelectData = lpSelectData; while (iterSelectData != NULL) @@ -974,22 +966,18 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value /* Execute APC */ if (iterSelectData->funcWorker != NULL) { - iterSelectData->lpWorker = + iterSelectData->lpWorker = worker_job_submit( - iterSelectData->funcWorker, + iterSelectData->funcWorker, (void *)iterSelectData); -#ifdef DBUG - dbug_print("Job submitted to worker %x", iterSelectData->lpWorker); -#endif + DEBUG_PRINT("Job submitted to worker %x", iterSelectData->lpWorker); lpEventsDone[nEventsCount] = worker_job_event_done(iterSelectData->lpWorker); nEventsCount++; }; iterSelectData = LIST_NEXT(LPSELECTDATA, iterSelectData); }; -#ifdef DBUG - dbug_print("Need to watch %d workers", nEventsCount); -#endif + DEBUG_PRINT("Need to watch %d workers", nEventsCount); /* Processing select itself */ enter_blocking_section(); @@ -999,9 +987,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value /* Waiting for event */ if (err == 0 && !hasStaticData) { -#ifdef DBUG - dbug_print("Waiting for one select worker to be done"); -#endif + DEBUG_PRINT("Waiting for one select worker to be done"); switch (WaitForMultipleObjects(nEventsCount, lpEventsDone, FALSE, milliseconds)) { case WAIT_FAILED: @@ -1009,23 +995,17 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value break; case WAIT_TIMEOUT: -#ifdef DBUG - dbug_print("Select timeout"); -#endif + DEBUG_PRINT("Select timeout"); break; default: -#ifdef DBUG - dbug_print("One worker is done"); -#endif + DEBUG_PRINT("One worker is done"); break; }; } /* Ordering stop to every worker */ -#ifdef DBUG - dbug_print("Sending stop signal to every select workers"); -#endif + DEBUG_PRINT("Sending stop signal to every select workers"); iterSelectData = lpSelectData; while (iterSelectData != NULL) { @@ -1035,10 +1015,8 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value }; iterSelectData = LIST_NEXT(LPSELECTDATA, iterSelectData); }; - -#ifdef DBUG - dbug_print("Waiting for every select worker to be done"); -#endif + + DEBUG_PRINT("Waiting for every select worker to be done"); switch (WaitForMultipleObjects(nEventsCount, lpEventsDone, TRUE, INFINITE)) { case WAIT_FAILED: @@ -1046,9 +1024,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value break; default: -#ifdef DBUG - dbug_print("Every worker is done"); -#endif + DEBUG_PRINT("Every worker is done"); break; } } @@ -1059,16 +1035,12 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value } leave_blocking_section(); -#ifdef DBUG - dbug_print("Error status: %d (0 is ok)", err); -#endif + DEBUG_PRINT("Error status: %d (0 is ok)", err); /* Build results */ if (err == 0) { -#ifdef DBUG - dbug_print("Building result"); -#endif - read_list = Val_unit; + DEBUG_PRINT("Building result"); + read_list = Val_unit; write_list = Val_unit; except_list = Val_unit; @@ -1079,7 +1051,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value { iterResult = &(iterSelectData->aResults[i]); l = alloc_small(2, 0); - Store_field(l, 0, (value)iterResult->lpOrig); + Store_field(l, 0, find_handle(iterResult, readfds, writefds, exceptfds)); switch (iterResult->EMode) { case SELECT_MODE_READ: @@ -1106,9 +1078,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value } /* Free resources */ -#ifdef DBUG - dbug_print("Free selectdata resources"); -#endif + DEBUG_PRINT("Free selectdata resources"); iterSelectData = lpSelectData; while (iterSelectData != NULL) { @@ -1117,40 +1087,26 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value select_data_free(lpSelectData); } lpSelectData = NULL; - + /* Free allocated events/handle set array */ -#ifdef DBUG - dbug_print("Free local allocated resources"); -#endif - if (!HeapLock(GetProcessHeap())) - { - win32_maperr(GetLastError()); - uerror("select", Nothing); - } - HeapFree(GetProcessHeap(), 0, lpEventsDone); - HeapFree(GetProcessHeap(), 0, hdsData); - HeapUnlock(GetProcessHeap()); + DEBUG_PRINT("Free local allocated resources"); + caml_stat_free(lpEventsDone); + caml_stat_free(hdsData); -#ifdef DBUG - dbug_print("Raise error if required"); -#endif + DEBUG_PRINT("Raise error if required"); if (err != 0) { win32_maperr(err); uerror("select", Nothing); } -#ifdef DBUG - dbug_print("Build final result"); -#endif + DEBUG_PRINT("Build final result"); res = alloc_small(3, 0); Store_field(res, 0, read_list); Store_field(res, 1, write_list); Store_field(res, 2, except_list); -#ifdef DBUG - dbug_print("out select"); -#endif + DEBUG_PRINT("out select"); CAMLreturn(res); } diff --git a/otherlibs/win32unix/startup.c b/otherlibs/win32unix/startup.c index bbf5fe1fe..8417e1366 100644 --- a/otherlibs/win32unix/startup.c +++ b/otherlibs/win32unix/startup.c @@ -28,8 +28,6 @@ CAMLprim value win_startup(unit) int i; HANDLE h; - DBUG_INIT; - (void) WSAStartup(MAKEWORD(2, 0), &wsaData); DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &h, 0, TRUE, @@ -48,7 +46,5 @@ CAMLprim value win_cleanup(unit) (void) WSACleanup(); - DBUG_CLEANUP; - return Val_unit; } diff --git a/otherlibs/win32unix/unixsupport.c b/otherlibs/win32unix/unixsupport.c index 6e32a39e7..2f545c19f 100644 --- a/otherlibs/win32unix/unixsupport.c +++ b/otherlibs/win32unix/unixsupport.c @@ -53,6 +53,7 @@ value win_alloc_handle(HANDLE h) Handle_val(res) = h; Descr_kind_val(res) = KIND_HANDLE; CRT_fd_val(res) = NO_CRT_FD; + Flags_fd_val(res) = 0; return res; } @@ -62,6 +63,7 @@ value win_alloc_socket(SOCKET s) Socket_val(res) = s; Descr_kind_val(res) = KIND_SOCKET; CRT_fd_val(res) = NO_CRT_FD; + Flags_fd_val(res) = 0; return res; } diff --git a/otherlibs/win32unix/unixsupport.h b/otherlibs/win32unix/unixsupport.h index bf71ac6dc..d56158304 100644 --- a/otherlibs/win32unix/unixsupport.h +++ b/otherlibs/win32unix/unixsupport.h @@ -26,15 +26,17 @@ struct filedescr { union { HANDLE handle; SOCKET socket; - } fd; + } fd; /* Real windows handle */ enum { KIND_HANDLE, KIND_SOCKET } kind; - int crt_fd; + int crt_fd; /* C runtime descriptor */ + unsigned int flags_fd; /* See FLAGS_FD_* */ }; #define Handle_val(v) (((struct filedescr *) Data_custom_val(v))->fd.handle) #define Socket_val(v) (((struct filedescr *) Data_custom_val(v))->fd.socket) #define Descr_kind_val(v) (((struct filedescr *) Data_custom_val(v))->kind) #define CRT_fd_val(v) (((struct filedescr *) Data_custom_val(v))->crt_fd) +#define Flags_fd_val(v) (((struct filedescr *) Data_custom_val(v))->flags_fd) /* extern value win_alloc_handle_or_socket(HANDLE); */ extern value win_alloc_handle(HANDLE); @@ -50,4 +52,11 @@ extern void unix_error (int errcode, char * cmdname, value arg); extern void uerror (char * cmdname, value arg); extern value unix_freeze_buffer (value); +/* Information stored in flags_fd, describing more precisely the socket + * and its status. The whole flags_fd is initialized to 0. + */ + +/* Blocking or nonblocking. By default a filedescr is in blocking state */ +#define FLAGS_FD_IS_BLOCKING (1<<0) + #define UNIX_BUFFER_SIZE 16384 diff --git a/otherlibs/win32unix/windbug.c b/otherlibs/win32unix/windbug.c index 5bf494e70..e3a2772db 100644 --- a/otherlibs/win32unix/windbug.c +++ b/otherlibs/win32unix/windbug.c @@ -13,20 +13,20 @@ /* $Id$ */ -#include <windows.h> +#include "windbug.h" -int dbug = 0; - -void dbug_init (void) +int debug_test (void) { - dbug = (getenv("OCAMLDBUG") != NULL); -} + static int debug_init = 0; + static int debug = 0; -void dbug_cleanup (void) -{ -} +#ifdef DEBUG + if (!debug_init) + { + debug = (getenv("OCAMLDEBUG") != NULL); + debug_init = 1; + }; +#endif -int dbug_test (void) -{ - return dbug; + return debug; } diff --git a/otherlibs/win32unix/windbug.h b/otherlibs/win32unix/windbug.h index 232bb1989..69cbd3b6e 100644 --- a/otherlibs/win32unix/windbug.h +++ b/otherlibs/win32unix/windbug.h @@ -13,17 +13,15 @@ /* $Id$ */ -/*#define DBUG*/ - -#ifdef DBUG +#ifdef DEBUG #include <stdio.h> #include <windows.h> -#define DBUG_PRINT(fmt, ...) \ +#define DEBUG_PRINT(fmt, ...) \ do \ { \ - if (dbug_test()) \ + if (debug_test()) \ { \ fprintf(stderr, "DBUG (pid:%d, tid: %d): ", GetCurrentProcessId(), GetCurrentThreadId()); \ fprintf(stderr, fmt, __VA_ARGS__); \ @@ -32,18 +30,9 @@ }; \ } while(0) -/* Initialize and cleanup dbug variable */ -void dbug_init (void); -void dbug_cleanup (void); - /* Test if we are in dbug mode */ -int dbug_test (void); - -#define DBUG_INIT dbug_init() -#define DBUG_CLEANUP dbug_cleanup() +int debug_test (void); #else -#define DBUG_PRINT(fmt, ...) -#define DBUG_INIT -#define DBUG_CLEANUP +#define DEBUG_PRINT(fmt, ...) #endif diff --git a/otherlibs/win32unix/winworker.c b/otherlibs/win32unix/winworker.c index aa83684b2..57f95a9ae 100644 --- a/otherlibs/win32unix/winworker.c +++ b/otherlibs/win32unix/winworker.c @@ -47,7 +47,6 @@ LPWORKER lpWorkers = NULL; DWORD nWorkersCurrent = 0; DWORD nWorkersMax = 0; HANDLE hWorkersMutex = INVALID_HANDLE_VALUE; -HANDLE hWorkerHeap = INVALID_HANDLE_VALUE; DWORD WINAPI worker_wait (LPVOID _data) { @@ -57,7 +56,7 @@ DWORD WINAPI worker_wait (LPVOID _data) lpWorker = (LPWORKER )_data; bExit = FALSE; - DBUG_PRINT("Worker %x starting", lpWorker); + DEBUG_PRINT("Worker %x starting", lpWorker); while ( !bExit && SignalObjectAndWait( @@ -66,7 +65,7 @@ DWORD WINAPI worker_wait (LPVOID _data) INFINITE, TRUE) == WAIT_OBJECT_0) { - DBUG_PRINT("Worker %x running", lpWorker); + DEBUG_PRINT("Worker %x running", lpWorker); switch (lpWorker->ECommand) { case WORKER_CMD_NONE: @@ -86,7 +85,7 @@ DWORD WINAPI worker_wait (LPVOID _data) break; } }; - DBUG_PRINT("Worker %x exiting", lpWorker); + DEBUG_PRINT("Worker %x exiting", lpWorker); return 0; } @@ -95,13 +94,7 @@ LPWORKER worker_new (void) { LPWORKER lpWorker = NULL; - if (!HeapLock(hWorkerHeap)) - { - win32_maperr(GetLastError()); - uerror("worker_new", Nothing); - }; - lpWorker = (LPWORKER)HeapAlloc(hWorkerHeap, 0, sizeof(WORKER)); - HeapUnlock(hWorkerHeap); + lpWorker = (LPWORKER)caml_stat_alloc(sizeof(WORKER)); list_init((LPLIST)lpWorker); lpWorker->hJobStarted = CreateEvent(NULL, TRUE, FALSE, NULL); lpWorker->hJobStop = CreateEvent(NULL, TRUE, FALSE, NULL); @@ -124,14 +117,14 @@ LPWORKER worker_new (void) void worker_free (LPWORKER lpWorker) { /* Wait for termination of the worker */ - DBUG_PRINT("Shutting down worker %x", lpWorker); + DEBUG_PRINT("Shutting down worker %x", lpWorker); WaitForSingleObject(lpWorker->hWorkerReady, INFINITE); lpWorker->ECommand = WORKER_CMD_STOP; SetEvent(lpWorker->hCommandReady); WaitForSingleObject(lpWorker->hThread, INFINITE); /* Free resources */ - DBUG_PRINT("Freeing resources of worker %x", lpWorker); + DEBUG_PRINT("Freeing resources of worker %x", lpWorker); if (lpWorker->hThread != INVALID_HANDLE_VALUE) { CloseHandle(lpWorker->hThread); @@ -171,13 +164,7 @@ void worker_free (LPWORKER lpWorker) lpWorker->hCommandReady = INVALID_HANDLE_VALUE; } - if (!HeapLock(hWorkerHeap)) - { - win32_maperr(GetLastError()); - uerror("worker_new", Nothing); - }; - HeapFree(hWorkerHeap, 0, lpWorker); - HeapUnlock(hWorkerHeap); + caml_stat_free(lpWorker); }; LPWORKER worker_pop (void) @@ -193,7 +180,7 @@ LPWORKER worker_pop (void) } nWorkersCurrent++; nWorkersMax = (nWorkersCurrent > nWorkersMax ? nWorkersCurrent : nWorkersMax); - DBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", + DEBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", nWorkersCurrent, nWorkersMax, list_length((LPLIST)lpWorkers)); @@ -224,16 +211,16 @@ void worker_push(LPWORKER lpWorker) bFreeWorker = TRUE; WaitForSingleObject(hWorkersMutex, INFINITE); - DBUG_PRINT("Testing if we are under the maximum number of running workers"); + DEBUG_PRINT("Testing if we are under the maximum number of running workers"); if (list_length((LPLIST)lpWorkers) < THREAD_WORKERS_MAX) { - DBUG_PRINT("Saving this worker for future use"); - DBUG_PRINT("Next: %x", ((LPLIST)lpWorker)->lpNext); + DEBUG_PRINT("Saving this worker for future use"); + DEBUG_PRINT("Next: %x", ((LPLIST)lpWorker)->lpNext); lpWorkers = (LPWORKER)list_concat((LPLIST)lpWorker, (LPLIST)lpWorkers); bFreeWorker = FALSE; }; nWorkersCurrent--; - DBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", + DEBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", nWorkersCurrent, nWorkersMax, list_length((LPLIST)lpWorkers)); @@ -241,7 +228,7 @@ void worker_push(LPWORKER lpWorker) if (bFreeWorker) { - DBUG_PRINT("Freeing worker %x", lpWorker); + DEBUG_PRINT("Freeing worker %x", lpWorker); worker_free(lpWorker); } } @@ -253,16 +240,11 @@ void worker_init (void) /* Init a shared variable. The only way to ensure that no other worker will be at the same point is to use a critical section. */ - DBUG_PRINT("Allocating mutex for workers"); + DEBUG_PRINT("Allocating mutex for workers"); if (hWorkersMutex == INVALID_HANDLE_VALUE) { hWorkersMutex = CreateMutex(NULL, FALSE, NULL); } - - if (hWorkerHeap == INVALID_HANDLE_VALUE) - { - hWorkerHeap = HeapCreate(0, sizeof(WORKER) * THREAD_WORKERS_MAX * 4, 0); - } } void worker_cleanup(void) @@ -276,13 +258,13 @@ void worker_cleanup(void) if (hWorkersMutex != INVALID_HANDLE_VALUE) { WaitForSingleObject(hWorkersMutex, INFINITE); - DBUG_PRINT("Freeing global resource of workers"); + DEBUG_PRINT("Freeing global resource of workers"); /* Empty the queue of worker worker */ while (lpWorkers != NULL) { ReleaseMutex(hWorkersMutex); lpWorker = worker_pop(); - DBUG_PRINT("Freeing worker %x", lpWorker); + DEBUG_PRINT("Freeing worker %x", lpWorker); WaitForSingleObject(hWorkersMutex, INFINITE); worker_free(lpWorker); }; @@ -298,18 +280,18 @@ LPWORKER worker_job_submit (WORKERFUNC f, void *user_data) { LPWORKER lpWorker = worker_pop(); - DBUG_PRINT("Waiting for worker to be ready"); + DEBUG_PRINT("Waiting for worker to be ready"); enter_blocking_section(); WaitForSingleObject(lpWorker->hWorkerReady, INFINITE); ResetEvent(lpWorker->hWorkerReady); leave_blocking_section(); - DBUG_PRINT("Worker is ready"); + DEBUG_PRINT("Worker is ready"); lpWorker->hJobFunc = f; lpWorker->lpJobUserData = user_data; lpWorker->ECommand = WORKER_CMD_EXEC; - DBUG_PRINT("Call worker (func: %x, worker: %x)", f, lpWorker); + DEBUG_PRINT("Call worker (func: %x, worker: %x)", f, lpWorker); SetEvent(lpWorker->hCommandReady); return (LPWORKER)lpWorker; @@ -322,14 +304,14 @@ HANDLE worker_job_event_done (LPWORKER lpWorker) void worker_job_stop (LPWORKER lpWorker) { - DBUG_PRINT("Sending stop signal to worker %x", lpWorker); + DEBUG_PRINT("Sending stop signal to worker %x", lpWorker); SetEvent(lpWorker->hJobStop); - DBUG_PRINT("Signal sent to worker %x", lpWorker); + DEBUG_PRINT("Signal sent to worker %x", lpWorker); } void worker_job_finish (LPWORKER lpWorker) { - DBUG_PRINT("Finishing call of worker %x", lpWorker); + DEBUG_PRINT("Finishing call of worker %x", lpWorker); enter_blocking_section(); WaitForSingleObject(lpWorker->hJobDone, INFINITE); leave_blocking_section(); |