mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03:00
Add support for Atomic instructions for Windows
Enables Google patch support on Windows
This commit is contained in:
@@ -25,6 +25,25 @@ IF(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_SIZEOF_VOID_P MATCHES 8)
|
|||||||
PROPERTIES COMPILE_FLAGS -Od)
|
PROPERTIES COMPILE_FLAGS -Od)
|
||||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_SIZEOF_VOID_P MATCHES 8)
|
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_SIZEOF_VOID_P MATCHES 8)
|
||||||
|
|
||||||
|
IF (NOT WITHOUT_ATOMICS)
|
||||||
|
# Check if this Windows version supports atomic instructions
|
||||||
|
IF (CMAKE_SIZEOF_VOID_P MATCHES 8)
|
||||||
|
# Check for 64 bit atomics
|
||||||
|
TRY_RUN(RUN_RES COMPILE_RES ${CMAKE_BINARY_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/storage/innobase/win_atomics64_test.c)
|
||||||
|
IF (RUN_RES)
|
||||||
|
ADD_DEFINTIONS(-DWIN_ATOMICS64)
|
||||||
|
ENDIF (RUN_RES)
|
||||||
|
ELSE (CMAKE_SIZEOF_VOID_P MATCHES 8)
|
||||||
|
# Check for 32 bit atomics
|
||||||
|
TRY_RUN(run_res compile_res ${CMAKE_BINARY_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/storage/innobase/win_atomics32_test.c)
|
||||||
|
IF (RUN_RES)
|
||||||
|
ADD_DEFINITIONS(-DWIN_ATOMICS32)
|
||||||
|
ENDIF (RUN_RES)
|
||||||
|
ENDIF (CMAKE_SIZEOF_VOID_P MATCHES 8)
|
||||||
|
ENDIF (NOT WITHOUT_ATOMICS)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib
|
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib
|
||||||
${CMAKE_SOURCE_DIR}/storage/innobase/include
|
${CMAKE_SOURCE_DIR}/storage/innobase/include
|
||||||
${CMAKE_SOURCE_DIR}/storage/innobase/handler
|
${CMAKE_SOURCE_DIR}/storage/innobase/handler
|
||||||
|
@@ -168,7 +168,8 @@ ha_innodb_la_SOURCES= $(libinnobase_a_SOURCES)
|
|||||||
|
|
||||||
EXTRA_DIST= CMakeLists.txt plug.in \
|
EXTRA_DIST= CMakeLists.txt plug.in \
|
||||||
pars/make_bison.sh pars/make_flex.sh \
|
pars/make_bison.sh pars/make_flex.sh \
|
||||||
pars/pars0grm.y pars/pars0lex.l
|
pars/pars0grm.y pars/pars0lex.l \
|
||||||
|
win_atomics32_test.c win_atomics64_test.c
|
||||||
|
|
||||||
# Don't update the files from bitkeeper
|
# Don't update the files from bitkeeper
|
||||||
%::SCCS/s.%
|
%::SCCS/s.%
|
||||||
|
@@ -64,6 +64,12 @@ os_compare_and_swap(
|
|||||||
lint retVal = (lint)atomic_cas_ulong((volatile ulong_t *)ptr,
|
lint retVal = (lint)atomic_cas_ulong((volatile ulong_t *)ptr,
|
||||||
oldVal, newVal);
|
oldVal, newVal);
|
||||||
return (retVal == oldVal);
|
return (retVal == oldVal);
|
||||||
|
#elif WIN_ATOMICS32
|
||||||
|
lint retVal = (lint)InterlockedCompareExchange(ptr, newVal, oldVal);
|
||||||
|
return (retVal == oldVal);
|
||||||
|
#elif WIN_ATOMICS64
|
||||||
|
lint retVal = (lint)InterlockedCompareExchange64(ptr, newVal, oldVal);
|
||||||
|
return (retVal == oldVal);
|
||||||
#else
|
#else
|
||||||
#error "Need support for atomic ops"
|
#error "Need support for atomic ops"
|
||||||
#endif
|
#endif
|
||||||
@@ -79,6 +85,10 @@ os_memory_barrier_load()
|
|||||||
__sync_synchronize();
|
__sync_synchronize();
|
||||||
#elif HAVE_SOLARIS_ATOMIC
|
#elif HAVE_SOLARIS_ATOMIC
|
||||||
membar_consumer();
|
membar_consumer();
|
||||||
|
#elif WIN_ATOMICS32
|
||||||
|
MemoryBarrier();
|
||||||
|
#elif WIN_ATOMICS64
|
||||||
|
MemoryBarrier();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,6 +102,10 @@ os_memory_barrier_store()
|
|||||||
__sync_synchronize();
|
__sync_synchronize();
|
||||||
#elif HAVE_SOLARIS_ATOMIC
|
#elif HAVE_SOLARIS_ATOMIC
|
||||||
membar_producer();
|
membar_producer();
|
||||||
|
#elif WIN_ATOMICS32
|
||||||
|
MemoryBarrier();
|
||||||
|
#elif WIN_ATOMICS64
|
||||||
|
MemoryBarrier();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +119,10 @@ os_memory_barrier()
|
|||||||
__sync_synchronize();
|
__sync_synchronize();
|
||||||
#elif HAVE_SOLARIS_ATOMIC
|
#elif HAVE_SOLARIS_ATOMIC
|
||||||
membar_enter();
|
membar_enter();
|
||||||
|
#elif WIN_ATOMICS32
|
||||||
|
MemoryBarrier();
|
||||||
|
#elif WIN_ATOMICS64
|
||||||
|
MemoryBarrier();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,9 +141,12 @@ os_atomic_increment(
|
|||||||
return (__sync_add_and_fetch(ptr, amount));
|
return (__sync_add_and_fetch(ptr, amount));
|
||||||
#elif HAVE_SOLARIS_ATOMIC
|
#elif HAVE_SOLARIS_ATOMIC
|
||||||
return ((lint)atomic_add_long_nv((volatile ulong_t *)ptr, amount));
|
return ((lint)atomic_add_long_nv((volatile ulong_t *)ptr, amount));
|
||||||
|
#elif WIN_ATOMICS32
|
||||||
|
return ((lint)InterlockedExchangeAdd(ptr, amount));
|
||||||
|
#elif WIN_ATOMICS64
|
||||||
|
return ((lint)InterlockedExchangeAdd64(ptr, amount));
|
||||||
#else
|
#else
|
||||||
#error "Need support for atomic ops"
|
#error "Need support for atomic ops"
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* UNIV_SYNC_ATOMIC */
|
#endif /* UNIV_SYNC_ATOMIC */
|
||||||
|
@@ -144,6 +144,14 @@ by one. */
|
|||||||
#define UNIV_SYNC_ATOMIC
|
#define UNIV_SYNC_ATOMIC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WIN_ATOMICS32) || defined(WIN_ATOMICS64)
|
||||||
|
/*
|
||||||
|
* We have a full set of atomic ops available - we will use them
|
||||||
|
* This is on Windows
|
||||||
|
*/
|
||||||
|
#define UNIV_SYNC_ATOMIC
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#define UNIV_SQL_DEBUG
|
#define UNIV_SQL_DEBUG
|
||||||
#define UNIV_LOG_DEBUG
|
#define UNIV_LOG_DEBUG
|
||||||
|
30
storage/innobase/win_atomics32_test.c
Normal file
30
storage/innobase/win_atomics32_test.c
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Copyright (C) 2009 Sun Microsystems AB
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; version 2 of the License.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
volatile long var32 = 0;
|
||||||
|
long add32 = 1;
|
||||||
|
long old32 = 0;
|
||||||
|
long exch32 = 1;
|
||||||
|
long ret_value;
|
||||||
|
|
||||||
|
ret_value = InterlockedExchangeAdd(&var32, add32);
|
||||||
|
ret_value = InterlockedCompareExchange(&var32, exch32, old32);
|
||||||
|
MemoryBarrier();
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
29
storage/innobase/win_atomics64_test.c
Normal file
29
storage/innobase/win_atomics64_test.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Copyright (C) 2009 Sun Microsystems AB
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; version 2 of the License.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
volatile long long var64 = 0;
|
||||||
|
long long add64 = 1;
|
||||||
|
long long old64 = 0;
|
||||||
|
long long exch64 = 1;
|
||||||
|
long long ret_value;
|
||||||
|
|
||||||
|
ret_value = InterlockedExchangeAdd64(&var64, add64);
|
||||||
|
ret_value = InterlockedCompareExchange64(&var64, exch64, old64);
|
||||||
|
MemoryBarrier();
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
@@ -58,6 +58,7 @@ The options right now are:
|
|||||||
WITH_EXAMPLE_STORAGE_ENGINE
|
WITH_EXAMPLE_STORAGE_ENGINE
|
||||||
WITH_FEDERATED_STORAGE_ENGINE
|
WITH_FEDERATED_STORAGE_ENGINE
|
||||||
__NT__ Enable named pipe support
|
__NT__ Enable named pipe support
|
||||||
|
WITHOUT_ATOMICS Do not use atomic instructions
|
||||||
MYSQL_SERVER_SUFFIX=<suffix> Server suffix, default none
|
MYSQL_SERVER_SUFFIX=<suffix> Server suffix, default none
|
||||||
COMPILATION_COMMENT=<comment> Server comment, default "Source distribution"
|
COMPILATION_COMMENT=<comment> Server comment, default "Source distribution"
|
||||||
MYSQL_TCP_PORT=<port> Server port, default 3306
|
MYSQL_TCP_PORT=<port> Server port, default 3306
|
||||||
|
@@ -50,6 +50,7 @@ try
|
|||||||
case "EMBED_MANIFESTS":
|
case "EMBED_MANIFESTS":
|
||||||
case "EXTRA_DEBUG":
|
case "EXTRA_DEBUG":
|
||||||
case "WITH_EMBEDDED_SERVER":
|
case "WITH_EMBEDDED_SERVER":
|
||||||
|
case "WITHOUT_ATOMICS":
|
||||||
configfile.WriteLine("SET (" + args.Item(i) + " TRUE)");
|
configfile.WriteLine("SET (" + args.Item(i) + " TRUE)");
|
||||||
break;
|
break;
|
||||||
case "MYSQL_SERVER_SUFFIX":
|
case "MYSQL_SERVER_SUFFIX":
|
||||||
|
Reference in New Issue
Block a user