diff options
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/charset-def.c | 132 | ||||
-rw-r--r-- | mysys/charset.c | 10 | ||||
-rw-r--r-- | mysys/my_addr_resolve.c | 68 | ||||
-rw-r--r-- | mysys/my_error.c | 4 | ||||
-rw-r--r-- | mysys/my_getsystime.c | 30 | ||||
-rw-r--r-- | mysys/my_init.c | 152 | ||||
-rw-r--r-- | mysys/my_pthread.c | 63 | ||||
-rw-r--r-- | mysys/my_winfile.c | 13 | ||||
-rw-r--r-- | mysys/stacktrace.c | 45 | ||||
-rw-r--r-- | mysys/thr_rwlock.c | 139 | ||||
-rw-r--r-- | mysys/typelib.c | 2 |
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; |