2005-10-27 07:29:40 +00:00
|
|
|
/******************************************************
|
|
|
|
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"
|
|
|
|
|
2007-09-04 07:29:59 +00:00
|
|
|
/* 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
|
|
|
|
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN ibool os_use_large_pages;
|
2005-10-27 07:29:40 +00:00
|
|
|
/* Large page size. This may be a boot-time option on some platforms */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN ulint os_large_page_size;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
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'. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
ulint
|
|
|
|
os_proc_get_number(void)
|
|
|
|
/*====================*/
|
|
|
|
{
|
|
|
|
#ifdef __WIN__
|
|
|
|
return((ulint)GetCurrentProcessId());
|
|
|
|
#else
|
|
|
|
return((ulint)getpid());
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
Allocates non-cacheable memory. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void*
|
|
|
|
os_mem_alloc_nocache(
|
|
|
|
/*=================*/
|
|
|
|
/* out: allocated memory */
|
|
|
|
ulint n) /* in: number of bytes */
|
|
|
|
{
|
|
|
|
#ifdef __WIN__
|
|
|
|
void* ptr;
|
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
ptr = VirtualAlloc(NULL, n, MEM_COMMIT,
|
2006-08-29 09:30:31 +00:00
|
|
|
PAGE_READWRITE | PAGE_NOCACHE);
|
2005-10-27 07:29:40 +00:00
|
|
|
ut_a(ptr);
|
|
|
|
|
|
|
|
return(ptr);
|
|
|
|
#else
|
|
|
|
return(ut_malloc(n));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
Allocates large pages memory. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void*
|
|
|
|
os_mem_alloc_large(
|
2006-02-23 19:25:29 +00:00
|
|
|
/*===============*/
|
|
|
|
/* out: allocated memory */
|
2006-11-01 08:13:58 +00:00
|
|
|
ulint* n) /* in/out: number of bytes */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2006-11-01 08:13:58 +00:00
|
|
|
void* ptr;
|
|
|
|
ulint size;
|
|
|
|
#if defined HAVE_LARGE_PAGES && defined UNIV_LINUX
|
2006-08-29 09:30:31 +00:00
|
|
|
int shmid;
|
|
|
|
struct shmid_ds buf;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-08-29 09:30:31 +00:00
|
|
|
if (!os_use_large_pages || !os_large_page_size) {
|
|
|
|
goto skip;
|
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-08-29 09:30:31 +00:00
|
|
|
/* Align block size to os_large_page_size */
|
2008-05-14 15:43:19 +00:00
|
|
|
ut_ad(ut_is_2pow(os_large_page_size));
|
|
|
|
size = ut_2pow_round(*n + (os_large_page_size - 1),
|
|
|
|
os_large_page_size);
|
2006-08-29 09:30:31 +00:00
|
|
|
|
|
|
|
shmid = shmget(IPC_PRIVATE, (size_t)size, SHM_HUGETLB | SHM_R | SHM_W);
|
|
|
|
if (shmid < 0) {
|
|
|
|
fprintf(stderr, "InnoDB: HugeTLB: Warning: Failed to allocate"
|
2006-11-01 08:13:58 +00:00
|
|
|
" %lu bytes. errno %d\n", size, errno);
|
|
|
|
ptr = NULL;
|
2006-08-29 09:30:31 +00:00
|
|
|
} 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);
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-08-29 09:30:31 +00:00
|
|
|
if (ptr) {
|
2006-11-01 08:13:58 +00:00
|
|
|
*n = size;
|
2008-01-16 12:45:27 +00:00
|
|
|
ut_total_allocated_memory += size;
|
2006-11-01 08:13:58 +00:00
|
|
|
# ifdef UNIV_SET_MEM_TO_ZERO
|
|
|
|
memset(ptr, '\0', size);
|
|
|
|
# endif
|
2006-08-29 09:30:31 +00:00
|
|
|
return(ptr);
|
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-08-29 09:30:31 +00:00
|
|
|
fprintf(stderr, "InnoDB HugeTLB: Warning: Using conventional"
|
|
|
|
" memory pool\n");
|
2005-10-27 07:29:40 +00:00
|
|
|
skip:
|
2006-11-01 08:13:58 +00:00
|
|
|
#endif /* HAVE_LARGE_PAGES && UNIV_LINUX */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-11-01 08:13:58 +00:00
|
|
|
#ifdef __WIN__
|
|
|
|
SYSTEM_INFO system_info;
|
|
|
|
GetSystemInfo(&system_info);
|
|
|
|
|
|
|
|
/* Align block size to system page size */
|
2008-05-14 15:43:19 +00:00
|
|
|
ut_ad(ut_is_2pow(system_info.dwPageSize));
|
branches/innodb+: Merge revisions 3459:3498 from branches/zip:
------------------------------------------------------------------------
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.
------------------------------------------------------------------------
2008-12-11 15:18:37 +00:00
|
|
|
/* system_info.dwPageSize is only 32-bit. Casting to ulint is required
|
|
|
|
on 64-bit Windows. */
|
2008-05-14 15:43:19 +00:00
|
|
|
size = *n = ut_2pow_round(*n + (system_info.dwPageSize - 1),
|
branches/innodb+: Merge revisions 3459:3498 from branches/zip:
------------------------------------------------------------------------
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.
------------------------------------------------------------------------
2008-12-11 15:18:37 +00:00
|
|
|
(ulint) system_info.dwPageSize);
|
2006-11-01 08:13:58 +00:00
|
|
|
ptr = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE,
|
2008-03-03 10:25:27 +00:00
|
|
|
PAGE_READWRITE);
|
2006-11-01 08:13:58 +00:00
|
|
|
if (!ptr) {
|
|
|
|
fprintf(stderr, "InnoDB: VirtualAlloc(%lu bytes) failed;"
|
|
|
|
" Windows error %lu\n",
|
|
|
|
(ulong) size, (ulong) GetLastError());
|
2008-01-16 12:45:27 +00:00
|
|
|
} else {
|
|
|
|
ut_total_allocated_memory += size;
|
2006-11-01 08:13:58 +00:00
|
|
|
}
|
2007-09-04 07:29:59 +00:00
|
|
|
#elif defined __NETWARE__ || !defined OS_MAP_ANON
|
2006-11-01 08:13:58 +00:00
|
|
|
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 */
|
2008-05-14 15:43:19 +00:00
|
|
|
ut_ad(ut_is_2pow(size));
|
|
|
|
size = *n = ut_2pow_round(*n + (size - 1), size);
|
2006-11-01 08:13:58 +00:00
|
|
|
ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
|
2007-09-04 07:29:59 +00:00
|
|
|
MAP_PRIVATE | OS_MAP_ANON, -1, 0);
|
2006-11-01 08:13:58 +00:00
|
|
|
if (UNIV_UNLIKELY(ptr == (void*) -1)) {
|
|
|
|
fprintf(stderr, "InnoDB: mmap(%lu bytes) failed;"
|
|
|
|
" errno %lu\n",
|
|
|
|
(ulong) size, (ulong) errno);
|
|
|
|
ptr = NULL;
|
2008-01-16 12:45:27 +00:00
|
|
|
} else {
|
|
|
|
ut_total_allocated_memory += size;
|
2006-11-01 08:13:58 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return(ptr);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
Frees large pages memory. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
os_mem_free_large(
|
2006-02-23 19:25:29 +00:00
|
|
|
/*==============*/
|
2006-11-01 08:13:58 +00:00
|
|
|
void *ptr, /* in: pointer returned by
|
|
|
|
os_mem_alloc_large() */
|
|
|
|
ulint size) /* in: size returned by
|
|
|
|
os_mem_alloc_large() */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2008-01-16 12:45:27 +00:00
|
|
|
ut_a(ut_total_allocated_memory >= size);
|
|
|
|
|
2006-11-01 08:13:58 +00:00
|
|
|
#if defined HAVE_LARGE_PAGES && defined UNIV_LINUX
|
|
|
|
if (os_use_large_pages && os_large_page_size && !shmdt(ptr)) {
|
2008-01-16 12:45:27 +00:00
|
|
|
ut_total_allocated_memory -= size;
|
2006-08-29 09:30:31 +00:00
|
|
|
return;
|
|
|
|
}
|
2006-11-01 08:13:58 +00:00
|
|
|
#endif /* HAVE_LARGE_PAGES && UNIV_LINUX */
|
|
|
|
#ifdef __WIN__
|
2008-09-22 07:57:34 +00:00
|
|
|
/* When RELEASE memory, the size parameter must be 0.
|
|
|
|
Do not use MEM_RELEASE with MEM_DECOMMIT. */
|
|
|
|
if (!VirtualFree(ptr, 0, MEM_RELEASE)) {
|
2006-11-01 08:13:58 +00:00
|
|
|
fprintf(stderr, "InnoDB: VirtualFree(%p, %lu) failed;"
|
|
|
|
" Windows error %lu\n",
|
|
|
|
ptr, (ulong) size, (ulong) GetLastError());
|
2008-01-16 12:45:27 +00:00
|
|
|
} else {
|
|
|
|
ut_total_allocated_memory -= size;
|
2006-11-01 08:13:58 +00:00
|
|
|
}
|
2007-09-04 07:29:59 +00:00
|
|
|
#elif defined __NETWARE__ || !defined OS_MAP_ANON
|
2006-08-29 09:30:31 +00:00
|
|
|
ut_free(ptr);
|
2006-11-01 08:13:58 +00:00
|
|
|
#else
|
|
|
|
if (munmap(ptr, size)) {
|
|
|
|
fprintf(stderr, "InnoDB: munmap(%p, %lu) failed;"
|
|
|
|
" errno %lu\n",
|
|
|
|
ptr, (ulong) size, (ulong) errno);
|
2008-01-16 12:45:27 +00:00
|
|
|
} else {
|
|
|
|
ut_total_allocated_memory -= size;
|
2006-11-01 08:13:58 +00:00
|
|
|
}
|
|
|
|
#endif
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
Sets the priority boost for threads released from waiting within the current
|
|
|
|
process. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
#if TRUE != 1
|
|
|
|
# error "TRUE != 1"
|
|
|
|
#endif
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-08-29 09:30:31 +00:00
|
|
|
/* Does not do anything currently!
|
2005-10-27 07:29:40 +00:00
|
|
|
SetProcessPriorityBoost(GetCurrentProcess(), no_boost);
|
2006-08-29 09:30:31 +00:00
|
|
|
*/
|
|
|
|
fputs("Warning: process priority boost setting"
|
|
|
|
" currently not functional!\n",
|
|
|
|
stderr);
|
2005-10-27 07:29:40 +00:00
|
|
|
#else
|
|
|
|
UT_NOT_USED(do_boost);
|
|
|
|
#endif
|
|
|
|
}
|