summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <heikki@donna.mysql.fi>2001-05-20 20:24:43 +0300
committerunknown <heikki@donna.mysql.fi>2001-05-20 20:24:43 +0300
commit926bd6761f78708b869a311facd7f0c4539cbf9e (patch)
treebeb5bc270403a0b01d5d411561d82f992b8fe9fe
parent112ad6720539a0bfc6dec31db64b619298a52deb (diff)
parent23e19c904763e9456482f882ebefc10c59f433dc (diff)
downloadmariadb-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.h12
-rw-r--r--innobase/os/os0file.c44
-rw-r--r--innobase/srv/srv0start.c16
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,