From: Vlad K. <hv...@us...> - 2008-03-11 14:11:39
|
Build Version : T2.5.0.18749 Firebird 2.5 Unstable (writeBuildNum.sh,v 1.18909 2008/03/11 14:11:29 hvlad Exp $ ) Update of /cvsroot/firebird/firebird2/src/remote/os/win32 In directory sc8-pr-cvs17.sourceforge.net:/tmp/cvs-serv11757/remote/os/win32 Modified Files: cntl.cpp srvr_w32.cpp window.cpp wnet.cpp Log Message: Make remote module thread-safe, remove THREAD_EXIT\THREAD_ENTER from it, refactor server code and some cleanup. To be continued. Please check posix builds. Index: cntl.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/remote/os/win32/cntl.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -b -U3 -r1.36 -r1.37 --- cntl.cpp 4 Mar 2008 13:27:02 -0000 1.36 +++ cntl.cpp 11 Mar 2008 14:11:32 -0000 1.37 @@ -34,7 +34,6 @@ #include "../jrd/sch_proto.h" #include "../jrd/thread_proto.h" #include "../jrd/jrd_proto.h" -#include "../jrd/why_proto.h" #include "../common/classes/init.h" #ifdef WIN_NT @@ -145,7 +144,6 @@ report_status(SERVICE_STOP_PENDING, NO_ERROR, 1, SHUTDOWN_TIMEOUT); fb_shutdown(NULL, SHUTDOWN_TIMEOUT); - SRVR_shutdown(); report_status(SERVICE_STOPPED, last_error, 0, 0); } Index: srvr_w32.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/remote/os/win32/srvr_w32.cpp,v retrieving revision 1.46 retrieving revision 1.47 diff -b -U3 -r1.46 -r1.47 --- srvr_w32.cpp 28 Feb 2008 18:42:30 -0000 1.46 +++ srvr_w32.cpp 11 Mar 2008 14:11:32 -0000 1.47 @@ -98,7 +98,6 @@ #include "../remote/xnet_proto.h" #include "../jrd/gds_proto.h" #include "../jrd/sch_proto.h" -#include "../jrd/thread_proto.h" #include "../jrd/isc_proto.h" #include "../jrd/jrd_proto.h" #include "../jrd/os/isc_i_proto.h" @@ -141,6 +140,10 @@ **************************************/ hInst = hThisInst; +#ifndef SUPERSERVER + //MessageBox(NULL, "Debug me", "Please", MB_OK); +#endif + // We want server to crash without waiting for feedback from the user try { @@ -185,12 +188,6 @@ HANDLE connection_handle = parse_args(lpszArgs, &server_flag); - if ((server_flag & (SRVR_inet | SRVR_wnet | SRVR_xnet)) == 0) { - server_flag |= SRVR_wnet; - server_flag |= SRVR_inet; - server_flag |= SRVR_xnet; - } - #ifdef SUPERSERVER // get priority class from the config file int priority = Config::getProcessPriorityLevel(); @@ -213,10 +210,7 @@ Setup sig_mutex for the process */ ISC_signal_init(); - -#ifdef SUPERSERVER ISC_enter(); -#endif int nReturnValue = 0; ISC_STATUS_ARRAY status_vector; @@ -224,14 +218,14 @@ if (connection_handle != INVALID_HANDLE_VALUE) { rem_port* port = 0; - THREAD_ENTER(); + if (server_flag & SRVR_inet) port = INET_reconnect(connection_handle, status_vector); else if (server_flag & SRVR_wnet) port = WNET_reconnect(connection_handle, status_vector); else if (server_flag & SRVR_xnet) port = XNET_reconnect((ULONG) connection_handle, status_vector); - THREAD_EXIT(); + if (port) { service_connection(port); } @@ -264,19 +258,7 @@ } else { - if (server_flag & SRVR_inet) { - gds__thread_start(inet_connect_wait_thread, 0, THREAD_medium, 0, - 0); - } - if (server_flag & SRVR_wnet) { - gds__thread_start(wnet_connect_wait_thread, 0, THREAD_medium, 0, - 0); - } - if (server_flag & SRVR_xnet) { - gds__thread_start(xnet_connect_wait_thread, 0, THREAD_medium, 0, - 0); - } - + start_connections_thread(0); nReturnValue = WINDOW_main(hThisInst, nWndMode, server_flag); } @@ -341,10 +323,8 @@ ISC_STATUS_ARRAY status_vector; while (true) { - THREAD_ENTER(); - rem_port* port = - INET_connect(protocol_inet, NULL, status_vector, server_flag, 0); - THREAD_EXIT(); + rem_port* port = INET_connect(protocol_inet, NULL, status_vector, server_flag, 0); + if (!port) { gds__log_status(0, status_vector); break; @@ -354,8 +334,7 @@ break; } else { - gds__thread_start(process_connection_thread, port, - THREAD_medium, 0, 0); + gds__thread_start(process_connection_thread, port, THREAD_medium, 0, 0); } } @@ -385,10 +364,8 @@ ISC_STATUS_ARRAY status_vector; while (true) { - THREAD_ENTER(); - rem_port* port = - WNET_connect(protocol_wnet, NULL, status_vector, server_flag); - THREAD_EXIT(); + rem_port* port = WNET_connect(protocol_wnet, NULL, status_vector, server_flag); + if (!port) { if (status_vector[1] != isc_io_error || status_vector[6] != isc_arg_win32 || @@ -398,8 +375,7 @@ } break; } - gds__thread_start(process_connection_thread, port, - THREAD_medium, 0, 0); + gds__thread_start(process_connection_thread, port, THREAD_medium, 0, 0); } if (!(server_flag & SRVR_non_service)) { @@ -429,16 +405,13 @@ ISC_STATUS_ARRAY status_vector; while (true) { - THREAD_ENTER(); - rem_port* port = - XNET_connect(NULL, NULL, status_vector, server_flag); - THREAD_EXIT(); + rem_port* port = XNET_connect(NULL, NULL, status_vector, server_flag); + if (!port) { gds__log_status(0, status_vector); break; } - gds__thread_start(process_connection_thread, port, - THREAD_medium, 0, 0); + gds__thread_start(process_connection_thread, port, THREAD_medium, 0, 0); } if (!(server_flag & SRVR_non_service)) @@ -475,6 +448,8 @@ * **************************************/ + fb_shutdown_callback(0, SRVR_shutdown, fb_shut_postproviders); + if (server_flag & SRVR_inet) { gds__thread_start(inet_connect_wait_thread, 0, THREAD_medium, 0, 0); } @@ -640,5 +615,16 @@ } } } + + if ((*pserver_flag & (SRVR_inet | SRVR_wnet | SRVR_xnet)) == 0) { + *pserver_flag |= SRVR_wnet; + *pserver_flag |= SRVR_inet; + *pserver_flag |= SRVR_xnet; + } + + if (*pserver_flag & SRVR_debug) { + *pserver_flag |= SRVR_multi_client; + } + return connection_handle; } Index: window.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/remote/os/win32/window.cpp,v retrieving revision 1.29 retrieving revision 1.30 diff -b -U3 -r1.29 -r1.30 --- window.cpp 4 Mar 2008 13:27:02 -0000 1.29 +++ window.cpp 11 Mar 2008 14:11:32 -0000 1.30 @@ -39,7 +39,6 @@ #include "../remote/os/win32/window_proto.h" #include "../remote/os/win32/propty_proto.h" #include "../jrd/gds_proto.h" -#include "../jrd/why_proto.h" #include "../remote/os/win32/window.h" #include "../jrd/isc_proto.h" @@ -52,9 +51,10 @@ #include "../common/config/config.h" -HWND hPSDlg = NULL; +static HWND hPSDlg = NULL; static HINSTANCE hInstance = NULL; static USHORT usServerFlags; +static HWND hMainWnd = NULL; // Static functions to be called from this file only. static void GetDriveLetter(ULONG, char pchBuf[DRV_STRINGLEN]); @@ -66,6 +66,7 @@ // Window Procedure LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); +static int fb_shutdown_cb(); int WINDOW_main( HINSTANCE hThisInst, int nWndMode, USHORT usServerFlagMask) { @@ -90,6 +91,8 @@ hInstance = hThisInst; usServerFlags = usServerFlagMask; + fb_shutdown_callback(0, fb_shutdown_cb, fb_shut_postproviders); + /* initialize main window */ WNDCLASS wcl; @@ -115,7 +118,7 @@ return 0; } - hWnd = CreateWindowEx(0, + hMainWnd = hWnd = CreateWindowEx(0, szClassName, APP_NAME, WS_DLGFRAME | WS_SYSMENU | WS_MINIMIZEBOX, @@ -214,8 +217,7 @@ SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); } fb_shutdown(NULL, 0); - SRVR_shutdown(); - DestroyWindow(hWnd); + //DestroyWindow(hWnd); } } break; @@ -427,8 +429,7 @@ } fb_shutdown(NULL, 0); - SRVR_shutdown(); - PostMessage(hWnd, WM_DESTROY, 0, 0); + //DestroyWindow(hWnd); return TRUE; } /* Fall through to MOVEPENDING if we receive a QUERYDEVICE for the @@ -449,9 +450,8 @@ IDS_PNP2, p, TMP_STRINGLEN - (p - tmp)); GetDriveLetter(pdbcv->dbcv_unitmask, szDrives); MessageBox(hWnd, tmp, szDrives, MB_OK | MB_ICONHAND); - fb_shutdown(NULL, 0); - SRVR_shutdown(); PostMessage(hWnd, WM_DESTROY, 0, 0); + fb_shutdown(NULL, 0); } return TRUE; @@ -539,3 +539,11 @@ MB_ICONQUESTION | MB_OKCANCEL) == IDOK); } + +static int fb_shutdown_cb() +{ + if (hMainWnd) + DestroyWindow(hMainWnd); + + return 0; +} Index: wnet.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/remote/os/win32/wnet.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -b -U3 -r1.47 -r1.48 --- wnet.cpp 10 Mar 2008 08:44:00 -0000 1.47 +++ wnet.cpp 11 Mar 2008 14:11:32 -0000 1.48 @@ -43,7 +43,6 @@ #include "../jrd/isc_proto.h" #include "../jrd/isc_f_proto.h" #include "../jrd/sch_proto.h" -#include "../jrd/thread_proto.h" #include "../common/config/config.h" #include "../common/classes/ClumpletWriter.h" @@ -55,6 +54,7 @@ const char* PIPE_PREFIX = "pipe"; // win32-specific const char* SERVER_PIPE_SUFFIX = "server"; const char* EVENT_PIPE_SUFFIX = "event"; +Firebird::AtomicCounter event_counter; static int accept_connection(rem_port*, P_CNCT *); @@ -335,7 +335,6 @@ if (packet) { - THREAD_EXIT(); while (true) { port->port_handle = CreateFile(port->port_connection->str_data, GENERIC_WRITE | GENERIC_READ, @@ -345,14 +344,12 @@ } const ISC_STATUS status = GetLastError(); if (status != ERROR_PIPE_BUSY) { - THREAD_ENTER(); wnet_error(port, "CreateFile", isc_net_connect_err, status); disconnect(port); return NULL; } WaitNamedPipe(port->port_connection->str_data, 3000L); } - THREAD_ENTER(); send_full(port, packet); return port; } @@ -360,7 +357,6 @@ /* We're a server, so wait for a host to show up */ LPSECURITY_ATTRIBUTES security_attr = ISC_get_security_desc(); - THREAD_EXIT(); while (true) { @@ -379,7 +375,6 @@ // TMN: The check for GetLastError() is redundant. // This code should NEVER be called if not running on NT, // since Win9x does not support the server side of named pipes! - THREAD_ENTER(); wnet_error(port, "CreateNamedPipe", isc_net_connect_listen_err, ERRNO); disconnect(port); @@ -389,7 +384,6 @@ if (!ConnectNamedPipe(port->port_handle, 0) && GetLastError() != ERROR_PIPE_CONNECTED) { - THREAD_ENTER(); wnet_error(port, "ConnectNamedPipe", isc_net_connect_err, ERRNO); disconnect(port); return NULL; @@ -397,7 +391,6 @@ if (flag & (SRVR_debug | SRVR_multi_client)) { - THREAD_ENTER(); port->port_server_flags |= SRVR_server; if (flag & SRVR_multi_client) { @@ -588,6 +581,13 @@ port->port_request = aux_request; port->port_buff_size = BUFFER_SIZE; + port->port_sync = FB_NEW(*getDefaultMemoryPool()) Firebird::RefMutex(); + port->port_sync->addRef(); +#ifdef REM_SERVER + port->port_que_sync = FB_NEW(*getDefaultMemoryPool()) Firebird::RefMutex(); + port->port_que_sync->addRef(); +#endif + xdrwnet_create(&port->port_send, port, &port->port_buffer[BUFFER_SIZE], BUFFER_SIZE, XDR_ENCODE); @@ -651,7 +651,6 @@ new_port->port_connection = make_pipe_name(port->port_connection->str_data, EVENT_PIPE_SUFFIX, p); - THREAD_EXIT(); while (true) { new_port->port_handle = CreateFile(new_port->port_connection->str_data, GENERIC_READ, 0, @@ -660,15 +659,12 @@ break; const ISC_STATUS status = GetLastError(); if (status != ERROR_PIPE_BUSY) { - THREAD_ENTER(); return (rem_port*) wnet_error(new_port, "CreateFile", isc_net_event_connect_err, status); } WaitNamedPipe(new_port->port_connection->str_data, 3000L); } - THREAD_ENTER(); - return new_port; } @@ -691,7 +687,8 @@ **************************************/ rem_port* new_port = NULL; // If this is the client, we will return NULL - const DWORD server_pid = GetCurrentProcessId(); + const DWORD server_pid = (vport->port_server_flags & SRVR_multi_client) ? + ++event_counter : GetCurrentProcessId(); vport->port_async = new_port = alloc_port(vport->port_parent); new_port->port_server_flags = vport->port_server_flags; new_port->port_flags = vport->port_flags & PORT_no_oob; @@ -702,7 +699,7 @@ make_pipe_name(vport->port_connection->str_data, EVENT_PIPE_SUFFIX, str_pid); LPSECURITY_ATTRIBUTES security_attr = ISC_get_security_desc(); - THREAD_EXIT(); + new_port->port_handle = CreateNamedPipe(new_port->port_connection->str_data, PIPE_ACCESS_DUPLEX, @@ -712,7 +709,7 @@ MAX_DATA, 0, security_attr); - THREAD_ENTER(); + if (new_port->port_handle == INVALID_HANDLE_VALUE) { wnet_error(new_port, "CreateNamedPipe", isc_net_event_listen_err, ERRNO); @@ -827,6 +824,11 @@ ALLR_free(port->port_packet_vector); #endif + port->port_sync->release(); +#ifdef REM_SERVER + port->port_que_sync->release(); +#endif + ALLR_free(port); return; } @@ -1453,15 +1455,12 @@ **************************************/ DWORD n = 0; - THREAD_EXIT(); - const USHORT status = - ReadFile(port->port_handle, buffer, buffer_length, &n, NULL); - THREAD_ENTER(); + const USHORT status = ReadFile(port->port_handle, buffer, buffer_length, &n, NULL); + if (!status && GetLastError() != ERROR_BROKEN_PIPE) return wnet_error(port, "ReadFile", isc_net_read_err, ERRNO); if (!n) - return wnet_error(port, "ReadFile end-of-file", isc_net_read_err, - ERRNO); + return wnet_error(port, "ReadFile end-of-file", isc_net_read_err, ERRNO); #if defined(DEBUG) && defined(WNET_trace) packet_print("receive", buffer, n); @@ -1488,10 +1487,9 @@ const SCHAR* data = buffer; const DWORD length = buffer_length; - THREAD_EXIT(); DWORD n; const USHORT status = WriteFile(port->port_handle, data, length, &n, NULL); - THREAD_ENTER(); + if (!status) return wnet_error(port, "WriteFile", isc_net_write_err, ERRNO); if (n != length) |