summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
Diffstat (limited to 'mysys')
-rw-r--r--mysys/charset-def.c132
-rw-r--r--mysys/charset.c10
-rw-r--r--mysys/my_addr_resolve.c68
-rw-r--r--mysys/my_error.c4
-rw-r--r--mysys/my_getsystime.c30
-rw-r--r--mysys/my_init.c152
-rw-r--r--mysys/my_pthread.c63
-rw-r--r--mysys/my_winfile.c13
-rw-r--r--mysys/stacktrace.c45
-rw-r--r--mysys/thr_rwlock.c139
-rw-r--r--mysys/typelib.c2
11 files changed, 278 insertions, 380 deletions
diff --git a/mysys/charset-def.c b/mysys/charset-def.c
index b4317806762..249fb1b5e4d 100644
--- a/mysys/charset-def.c
+++ b/mysys/charset-def.c
@@ -116,37 +116,37 @@ extern struct charset_info_st my_charset_utf16_unicode_520_nopad_ci;
#endif /* HAVE_CHARSET_utf16 */
-#ifdef HAVE_CHARSET_utf8
-extern struct charset_info_st my_charset_utf8_german2_uca_ci;
-extern struct charset_info_st my_charset_utf8_icelandic_uca_ci;
-extern struct charset_info_st my_charset_utf8_latvian_uca_ci;
-extern struct charset_info_st my_charset_utf8_romanian_uca_ci;
-extern struct charset_info_st my_charset_utf8_slovenian_uca_ci;
-extern struct charset_info_st my_charset_utf8_polish_uca_ci;
-extern struct charset_info_st my_charset_utf8_estonian_uca_ci;
-extern struct charset_info_st my_charset_utf8_spanish_uca_ci;
-extern struct charset_info_st my_charset_utf8_swedish_uca_ci;
-extern struct charset_info_st my_charset_utf8_turkish_uca_ci;
-extern struct charset_info_st my_charset_utf8_czech_uca_ci;
-extern struct charset_info_st my_charset_utf8_danish_uca_ci;
-extern struct charset_info_st my_charset_utf8_lithuanian_uca_ci;
-extern struct charset_info_st my_charset_utf8_slovak_uca_ci;
-extern struct charset_info_st my_charset_utf8_spanish2_uca_ci;
-extern struct charset_info_st my_charset_utf8_roman_uca_ci;
-extern struct charset_info_st my_charset_utf8_persian_uca_ci;
-extern struct charset_info_st my_charset_utf8_esperanto_uca_ci;
-extern struct charset_info_st my_charset_utf8_hungarian_uca_ci;
-extern struct charset_info_st my_charset_utf8_croatian_mysql561_uca_ci;
-extern struct charset_info_st my_charset_utf8_sinhala_uca_ci;
-extern struct charset_info_st my_charset_utf8_unicode_520_ci;
-extern struct charset_info_st my_charset_utf8_vietnamese_ci;
-extern struct charset_info_st my_charset_utf8_croatian_uca_ci;
-extern struct charset_info_st my_charset_utf8_myanmar_uca_ci;
-extern struct charset_info_st my_charset_utf8_thai_520_w2;
+#ifdef HAVE_CHARSET_utf8mb3
+extern struct charset_info_st my_charset_utf8mb3_german2_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_icelandic_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_latvian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_romanian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_slovenian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_polish_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_estonian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_spanish_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_swedish_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_turkish_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_czech_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_danish_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_lithuanian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_slovak_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_spanish2_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_roman_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_persian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_esperanto_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_hungarian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_croatian_mysql561_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_sinhala_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_unicode_520_ci;
+extern struct charset_info_st my_charset_utf8mb3_vietnamese_ci;
+extern struct charset_info_st my_charset_utf8mb3_croatian_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_myanmar_uca_ci;
+extern struct charset_info_st my_charset_utf8mb3_thai_520_w2;
#ifdef HAVE_UTF8_GENERAL_CS
-extern struct charset_info_st my_charset_utf8_general_cs;
+extern struct charset_info_st my_charset_utf8mb3_general_cs;
#endif
-extern struct charset_info_st my_charset_utf8_unicode_520_nopad_ci;
+extern struct charset_info_st my_charset_utf8mb3_unicode_520_nopad_ci;
#endif
#ifdef HAVE_CHARSET_utf8mb4
@@ -304,47 +304,47 @@ my_bool init_compiled_charsets(myf flags __attribute__((unused)))
add_compiled_collation(&my_charset_ujis_nopad_bin);
#endif
-#ifdef HAVE_CHARSET_utf8
- add_compiled_collation(&my_charset_utf8_general_ci);
- add_compiled_collation(&my_charset_utf8_general_nopad_ci);
- add_compiled_collation(&my_charset_utf8_bin);
- add_compiled_collation(&my_charset_utf8_nopad_bin);
- add_compiled_collation(&my_charset_utf8_general_mysql500_ci);
+#ifdef HAVE_CHARSET_utf8mb3
+ add_compiled_collation(&my_charset_utf8mb3_general_ci);
+ add_compiled_collation(&my_charset_utf8mb3_general_nopad_ci);
+ add_compiled_collation(&my_charset_utf8mb3_bin);
+ add_compiled_collation(&my_charset_utf8mb3_nopad_bin);
+ add_compiled_collation(&my_charset_utf8mb3_general_mysql500_ci);
#ifdef HAVE_UTF8_GENERAL_CS
- add_compiled_collation(&my_charset_utf8_general_cs);
+ add_compiled_collation(&my_charset_utf8mb3_general_cs);
#endif
#ifdef HAVE_UCA_COLLATIONS
- add_compiled_collation(&my_charset_utf8_unicode_ci);
- add_compiled_collation(&my_charset_utf8_german2_uca_ci);
- add_compiled_collation(&my_charset_utf8_icelandic_uca_ci);
- add_compiled_collation(&my_charset_utf8_latvian_uca_ci);
- add_compiled_collation(&my_charset_utf8_romanian_uca_ci);
- add_compiled_collation(&my_charset_utf8_slovenian_uca_ci);
- add_compiled_collation(&my_charset_utf8_polish_uca_ci);
- add_compiled_collation(&my_charset_utf8_estonian_uca_ci);
- add_compiled_collation(&my_charset_utf8_spanish_uca_ci);
- add_compiled_collation(&my_charset_utf8_swedish_uca_ci);
- add_compiled_collation(&my_charset_utf8_turkish_uca_ci);
- add_compiled_collation(&my_charset_utf8_czech_uca_ci);
- add_compiled_collation(&my_charset_utf8_danish_uca_ci);
- add_compiled_collation(&my_charset_utf8_lithuanian_uca_ci);
- add_compiled_collation(&my_charset_utf8_slovak_uca_ci);
- add_compiled_collation(&my_charset_utf8_spanish2_uca_ci);
- add_compiled_collation(&my_charset_utf8_roman_uca_ci);
- add_compiled_collation(&my_charset_utf8_persian_uca_ci);
- add_compiled_collation(&my_charset_utf8_esperanto_uca_ci);
- add_compiled_collation(&my_charset_utf8_hungarian_uca_ci);
- add_compiled_collation(&my_charset_utf8_croatian_mysql561_uca_ci);
- add_compiled_collation(&my_charset_utf8_sinhala_uca_ci);
- add_compiled_collation(&my_charset_utf8_unicode_520_ci);
- add_compiled_collation(&my_charset_utf8_vietnamese_ci);
- add_compiled_collation(&my_charset_utf8_croatian_uca_ci);
- add_compiled_collation(&my_charset_utf8_myanmar_uca_ci);
- add_compiled_collation(&my_charset_utf8_thai_520_w2);
- add_compiled_collation(&my_charset_utf8_unicode_nopad_ci);
- add_compiled_collation(&my_charset_utf8_unicode_520_nopad_ci);
+ add_compiled_collation(&my_charset_utf8mb3_unicode_ci);
+ add_compiled_collation(&my_charset_utf8mb3_german2_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_icelandic_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_latvian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_romanian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_slovenian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_polish_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_estonian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_spanish_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_swedish_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_turkish_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_czech_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_danish_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_lithuanian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_slovak_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_spanish2_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_roman_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_persian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_esperanto_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_hungarian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_croatian_mysql561_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_sinhala_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_unicode_520_ci);
+ add_compiled_collation(&my_charset_utf8mb3_vietnamese_ci);
+ add_compiled_collation(&my_charset_utf8mb3_croatian_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_myanmar_uca_ci);
+ add_compiled_collation(&my_charset_utf8mb3_thai_520_w2);
+ add_compiled_collation(&my_charset_utf8mb3_unicode_nopad_ci);
+ add_compiled_collation(&my_charset_utf8mb3_unicode_520_nopad_ci);
#endif
-#endif /* HAVE_CHARSET_utf8 */
+#endif /* HAVE_CHARSET_utf8mb3 */
#ifdef HAVE_CHARSET_utf8mb4
diff --git a/mysys/charset.c b/mysys/charset.c
index f44dc7606c1..7771f5800ef 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -262,7 +262,7 @@ static my_bool simple_cs_is_full(CHARSET_INFO *cs)
}
-#if defined(HAVE_UCA_COLLATIONS) && (defined(HAVE_CHARSET_ucs2) || defined(HAVE_CHARSET_utf8))
+#if defined(HAVE_UCA_COLLATIONS) && (defined(HAVE_CHARSET_ucs2) || defined(HAVE_CHARSET_utf8mb3))
/**
Initialize a loaded collation.
@param [OUT] to - The new charset_info_st structure to initialize.
@@ -350,12 +350,12 @@ static int add_collation(struct charset_info_st *cs)
}
else if (!strcmp(cs->csname, "utf8") || !strcmp(cs->csname, "utf8mb3"))
{
-#if defined (HAVE_CHARSET_utf8) && defined(HAVE_UCA_COLLATIONS)
+#if defined (HAVE_CHARSET_utf8mb3) && defined(HAVE_UCA_COLLATIONS)
copy_uca_collation(newcs, newcs->state & MY_CS_NOPAD ?
- &my_charset_utf8_unicode_nopad_ci :
- &my_charset_utf8_unicode_ci,
+ &my_charset_utf8mb3_unicode_nopad_ci :
+ &my_charset_utf8mb3_unicode_ci,
cs);
- newcs->ctype= my_charset_utf8_unicode_ci.ctype;
+ newcs->ctype= my_charset_utf8mb3_unicode_ci.ctype;
if (init_state_maps(newcs))
return MY_XML_ERROR;
#endif
diff --git a/mysys/my_addr_resolve.c b/mysys/my_addr_resolve.c
index 7590d576a7c..ff15558ddd4 100644
--- a/mysys/my_addr_resolve.c
+++ b/mysys/my_addr_resolve.c
@@ -191,7 +191,9 @@ int start_addr2line_fork(const char *binary_path)
return 0;
}
-int my_addr_resolve(void *ptr, my_addr_loc *loc)
+static int first_error= 0;
+
+static int addr_resolve(void *ptr, my_addr_loc *loc)
{
char input[32];
size_t len;
@@ -206,29 +208,13 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc)
int filename_start = -1;
int line_number_start = -1;
- Dl_info info;
- void *offset;
-
- if (!dladdr(ptr, &info))
- return 1;
-
- if (strcmp(addr2line_binary, info.dli_fname))
- {
- /* We use dli_fname in case the path is longer than the length of our static
- string. We don't want to allocate anything dynamicaly here as we are in
- a "crashed" state. */
- if (start_addr2line_fork(info.dli_fname))
- {
- addr2line_binary[0] = '\0';
- return 2;
- }
- /* Save result for future comparisons. */
- strnmov(addr2line_binary, info.dli_fname, sizeof(addr2line_binary));
- }
- offset = info.dli_fbase;
- len= my_snprintf(input, sizeof(input), "%08x\n", (ulonglong)(ptr - offset));
+ len= my_snprintf(input, sizeof(input), "%p\n", ptr);
if (write(in[1], input, len) <= 0)
+ {
+ if (!first_error++)
+ fputs("Printing to addr2line failed\n", stderr);
return 3;
+ }
FD_ZERO(&set);
FD_SET(out[0], &set);
@@ -278,7 +264,7 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc)
loc->line= atoi(output + line_number_start);
/* Addr2line was unable to extract any meaningful information. */
- if (strcmp(loc->file, "??") == 0)
+ if (strcmp(loc->file, "??") == 0 && loc->func[0] == '?')
return 6;
loc->file= strip_path(loc->file);
@@ -286,6 +272,42 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc)
return 0;
}
+
+int my_addr_resolve(void *ptr, my_addr_loc *loc)
+{
+ Dl_info info;
+ int error;
+
+ if (!dladdr(ptr, &info))
+ return 1;
+
+ if (strcmp(addr2line_binary, info.dli_fname))
+ {
+ /*
+ We use dli_fname in case the path is longer than the length of
+ our static string. We don't want to allocate anything
+ dynamicaly here as we are in a "crashed" state.
+ */
+ if (start_addr2line_fork(info.dli_fname))
+ {
+ if (!first_error++)
+ fputs("Can't start addr2line\n", stderr);
+ addr2line_binary[0] = '\0';
+ return 2;
+ }
+ /* Save result for future comparisons. */
+ strnmov(addr2line_binary, info.dli_fname, sizeof(addr2line_binary));
+ }
+ if (!(error= addr_resolve(ptr, loc)))
+ return 0;
+#ifdef EXTRA_RESOLVE
+ if (!(error= addr_resolve((void*) (ptr - info.dli_fbase), loc)))
+ return 0;
+#endif
+ return error;
+}
+
+
const char *my_addr_resolve_init()
{
return 0;
diff --git a/mysys/my_error.c b/mysys/my_error.c
index 5f1ca0af55b..cb1fbfe1c04 100644
--- a/mysys/my_error.c
+++ b/mysys/my_error.c
@@ -118,7 +118,7 @@ void my_error(uint nr, myf MyFlags, ...)
else
{
va_start(args,MyFlags);
- (void) my_vsnprintf_ex(&my_charset_utf8_general_ci, ebuff,
+ (void) my_vsnprintf_ex(&my_charset_utf8mb3_general_ci, ebuff,
sizeof(ebuff), format, args);
va_end(args);
}
@@ -148,7 +148,7 @@ void my_printf_error(uint error, const char *format, myf MyFlags, ...)
error, MyFlags, errno, format));
va_start(args,MyFlags);
- (void) my_vsnprintf_ex(&my_charset_utf8_general_ci, ebuff,
+ (void) my_vsnprintf_ex(&my_charset_utf8mb3_general_ci, ebuff,
sizeof(ebuff), format, args);
va_end(args);
(*error_handler_hook)(error, ebuff, MyFlags);
diff --git a/mysys/my_getsystime.c b/mysys/my_getsystime.c
index 18218c2e8de..ce8a9ca786f 100644
--- a/mysys/my_getsystime.c
+++ b/mysys/my_getsystime.c
@@ -21,10 +21,8 @@
#ifdef _WIN32
#define OFFSET_TO_EPOC 116444736000000000LL
static ulonglong query_performance_frequency;
-typedef void (WINAPI* get_system_time_as_filetime_t)(LPFILETIME);
-static get_system_time_as_filetime_t
- my_GetSystemTimePreciseAsFileTime= GetSystemTimeAsFileTime;
#endif
+
#ifdef HAVE_LINUX_UNISTD_H
#include <linux/unistd.h>
#endif
@@ -57,20 +55,12 @@ ulonglong my_interval_timer()
#elif defined(HAVE_GETHRTIME)
return gethrtime();
#elif defined(_WIN32)
+ DBUG_ASSERT(query_performance_frequency);
LARGE_INTEGER t_cnt;
- if (query_performance_frequency)
- {
- QueryPerformanceCounter(&t_cnt);
- return (t_cnt.QuadPart / query_performance_frequency * 1000000000ULL) +
+ QueryPerformanceCounter(&t_cnt);
+ return (t_cnt.QuadPart / query_performance_frequency * 1000000000ULL) +
((t_cnt.QuadPart % query_performance_frequency) * 1000000000ULL /
query_performance_frequency);
- }
- else
- {
- ulonglong newtime;
- my_GetSystemTimePreciseAsFileTime((FILETIME*)&newtime);
- return newtime*100ULL;
- }
#else
/* TODO: check for other possibilities for hi-res timestamping */
struct timeval tv;
@@ -87,7 +77,7 @@ my_hrtime_t my_hrtime()
my_hrtime_t hrtime;
#if defined(_WIN32)
ulonglong newtime;
- my_GetSystemTimePreciseAsFileTime((FILETIME*)&newtime);
+ GetSystemTimePreciseAsFileTime((FILETIME*)&newtime);
hrtime.val= (newtime - OFFSET_TO_EPOC)/10;
#elif defined(HAVE_CLOCK_GETTIME)
struct timespec tp;
@@ -129,14 +119,8 @@ void my_time_init()
#ifdef _WIN32
compile_time_assert(sizeof(LARGE_INTEGER) ==
sizeof(query_performance_frequency));
- if (QueryPerformanceFrequency((LARGE_INTEGER *)&query_performance_frequency) == 0)
- query_performance_frequency= 0;
-
- get_system_time_as_filetime_t f= (get_system_time_as_filetime_t)
- GetProcAddress(GetModuleHandle("kernel32"),
- "GetSystemTimePreciseAsFileTime");
- if (f)
- my_GetSystemTimePreciseAsFileTime= f;
+ QueryPerformanceFrequency((LARGE_INTEGER *)&query_performance_frequency);
+ DBUG_ASSERT(query_performance_frequency);
#endif
}
diff --git a/mysys/my_init.c b/mysys/my_init.c
index d8fb2003052..fdde04be084 100644
--- a/mysys/my_init.c
+++ b/mysys/my_init.c
@@ -22,14 +22,13 @@
#include <m_ctype.h>
#include <signal.h>
#include <mysql/psi/mysql_stage.h>
-#ifdef __WIN__
+#ifdef _WIN32
#ifdef _MSC_VER
#include <locale.h>
#include <crtdbg.h>
/* WSAStartup needs winsock library*/
#pragma comment(lib, "ws2_32")
#endif
-my_bool have_tcpip=0;
static void my_win_init(void);
static my_bool win32_init_tcp_ip();
#else
@@ -119,8 +118,9 @@ my_bool my_init(void)
my_time_init();
my_win_init();
DBUG_PRINT("exit", ("home: '%s'", home_dir));
-#ifdef __WIN__
- win32_init_tcp_ip();
+#ifdef _WIN32
+ if (win32_init_tcp_ip())
+ DBUG_RETURN(1);
#endif
#ifdef CHECK_UNLIKELY
init_my_likely();
@@ -218,7 +218,7 @@ Voluntary context switches %ld, Involuntary context switches %ld\n",
rus.ru_msgsnd, rus.ru_msgrcv, rus.ru_nsignals,
rus.ru_nvcsw, rus.ru_nivcsw);
#endif
-#if defined(__WIN__) && defined(_MSC_VER)
+#if defined(_MSC_VER)
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
@@ -245,10 +245,9 @@ Voluntary context switches %ld, Involuntary context switches %ld\n",
(FILE *) 0);
#endif /* defined(SAFE_MUTEX) */
-#ifdef __WIN__
- if (have_tcpip)
- WSACleanup();
-#endif /* __WIN__ */
+#ifdef _WIN32
+ WSACleanup();
+#endif
/* At very last, delete mysys key, it is used everywhere including DBUG */
pthread_key_delete(THR_KEY_mysys);
@@ -263,16 +262,14 @@ void my_debug_put_break_here(void)
}
#endif
-#ifdef __WIN__
+#ifdef _WIN32
/*
my_parameter_handler
Invalid parameter handler we will use instead of the one "baked"
- into the CRT for MSC v8. This one just prints out what invalid
- parameter was encountered. By providing this routine, routines like
- lseek will return -1 when we expect them to instead of crash.
+ into the CRT.
*/
void my_parameter_handler(const wchar_t * expression, const wchar_t * function,
@@ -311,78 +308,14 @@ int handle_rtc_failure(int err_type, const char *file, int line,
#pragma runtime_checks("", restore)
#endif
-/*
- Open HKEY_LOCAL_MACHINE\SOFTWARE\MySQL and set any strings found
- there as environment variables
-*/
-static void win_init_registry(void)
-{
- HKEY key_handle;
-
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)"SOFTWARE\\MySQL",
- 0, KEY_READ, &key_handle) == ERROR_SUCCESS)
- {
- LONG ret;
- DWORD index= 0;
- DWORD type;
- char key_name[256], key_data[1024];
- DWORD key_name_len= sizeof(key_name) - 1;
- DWORD key_data_len= sizeof(key_data) - 1;
-
- while ((ret= RegEnumValue(key_handle, index++,
- key_name, &key_name_len,
- NULL, &type, (LPBYTE)&key_data,
- &key_data_len)) != ERROR_NO_MORE_ITEMS)
- {
- char env_string[sizeof(key_name) + sizeof(key_data) + 2];
-
- if (ret == ERROR_MORE_DATA)
- {
- /* Registry value larger than 'key_data', skip it */
- DBUG_PRINT("error", ("Skipped registry value that was too large"));
- }
- else if (ret == ERROR_SUCCESS)
- {
- if (type == REG_SZ)
- {
- strxmov(env_string, key_name, "=", key_data, NullS);
-
- /* variable for putenv must be allocated ! */
- putenv(strdup(env_string)) ;
- }
- }
- else
- {
- /* Unhandled error, break out of loop */
- break;
- }
-
- key_name_len= sizeof(key_name) - 1;
- key_data_len= sizeof(key_data) - 1;
- }
-
- RegCloseKey(key_handle);
- }
-}
-
static void my_win_init(void)
{
DBUG_ENTER("my_win_init");
#if defined(_MSC_VER)
-#if _MSC_VER < 1300
- /*
- Clear the OS system variable TZ and avoid the 100% CPU usage
- Only for old versions of Visual C++
- */
- _putenv("TZ=");
-#endif
-#if _MSC_VER >= 1400
- /* this is required to make crt functions return -1 appropriately */
_set_invalid_parameter_handler(my_parameter_handler);
#endif
-#endif
#ifdef __MSVC_RUNTIME_CHECKS
/*
@@ -394,75 +327,22 @@ static void my_win_init(void)
_tzset();
- win_init_registry();
-
DBUG_VOID_RETURN;
}
-/*------------------------------------------------------------------
- Name: CheckForTcpip| Desc: checks if tcpip has been installed on system
- According to Microsoft Developers documentation the first registry
- entry should be enough to check if TCP/IP is installed, but as expected
- this doesn't work on all Win32 machines :(
-------------------------------------------------------------------*/
-
-#define TCPIPKEY "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"
-#define WINSOCK2KEY "SYSTEM\\CurrentControlSet\\Services\\Winsock2\\Parameters"
-#define WINSOCKKEY "SYSTEM\\CurrentControlSet\\Services\\Winsock\\Parameters"
-
-static my_bool win32_have_tcpip(void)
-{
- HKEY hTcpipRegKey;
- if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, TCPIPKEY, 0, KEY_READ,
- &hTcpipRegKey) != ERROR_SUCCESS)
- {
- if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, WINSOCK2KEY, 0, KEY_READ,
- &hTcpipRegKey) != ERROR_SUCCESS)
- {
- if (RegOpenKeyEx ( HKEY_LOCAL_MACHINE, WINSOCKKEY, 0, KEY_READ,
- &hTcpipRegKey) != ERROR_SUCCESS)
- if (!getenv("HAVE_TCPIP") || have_tcpip) /* Provide a workaround */
- return (FALSE);
- }
- }
- RegCloseKey ( hTcpipRegKey);
- return (TRUE);
-}
-
-
static my_bool win32_init_tcp_ip()
{
- if (win32_have_tcpip())
+ WORD wVersionRequested = MAKEWORD( 2, 2 );
+ WSADATA wsaData;
+ if (WSAStartup(wVersionRequested, &wsaData))
{
- WORD wVersionRequested = MAKEWORD( 2, 2 );
- WSADATA wsaData;
- /* Be a good citizen: maybe another lib has already initialised
- sockets, so don't clobber them unless necessary */
- if (WSAStartup( wVersionRequested, &wsaData ))
- {
- /* Load failed, maybe because of previously loaded
- incompatible version; try again */
- WSACleanup( );
- if (!WSAStartup( wVersionRequested, &wsaData ))
- have_tcpip=1;
- }
- else
- {
- if (wsaData.wVersion != wVersionRequested)
- {
- /* Version is no good, try again */
- WSACleanup( );
- if (!WSAStartup( wVersionRequested, &wsaData ))
- have_tcpip=1;
- }
- else
- have_tcpip=1;
- }
+ fprintf(stderr, "WSAStartup() failed with error: %d\n", WSAGetLastError());
+ return 1;
}
return(0);
}
-#endif /* __WIN__ */
+#endif /* _WIN32 */
PSI_stage_info stage_waiting_for_table_level_lock=
{0, "Waiting for table level lock", 0};
diff --git a/mysys/my_pthread.c b/mysys/my_pthread.c
index e2795ed7bb9..ac6d3f87de3 100644
--- a/mysys/my_pthread.c
+++ b/mysys/my_pthread.c
@@ -405,3 +405,66 @@ int pthread_dummy(int ret)
{
return ret;
}
+
+
+/*
+ pthread_attr_setstacksize() without so much platform-dependency
+
+ Return: The actual stack size if possible.
+*/
+
+size_t my_setstacksize(pthread_attr_t *attr, size_t stacksize)
+{
+ size_t guard_size __attribute__((unused))= 0;
+
+#if defined(__ia64__) || defined(__ia64)
+ /*
+ On IA64, half of the requested stack size is used for "normal stack"
+ and half for "register stack". The space measured by check_stack_overrun
+ is the "normal stack", so double the request to make sure we have the
+ caller-expected amount of normal stack.
+
+ NOTE: there is no guarantee that the register stack can't grow faster
+ than normal stack, so it's very unclear that we won't dump core due to
+ stack overrun despite check_stack_overrun's efforts. Experimentation
+ shows that in the execution_constants test, the register stack grows
+ less than half as fast as normal stack, but perhaps other scenarios are
+ less forgiving. If it turns out that more space is needed for the
+ register stack, that could be forced (rather inefficiently) by using a
+ multiplier higher than 2 here.
+ */
+ stacksize *= 2;
+#endif
+
+ /*
+ On many machines, the "guard space" is subtracted from the requested
+ stack size, and that space is quite large on some platforms. So add
+ it to our request, if we can find out what it is.
+ */
+#ifdef HAVE_PTHREAD_ATTR_GETGUARDSIZE
+ if (pthread_attr_getguardsize(attr, &guard_size))
+ guard_size = 0; /* if can't find it out, treat as 0 */
+#endif /* HAVE_PTHREAD_ATTR_GETGUARDSIZE */
+
+ pthread_attr_setstacksize(attr, stacksize + guard_size);
+
+ /* Retrieve actual stack size if possible */
+#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
+ {
+ size_t real_stack_size= 0;
+ /* We must ignore real_stack_size = 0 as Solaris 2.9 can return 0 here */
+ if (pthread_attr_getstacksize(attr, &real_stack_size) == 0 &&
+ real_stack_size > guard_size)
+ {
+ real_stack_size -= guard_size;
+ if (real_stack_size < stacksize)
+ stacksize= real_stack_size;
+ }
+ }
+#endif /* HAVE_PTHREAD_ATTR_GETSTACKSIZE */
+
+#if defined(__ia64__) || defined(__ia64)
+ stacksize /= 2;
+#endif
+ return stacksize;
+}
diff --git a/mysys/my_winfile.c b/mysys/my_winfile.c
index 0c76eb25560..9c8d747adc9 100644
--- a/mysys/my_winfile.c
+++ b/mysys/my_winfile.c
@@ -501,13 +501,12 @@ static File my_get_stdfile_descriptor(FILE *stream)
}
-File my_win_fileno(FILE *file)
+File my_win_handle2File(HANDLE hFile)
{
- HANDLE hFile= (HANDLE)_get_osfhandle(fileno(file));
int retval= -1;
uint i;
- DBUG_ENTER("my_win_fileno");
+ DBUG_ENTER("my_win_handle2File");
for(i= MY_FILE_MIN; i < my_file_limit; i++)
{
@@ -517,6 +516,14 @@ File my_win_fileno(FILE *file)
break;
}
}
+ DBUG_RETURN(retval);
+}
+
+
+File my_win_fileno(FILE *file)
+{
+ DBUG_ENTER("my_win_fileno");
+ int retval= my_win_handle2File((HANDLE) _get_osfhandle(fileno(file)));
if(retval == -1)
/* try std stream */
DBUG_RETURN(my_get_stdfile_descriptor(file));
diff --git a/mysys/stacktrace.c b/mysys/stacktrace.c
index 2274c505195..19dcdf11dd5 100644
--- a/mysys/stacktrace.c
+++ b/mysys/stacktrace.c
@@ -14,12 +14,11 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
-#include <my_global.h>
+#include "mysys_priv.h"
#include <my_stacktrace.h>
#ifndef __WIN__
#include <signal.h>
-#include <my_pthread.h>
#include <m_string.h>
#ifdef HAVE_STACKTRACE
#include <unistd.h>
@@ -42,11 +41,49 @@ static char *heap_start;
extern char *__bss_start;
#endif
-void my_init_stacktrace()
+/**
+ Default handler for printing stacktrace
+*/
+
+static sig_handler default_handle_fatal_signal(int sig)
+{
+ my_safe_printf_stderr("%s: Got signal %d. Attempting backtrace\n",
+ my_progname_short, sig);
+ my_print_stacktrace(0,0,1);
+#ifndef __WIN__
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+#endif /* __WIN__ */
+ return;
+}
+
+
+/**
+ Initialize priting off stacktrace at signal
+
+ @param setup_handlers 0 only initialize variables
+ 1 setup signal handlers for stacktrace printing
+*/
+
+void my_init_stacktrace(int setup_handlers)
{
#if(defined HAVE_BSS_START) && !(defined __linux__)
heap_start = (char*) &__bss_start;
#endif
+ if (setup_handlers)
+ {
+ struct sigaction sa;
+ sa.sa_flags = SA_RESETHAND | SA_NODEFER;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_handler= default_handle_fatal_signal;
+ sigaction(SIGSEGV, &sa, NULL);
+ sigaction(SIGABRT, &sa, NULL);
+#ifdef SIGBUS
+ sigaction(SIGBUS, &sa, NULL);
+#endif
+ sigaction(SIGILL, &sa, NULL);
+ sigaction(SIGFPE, &sa, NULL);
+ }
}
#ifdef __linux__
@@ -510,7 +547,7 @@ static EXCEPTION_POINTERS *exception_ptrs;
#define MODULE64_SIZE_WINXP 576
#define STACKWALK_MAX_FRAMES 64
-void my_init_stacktrace()
+void my_init_stacktrace(int setup_handlers __attribute__((unused)))
{
}
diff --git a/mysys/thr_rwlock.c b/mysys/thr_rwlock.c
index ea8b73bf8f5..a8711d517f9 100644
--- a/mysys/thr_rwlock.c
+++ b/mysys/thr_rwlock.c
@@ -21,116 +21,66 @@
#ifdef _WIN32
-static BOOL have_srwlock= FALSE;
-/* Prototypes and function pointers for windows functions */
-typedef VOID (WINAPI* srw_func) (PSRWLOCK SRWLock);
-typedef BOOLEAN (WINAPI* srw_bool_func) (PSRWLOCK SRWLock);
-
-static srw_func my_InitializeSRWLock;
-static srw_func my_AcquireSRWLockExclusive;
-static srw_func my_ReleaseSRWLockExclusive;
-static srw_func my_AcquireSRWLockShared;
-static srw_func my_ReleaseSRWLockShared;
-
-static srw_bool_func my_TryAcquireSRWLockExclusive;
-static srw_bool_func my_TryAcquireSRWLockShared;
-
-/**
- Check for presence of Windows slim reader writer lock function.
- Load function pointers.
-*/
-
-static void check_srwlock_availability(void)
-{
- HMODULE module= GetModuleHandle("kernel32");
-
- my_InitializeSRWLock= (srw_func) GetProcAddress(module,
- "InitializeSRWLock");
- my_AcquireSRWLockExclusive= (srw_func) GetProcAddress(module,
- "AcquireSRWLockExclusive");
- my_AcquireSRWLockShared= (srw_func) GetProcAddress(module,
- "AcquireSRWLockShared");
- my_ReleaseSRWLockExclusive= (srw_func) GetProcAddress(module,
- "ReleaseSRWLockExclusive");
- my_ReleaseSRWLockShared= (srw_func) GetProcAddress(module,
- "ReleaseSRWLockShared");
- my_TryAcquireSRWLockExclusive= (srw_bool_func) GetProcAddress(module,
- "TryAcquireSRWLockExclusive");
- my_TryAcquireSRWLockShared= (srw_bool_func) GetProcAddress(module,
- "TryAcquireSRWLockShared");
-
- /*
- We currently require TryAcquireSRWLockExclusive. This API is missing on
- Vista, this means SRWLock are only used starting with Win7.
-
- If "trylock" usage for rwlocks is eliminated from server codebase (it is used
- in a single place currently, in query cache), then SRWLock can be enabled on
- Vista too. In this case condition below needs to be changed to e.g check
- for my_InitializeSRWLock.
- */
-
- if (my_TryAcquireSRWLockExclusive)
- have_srwlock= TRUE;
-
-}
-
-
-static int srw_init(my_rw_lock_t *rwp)
+int my_rw_init(my_rw_lock_t *rwp)
{
- my_InitializeSRWLock(&rwp->srwlock);
+ InitializeSRWLock(&rwp->srwlock);
rwp->have_exclusive_srwlock = FALSE;
return 0;
}
-static int srw_rdlock(my_rw_lock_t *rwp)
+int my_rw_rdlock(my_rw_lock_t *rwp)
{
- my_AcquireSRWLockShared(&rwp->srwlock);
+ AcquireSRWLockShared(&rwp->srwlock);
return 0;
}
-static int srw_tryrdlock(my_rw_lock_t *rwp)
+int my_rw_tryrdlock(my_rw_lock_t *rwp)
{
-
- if (!my_TryAcquireSRWLockShared(&rwp->srwlock))
+ if (!TryAcquireSRWLockShared(&rwp->srwlock))
return EBUSY;
return 0;
}
-static int srw_wrlock(my_rw_lock_t *rwp)
+int my_rw_wrlock(my_rw_lock_t *rwp)
{
- my_AcquireSRWLockExclusive(&rwp->srwlock);
+ AcquireSRWLockExclusive(&rwp->srwlock);
rwp->have_exclusive_srwlock= TRUE;
return 0;
}
-
-static int srw_trywrlock(my_rw_lock_t *rwp)
+int my_rw_trywrlock(my_rw_lock_t *rwp)
{
- if (!my_TryAcquireSRWLockExclusive(&rwp->srwlock))
+ if (!TryAcquireSRWLockExclusive(&rwp->srwlock))
return EBUSY;
rwp->have_exclusive_srwlock= TRUE;
return 0;
}
-static int srw_unlock(my_rw_lock_t *rwp)
+int my_rw_unlock(my_rw_lock_t *rwp)
{
if (rwp->have_exclusive_srwlock)
{
rwp->have_exclusive_srwlock= FALSE;
- my_ReleaseSRWLockExclusive(&rwp->srwlock);
+ ReleaseSRWLockExclusive(&rwp->srwlock);
}
else
{
- my_ReleaseSRWLockShared(&rwp->srwlock);
+ ReleaseSRWLockShared(&rwp->srwlock);
}
return 0;
}
-#endif /*_WIN32 */
+int my_rw_destroy(my_rw_lock_t* rwp)
+{
+ DBUG_ASSERT(!rwp->have_exclusive_srwlock);
+ return 0;
+}
+
+#else
/*
Source base from Sun Microsystems SPILT, simplified for MySQL use
@@ -175,22 +125,6 @@ int my_rw_init(my_rw_lock_t *rwp)
{
pthread_condattr_t cond_attr;
-#ifdef _WIN32
- /*
- Once initialization is used here rather than in my_init(), in order to
- - avoid my_init() pitfalls- (undefined order in which initialization should
- run)
- - be potentially useful C++ (static constructors)
- - just to simplify the API.
- Also, the overhead is of my_pthread_once is very small.
- */
- static my_pthread_once_t once_control= MY_PTHREAD_ONCE_INIT;
- my_pthread_once(&once_control, check_srwlock_availability);
-
- if (have_srwlock)
- return srw_init(rwp);
-#endif
-
pthread_mutex_init( &rwp->lock, MY_MUTEX_INIT_FAST);
pthread_condattr_init( &cond_attr );
pthread_cond_init( &rwp->readers, &cond_attr );
@@ -209,10 +143,6 @@ int my_rw_init(my_rw_lock_t *rwp)
int my_rw_destroy(my_rw_lock_t *rwp)
{
-#ifdef _WIN32
- if (have_srwlock)
- return 0; /* no destroy function */
-#endif
DBUG_ASSERT(rwp->state == 0);
pthread_mutex_destroy( &rwp->lock );
pthread_cond_destroy( &rwp->readers );
@@ -223,11 +153,6 @@ int my_rw_destroy(my_rw_lock_t *rwp)
int my_rw_rdlock(my_rw_lock_t *rwp)
{
-#ifdef _WIN32
- if (have_srwlock)
- return srw_rdlock(rwp);
-#endif
-
pthread_mutex_lock(&rwp->lock);
/* active or queued writers */
@@ -242,12 +167,6 @@ int my_rw_rdlock(my_rw_lock_t *rwp)
int my_rw_tryrdlock(my_rw_lock_t *rwp)
{
int res;
-
-#ifdef _WIN32
- if (have_srwlock)
- return srw_tryrdlock(rwp);
-#endif
-
pthread_mutex_lock(&rwp->lock);
if ((rwp->state < 0 ) || rwp->waiters)
res= EBUSY; /* Can't get lock */
@@ -263,11 +182,6 @@ int my_rw_tryrdlock(my_rw_lock_t *rwp)
int my_rw_wrlock(my_rw_lock_t *rwp)
{
-#ifdef _WIN32
- if (have_srwlock)
- return srw_wrlock(rwp);
-#endif
-
pthread_mutex_lock(&rwp->lock);
rwp->waiters++; /* another writer queued */
@@ -289,11 +203,6 @@ int my_rw_trywrlock(my_rw_lock_t *rwp)
{
int res;
-#ifdef _WIN32
- if (have_srwlock)
- return srw_trywrlock(rwp);
-#endif
-
pthread_mutex_lock(&rwp->lock);
if (rwp->state)
res= EBUSY; /* Can't get lock */
@@ -312,11 +221,6 @@ int my_rw_trywrlock(my_rw_lock_t *rwp)
int my_rw_unlock(my_rw_lock_t *rwp)
{
-#ifdef _WIN32
- if (have_srwlock)
- return srw_unlock(rwp);
-#endif
-
DBUG_PRINT("rw_unlock",
("state: %d waiters: %d", rwp->state, rwp->waiters));
pthread_mutex_lock(&rwp->lock);
@@ -347,7 +251,8 @@ int my_rw_unlock(my_rw_lock_t *rwp)
return(0);
}
-#endif /* defined(NEED_MY_RW_LOCK) */
+#endif /* !defined _WIN32 */
+#endif /* NEED_MY_RW_LOCK*/
int rw_pr_init(rw_pr_lock_t *rwlock)
diff --git a/mysys/typelib.c b/mysys/typelib.c
index f0037921a87..715e7ad42ba 100644
--- a/mysys/typelib.c
+++ b/mysys/typelib.c
@@ -226,7 +226,7 @@ my_ulonglong find_typeset(char *x, TYPELIB *lib, int *err)
NULL otherwise
*/
-TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from)
+TYPELIB *copy_typelib(MEM_ROOT *root, const TYPELIB *from)
{
TYPELIB *to;
uint i;