diff options
author | unknown <heikki@donna.mysql.fi> | 2001-05-20 20:24:43 +0300 |
---|---|---|
committer | unknown <heikki@donna.mysql.fi> | 2001-05-20 20:24:43 +0300 |
commit | 926bd6761f78708b869a311facd7f0c4539cbf9e (patch) | |
tree | beb5bc270403a0b01d5d411561d82f992b8fe9fe | |
parent | 112ad6720539a0bfc6dec31db64b619298a52deb (diff) | |
parent | 23e19c904763e9456482f882ebefc10c59f433dc (diff) | |
download | mariadb-git-926bd6761f78708b869a311facd7f0c4539cbf9e.tar.gz |
Merge heikki@work.mysql.com:/home/my/mysql
into donna.mysql.fi:/home/heikki/mysqle
-rw-r--r-- | innobase/include/os0file.h | 12 | ||||
-rw-r--r-- | innobase/os/os0file.c | 44 | ||||
-rw-r--r-- | innobase/srv/srv0start.c | 16 |
3 files changed, 60 insertions, 12 deletions
diff --git a/innobase/include/os0file.h b/innobase/include/os0file.h index 98e892f16b2..7ea90bb63e4 100644 --- a/innobase/include/os0file.h +++ b/innobase/include/os0file.h @@ -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. */ diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 96f8f332066..7a6edd5a7c1 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -104,6 +104,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 overwrite the error number). If the number is not known to this program, @@ -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'; } @@ -456,10 +488,10 @@ try_again: 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); @@ -475,8 +507,6 @@ try_again: ret = os_file_flush(file); - fsync(file); - if (ret) { return(TRUE); } diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 6d0d0f45bd2..3136846c450 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -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 */ - os_aio_use_native_aio = TRUE; -#endif +#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, |