Loading innobase/include/os0file.h +11 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,17 @@ log. */ requests in a batch, and only after that wake the i/o-handler thread; this has effect only in simulated aio */ #define OS_WIN31 1 #define OS_WIN95 2 #define OS_WINNT 3 /*************************************************************************** Gets the operating system version. Currently works only on Windows. */ ulint os_get_os_version(void); /*===================*/ /* out: OS_WIN95, OS_WIN31, OS_WINNT (2000 == NT) */ /******************************************************************** Opens an existing file or creates a new. */ Loading innobase/os/os0file.c +37 −7 Original line number Diff line number Diff line Loading @@ -103,6 +103,38 @@ os_aio_array_t* os_aio_sync_array = NULL; ulint os_aio_n_segments = ULINT_UNDEFINED; /*************************************************************************** Gets the operating system version. Currently works only on Windows. */ ulint os_get_os_version(void) /*===================*/ /* out: OS_WIN95, OS_WIN31, OS_WINNT (2000 == NT) */ { #ifdef __WIN__ OSVERSIONINFO os_info; os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); ut_a(GetVersionEx(&os_info)); if (os_info.dwPlatformId == VER_PLATFORM_WIN32s) { return(OS_WIN31); } else if (os_info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { return(OS_WIN95); } else if (os_info.dwPlatformId == VER_PLATFORM_WIN32_NT) { return(OS_WINNT); } else { ut_error; return(0); } #else ut_error; return(0); #endif } /*************************************************************************** Retrieves the last error number if an error occurs in a file io function. The number should be retrieved before any other OS calls (because they may Loading Loading @@ -438,13 +470,13 @@ os_file_set_size( byte* buf; try_again: /* We use a very big 16 MB buffer in writing because Linux is /* We use a very big 8 MB buffer in writing because Linux may be extremely slow in fdatasync on 1 MB writes */ buf = ut_malloc(UNIV_PAGE_SIZE * 1024); buf = ut_malloc(UNIV_PAGE_SIZE * 512); /* Write buffer full of zeros */ for (i = 0; i < UNIV_PAGE_SIZE * 1024; i++) { for (i = 0; i < UNIV_PAGE_SIZE * 512; i++) { buf[i] = '\0'; } Loading @@ -456,10 +488,10 @@ os_file_set_size( UT_NOT_USED(size_high); #endif while (offset < low) { if (low - offset < UNIV_PAGE_SIZE * 1024) { if (low - offset < UNIV_PAGE_SIZE * 512) { n_bytes = low - offset; } else { n_bytes = UNIV_PAGE_SIZE * 1024; n_bytes = UNIV_PAGE_SIZE * 512; } ret = os_file_write(name, file, buf, offset, 0, n_bytes); Loading @@ -475,8 +507,6 @@ os_file_set_size( ret = os_file_flush(file); fsync(file); if (ret) { return(TRUE); } Loading innobase/srv/srv0start.c +12 −4 Original line number Diff line number Diff line Loading @@ -549,11 +549,19 @@ innobase_start_or_create_for_mysql(void) srv_n_file_io_threads = 4; #endif #ifdef WIN_ASYNC_IO /* On NT always use aio */ #ifdef __WIN__ if (os_get_os_version() == OS_WIN95 || os_get_os_version() == OS_WIN31) { /* On Win 95, 98, ME, and Win32 subsystem for Windows 3.1 use simulated aio */ os_aio_use_native_aio = FALSE; srv_n_file_io_threads = 4; } else { /* On NT and Win 2000 always use aio */ os_aio_use_native_aio = TRUE; } #endif if (!os_aio_use_native_aio) { os_aio_init(4 * SRV_N_PENDING_IOS_PER_THREAD * srv_n_file_io_threads, Loading Loading
innobase/include/os0file.h +11 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,17 @@ log. */ requests in a batch, and only after that wake the i/o-handler thread; this has effect only in simulated aio */ #define OS_WIN31 1 #define OS_WIN95 2 #define OS_WINNT 3 /*************************************************************************** Gets the operating system version. Currently works only on Windows. */ ulint os_get_os_version(void); /*===================*/ /* out: OS_WIN95, OS_WIN31, OS_WINNT (2000 == NT) */ /******************************************************************** Opens an existing file or creates a new. */ Loading
innobase/os/os0file.c +37 −7 Original line number Diff line number Diff line Loading @@ -103,6 +103,38 @@ os_aio_array_t* os_aio_sync_array = NULL; ulint os_aio_n_segments = ULINT_UNDEFINED; /*************************************************************************** Gets the operating system version. Currently works only on Windows. */ ulint os_get_os_version(void) /*===================*/ /* out: OS_WIN95, OS_WIN31, OS_WINNT (2000 == NT) */ { #ifdef __WIN__ OSVERSIONINFO os_info; os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); ut_a(GetVersionEx(&os_info)); if (os_info.dwPlatformId == VER_PLATFORM_WIN32s) { return(OS_WIN31); } else if (os_info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { return(OS_WIN95); } else if (os_info.dwPlatformId == VER_PLATFORM_WIN32_NT) { return(OS_WINNT); } else { ut_error; return(0); } #else ut_error; return(0); #endif } /*************************************************************************** Retrieves the last error number if an error occurs in a file io function. The number should be retrieved before any other OS calls (because they may Loading Loading @@ -438,13 +470,13 @@ os_file_set_size( byte* buf; try_again: /* We use a very big 16 MB buffer in writing because Linux is /* We use a very big 8 MB buffer in writing because Linux may be extremely slow in fdatasync on 1 MB writes */ buf = ut_malloc(UNIV_PAGE_SIZE * 1024); buf = ut_malloc(UNIV_PAGE_SIZE * 512); /* Write buffer full of zeros */ for (i = 0; i < UNIV_PAGE_SIZE * 1024; i++) { for (i = 0; i < UNIV_PAGE_SIZE * 512; i++) { buf[i] = '\0'; } Loading @@ -456,10 +488,10 @@ os_file_set_size( UT_NOT_USED(size_high); #endif while (offset < low) { if (low - offset < UNIV_PAGE_SIZE * 1024) { if (low - offset < UNIV_PAGE_SIZE * 512) { n_bytes = low - offset; } else { n_bytes = UNIV_PAGE_SIZE * 1024; n_bytes = UNIV_PAGE_SIZE * 512; } ret = os_file_write(name, file, buf, offset, 0, n_bytes); Loading @@ -475,8 +507,6 @@ os_file_set_size( ret = os_file_flush(file); fsync(file); if (ret) { return(TRUE); } Loading
innobase/srv/srv0start.c +12 −4 Original line number Diff line number Diff line Loading @@ -549,11 +549,19 @@ innobase_start_or_create_for_mysql(void) srv_n_file_io_threads = 4; #endif #ifdef WIN_ASYNC_IO /* On NT always use aio */ #ifdef __WIN__ if (os_get_os_version() == OS_WIN95 || os_get_os_version() == OS_WIN31) { /* On Win 95, 98, ME, and Win32 subsystem for Windows 3.1 use simulated aio */ os_aio_use_native_aio = FALSE; srv_n_file_io_threads = 4; } else { /* On NT and Win 2000 always use aio */ os_aio_use_native_aio = TRUE; } #endif if (!os_aio_use_native_aio) { os_aio_init(4 * SRV_N_PENDING_IOS_PER_THREAD * srv_n_file_io_threads, Loading