mirror of
https://github.com/MariaDB/server.git
synced 2025-01-21 22:34:18 +01:00
d681f5b967
------------------------------------------------------------------------ r3459 | vasil | 2008-12-09 11:49:03 +0200 (Tue, 09 Dec 2008) | 152 lines branches/zip: Merge 2929:3458 from branches/5.1 (resolving conflict in c3257, note also that r3363 reverted r2933 so there are not changes in mysql-test/innodb-autoinc.result with the current merge): ------------------------------------------------------------------------ r2933 | calvin | 2008-10-30 02:57:31 +0200 (Thu, 30 Oct 2008) | 10 lines Changed paths: M /branches/5.1/mysql-test/innodb-autoinc.result branches/5.1: correct the result file innodb-autoinc.result Change the followings: auto_increment_increment auto_increment_offset to auto-increment-increment auto-increment-offset ------------------------------------------------------------------------ r2981 | marko | 2008-11-07 14:54:10 +0200 (Fri, 07 Nov 2008) | 5 lines Changed paths: M /branches/5.1/row/row0mysql.c branches/5.0: row_mysql_store_col_in_innobase_format(): Correct a misleading comment. In the UTF-8 encoding, ASCII takes 1 byte per character, while the "latin1" character set (normally ISO-8859-1, but in MySQL it actually refers to the Windows Code Page 1252 a.k.a. CP1252, WinLatin1) takes 1 to 3 bytes (1 to 2 bytes for the ISO-8859-1 subset). ------------------------------------------------------------------------ r3114 | calvin | 2008-11-14 20:31:48 +0200 (Fri, 14 Nov 2008) | 8 lines Changed paths: M /branches/5.1/handler/ha_innodb.cc branches/5.1: fix bug#40386: Not flushing query cache after truncate ha_statistics.records can not be 0 unless the table is empty, set to 1 instead. The original problem of bug#29507 is fixed in the server. Additional test was done with the fix of bug#29507 in the server. Approved by: Heikki (on IM) ------------------------------------------------------------------------ r3257 | inaam | 2008-11-24 22:06:50 +0200 (Mon, 24 Nov 2008) | 13 lines Changed paths: M /branches/5.1/handler/ha_innodb.cc M /branches/5.1/srv/srv0srv.c M /branches/5.1/trx/trx0trx.c branches/5.1 bug#40760 The config param innodb_thread_concurrency is dynamically set and is read when a thread enters/exits innodb. If the value is changed between the enter and exit time the behaviour becomes erratic. The fix is not to use srv_thread_concurrency when exiting, instead use the flag trx->declared_to_be_inside_innodb. rb://57 Approved by: Marko ------------------------------------------------------------------------ r3363 | calvin | 2008-12-04 19:00:20 +0200 (Thu, 04 Dec 2008) | 13 lines Changed paths: M /branches/5.1/mysql-test/innodb-autoinc.result branches/5.1: revert the changes in r2933 The changes in r2933 causes test failure on Linux. More investigation is needed for Windows. Change the followings in innodb-autoinc.result: auto-increment-increment auto-increment-offset back to: auto_increment_increment auto_increment_offset ------------------------------------------------------------------------ r3412 | vasil | 2008-12-05 10:46:18 +0200 (Fri, 05 Dec 2008) | 7 lines Changed paths: M /branches/5.1/trx/trx0undo.c branches/5.1: Add the traditional 2 spaces after the timestamp so the message does not look like: 070223 13:26:01InnoDB: Warning: canno.... ------------------------------------------------------------------------ r3458 | vasil | 2008-12-09 11:21:08 +0200 (Tue, 09 Dec 2008) | 51 lines Changed paths: M /branches/5.1/mysql-test/innodb_bug34300.test branches/5.1: Merge a change from MySQL to fix the failing innodb_bug34300 mysql-test: main.innodb_bug34300 [ fail ] mysqltest: At line 11: query 'SET @@max_allowed_packet=16777216' failed: 1621: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value Aborting: main.innodb_bug34300 failed in default mode. The changeset is this: ------------------------------------------------------------ revno: 2709.1.10 committer: Staale Smedseng <staale.smedseng@sun.com> branch nick: b22891-51-bugteam timestamp: Thu 2008-11-20 08:51:48 +0100 message: A fix for Bug#22891 "session level max_allowed_packet can be set but is ignored". This patch makes @@session.max_allowed_packed and @@session.net_buffer_length read-only as suggested in the bug report. The user will have to use SET GLOBAL (and reconnect) to alter the session values of these variables. The error string ER_VARIABLE_IS_READONLY is introduced. Tests are modified accordingly. modified: mysql-test/r/func_compress.result mysql-test/r/max_allowed_packet_basic.result mysql-test/r/max_allowed_packet_func.result mysql-test/r/net_buffer_length_basic.result mysql-test/r/packet.result mysql-test/r/union.result mysql-test/r/variables.result mysql-test/t/func_compress.test mysql-test/t/innodb_bug34300.test mysql-test/t/max_allowed_packet_basic.test mysql-test/t/max_allowed_packet_func.test mysql-test/t/net_buffer_length_basic.test mysql-test/t/packet.test mysql-test/t/union.test mysql-test/t/variables.test sql/set_var.cc sql/set_var.h sql/share/errmsg.txt ------------------------------------------------------------ ------------------------------------------------------------------------ ------------------------------------------------------------------------ r3480 | calvin | 2008-12-10 23:56:00 +0200 (Wed, 10 Dec 2008) | 11 lines branches/zip: Merge r3458:3479 from branches/5.1: ------------------------------------------------------------------------ r3479 | calvin | 2008-12-10 15:30:05 -0600 (Wed, 10 Dec 2008) | 4 lines branches/5.1: change .result file eol-style to LF mysql-test-run only takes LF style even on Windows. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r3481 | calvin | 2008-12-11 00:01:20 +0200 (Thu, 11 Dec 2008) | 4 lines branches/zip: change diff and result files eol-style to LF The patch utility takes LF style diff, and mysql-test-run also only takes LF style, even on Windows. ------------------------------------------------------------------------ r3482 | calvin | 2008-12-11 00:19:07 +0200 (Thu, 11 Dec 2008) | 9 lines branches/zip: fix Mantis issue #138 InnoDB fails if innodb_buffer_pool_size >= 4096M on x64 Windows All three srv_buf_pool related variables are defined as ulong, which is 32-bit on 64-bit Windows. They are changed to 64-bit ulint. Also system_info.dwPageSize appears to be 32-bit only. Casting to 64-bit is required. Approved by: Marko (on IM) ------------------------------------------------------------------------ r3498 | marko | 2008-12-11 17:08:14 +0200 (Thu, 11 Dec 2008) | 6 lines branches/zip: ibuf_merge_or_delete_for_page(): Restore the seemingly redundant checks for ibuf_fixed_addr_page() || fsp_descr_page() that were removed in r3432, and add a comment explaining why. Thanks to Michael for reporting this bug. ------------------------------------------------------------------------
245 lines
6.1 KiB
C
245 lines
6.1 KiB
C
/******************************************************
|
|
The interface to the operating system
|
|
process control primitives
|
|
|
|
(c) 1995 Innobase Oy
|
|
|
|
Created 9/30/1995 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "os0proc.h"
|
|
#ifdef UNIV_NONINL
|
|
#include "os0proc.ic"
|
|
#endif
|
|
|
|
#include "ut0mem.h"
|
|
#include "ut0byte.h"
|
|
|
|
/* FreeBSD for example has only MAP_ANON, Linux has MAP_ANONYMOUS and
|
|
MAP_ANON but MAP_ANON is marked as deprecated */
|
|
#if defined(MAP_ANONYMOUS)
|
|
#define OS_MAP_ANON MAP_ANONYMOUS
|
|
#elif defined(MAP_ANON)
|
|
#define OS_MAP_ANON MAP_ANON
|
|
#endif
|
|
|
|
UNIV_INTERN ibool os_use_large_pages;
|
|
/* Large page size. This may be a boot-time option on some platforms */
|
|
UNIV_INTERN ulint os_large_page_size;
|
|
|
|
/********************************************************************
|
|
Converts the current process id to a number. It is not guaranteed that the
|
|
number is unique. In Linux returns the 'process number' of the current
|
|
thread. That number is the same as one sees in 'top', for example. In Linux
|
|
the thread id is not the same as one sees in 'top'. */
|
|
UNIV_INTERN
|
|
ulint
|
|
os_proc_get_number(void)
|
|
/*====================*/
|
|
{
|
|
#ifdef __WIN__
|
|
return((ulint)GetCurrentProcessId());
|
|
#else
|
|
return((ulint)getpid());
|
|
#endif
|
|
}
|
|
|
|
/********************************************************************
|
|
Allocates non-cacheable memory. */
|
|
UNIV_INTERN
|
|
void*
|
|
os_mem_alloc_nocache(
|
|
/*=================*/
|
|
/* out: allocated memory */
|
|
ulint n) /* in: number of bytes */
|
|
{
|
|
#ifdef __WIN__
|
|
void* ptr;
|
|
|
|
ptr = VirtualAlloc(NULL, n, MEM_COMMIT,
|
|
PAGE_READWRITE | PAGE_NOCACHE);
|
|
ut_a(ptr);
|
|
|
|
return(ptr);
|
|
#else
|
|
return(ut_malloc(n));
|
|
#endif
|
|
}
|
|
|
|
/********************************************************************
|
|
Allocates large pages memory. */
|
|
UNIV_INTERN
|
|
void*
|
|
os_mem_alloc_large(
|
|
/*===============*/
|
|
/* out: allocated memory */
|
|
ulint* n) /* in/out: number of bytes */
|
|
{
|
|
void* ptr;
|
|
ulint size;
|
|
#if defined HAVE_LARGE_PAGES && defined UNIV_LINUX
|
|
int shmid;
|
|
struct shmid_ds buf;
|
|
|
|
if (!os_use_large_pages || !os_large_page_size) {
|
|
goto skip;
|
|
}
|
|
|
|
/* Align block size to os_large_page_size */
|
|
ut_ad(ut_is_2pow(os_large_page_size));
|
|
size = ut_2pow_round(*n + (os_large_page_size - 1),
|
|
os_large_page_size);
|
|
|
|
shmid = shmget(IPC_PRIVATE, (size_t)size, SHM_HUGETLB | SHM_R | SHM_W);
|
|
if (shmid < 0) {
|
|
fprintf(stderr, "InnoDB: HugeTLB: Warning: Failed to allocate"
|
|
" %lu bytes. errno %d\n", size, errno);
|
|
ptr = NULL;
|
|
} else {
|
|
ptr = shmat(shmid, NULL, 0);
|
|
if (ptr == (void *)-1) {
|
|
fprintf(stderr, "InnoDB: HugeTLB: Warning: Failed to"
|
|
" attach shared memory segment, errno %d\n",
|
|
errno);
|
|
}
|
|
|
|
/* Remove the shared memory segment so that it will be
|
|
automatically freed after memory is detached or
|
|
process exits */
|
|
shmctl(shmid, IPC_RMID, &buf);
|
|
}
|
|
|
|
if (ptr) {
|
|
*n = size;
|
|
ut_total_allocated_memory += size;
|
|
# ifdef UNIV_SET_MEM_TO_ZERO
|
|
memset(ptr, '\0', size);
|
|
# endif
|
|
return(ptr);
|
|
}
|
|
|
|
fprintf(stderr, "InnoDB HugeTLB: Warning: Using conventional"
|
|
" memory pool\n");
|
|
skip:
|
|
#endif /* HAVE_LARGE_PAGES && UNIV_LINUX */
|
|
|
|
#ifdef __WIN__
|
|
SYSTEM_INFO system_info;
|
|
GetSystemInfo(&system_info);
|
|
|
|
/* Align block size to system page size */
|
|
ut_ad(ut_is_2pow(system_info.dwPageSize));
|
|
/* system_info.dwPageSize is only 32-bit. Casting to ulint is required
|
|
on 64-bit Windows. */
|
|
size = *n = ut_2pow_round(*n + (system_info.dwPageSize - 1),
|
|
(ulint) system_info.dwPageSize);
|
|
ptr = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE,
|
|
PAGE_READWRITE);
|
|
if (!ptr) {
|
|
fprintf(stderr, "InnoDB: VirtualAlloc(%lu bytes) failed;"
|
|
" Windows error %lu\n",
|
|
(ulong) size, (ulong) GetLastError());
|
|
} else {
|
|
ut_total_allocated_memory += size;
|
|
}
|
|
#elif defined __NETWARE__ || !defined OS_MAP_ANON
|
|
size = *n;
|
|
ptr = ut_malloc_low(size, TRUE, FALSE);
|
|
#else
|
|
# ifdef HAVE_GETPAGESIZE
|
|
size = getpagesize();
|
|
# else
|
|
size = UNIV_PAGE_SIZE;
|
|
# endif
|
|
/* Align block size to system page size */
|
|
ut_ad(ut_is_2pow(size));
|
|
size = *n = ut_2pow_round(*n + (size - 1), size);
|
|
ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
|
|
MAP_PRIVATE | OS_MAP_ANON, -1, 0);
|
|
if (UNIV_UNLIKELY(ptr == (void*) -1)) {
|
|
fprintf(stderr, "InnoDB: mmap(%lu bytes) failed;"
|
|
" errno %lu\n",
|
|
(ulong) size, (ulong) errno);
|
|
ptr = NULL;
|
|
} else {
|
|
ut_total_allocated_memory += size;
|
|
}
|
|
#endif
|
|
return(ptr);
|
|
}
|
|
|
|
/********************************************************************
|
|
Frees large pages memory. */
|
|
UNIV_INTERN
|
|
void
|
|
os_mem_free_large(
|
|
/*==============*/
|
|
void *ptr, /* in: pointer returned by
|
|
os_mem_alloc_large() */
|
|
ulint size) /* in: size returned by
|
|
os_mem_alloc_large() */
|
|
{
|
|
ut_a(ut_total_allocated_memory >= size);
|
|
|
|
#if defined HAVE_LARGE_PAGES && defined UNIV_LINUX
|
|
if (os_use_large_pages && os_large_page_size && !shmdt(ptr)) {
|
|
ut_total_allocated_memory -= size;
|
|
return;
|
|
}
|
|
#endif /* HAVE_LARGE_PAGES && UNIV_LINUX */
|
|
#ifdef __WIN__
|
|
/* When RELEASE memory, the size parameter must be 0.
|
|
Do not use MEM_RELEASE with MEM_DECOMMIT. */
|
|
if (!VirtualFree(ptr, 0, MEM_RELEASE)) {
|
|
fprintf(stderr, "InnoDB: VirtualFree(%p, %lu) failed;"
|
|
" Windows error %lu\n",
|
|
ptr, (ulong) size, (ulong) GetLastError());
|
|
} else {
|
|
ut_total_allocated_memory -= size;
|
|
}
|
|
#elif defined __NETWARE__ || !defined OS_MAP_ANON
|
|
ut_free(ptr);
|
|
#else
|
|
if (munmap(ptr, size)) {
|
|
fprintf(stderr, "InnoDB: munmap(%p, %lu) failed;"
|
|
" errno %lu\n",
|
|
ptr, (ulong) size, (ulong) errno);
|
|
} else {
|
|
ut_total_allocated_memory -= size;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/********************************************************************
|
|
Sets the priority boost for threads released from waiting within the current
|
|
process. */
|
|
UNIV_INTERN
|
|
void
|
|
os_process_set_priority_boost(
|
|
/*==========================*/
|
|
ibool do_boost) /* in: TRUE if priority boost should be done,
|
|
FALSE if not */
|
|
{
|
|
#ifdef __WIN__
|
|
ibool no_boost;
|
|
|
|
if (do_boost) {
|
|
no_boost = FALSE;
|
|
} else {
|
|
no_boost = TRUE;
|
|
}
|
|
|
|
#if TRUE != 1
|
|
# error "TRUE != 1"
|
|
#endif
|
|
|
|
/* Does not do anything currently!
|
|
SetProcessPriorityBoost(GetCurrentProcess(), no_boost);
|
|
*/
|
|
fputs("Warning: process priority boost setting"
|
|
" currently not functional!\n",
|
|
stderr);
|
|
#else
|
|
UT_NOT_USED(do_boost);
|
|
#endif
|
|
}
|