mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
186a1afe63
Rename some threads to workaround this restrictions, e.g "rpl_parallel_thread"->"rpl_parallel", "slave_background" -> "slave_bg" etc.
104 lines
3.3 KiB
C++
104 lines
3.3 KiB
C++
/* Copyright 2024, MariaDB.
|
|
|
|
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-1335 USA */
|
|
|
|
#include <my_global.h>
|
|
#include <my_pthread.h>
|
|
#include <my_sys.h>
|
|
#include "mysql/psi/psi.h"
|
|
#include <stdio.h>
|
|
|
|
#ifdef _WIN32
|
|
#define MAX_THREAD_NAME 256
|
|
typedef HRESULT (*func_SetThreadDescription)(HANDLE,PCWSTR);
|
|
#elif defined(__linux__)
|
|
#define MAX_THREAD_NAME 16
|
|
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
|
|
#include <pthread_np.h>
|
|
#endif
|
|
|
|
#if defined(HAVE_PSI_THREAD_INTERFACE) && !defined DBUG_OFF
|
|
/**
|
|
Check that the name is consistent with PSI.
|
|
Require that the name matches the last part of PSI's class name
|
|
(e.g. "thread/sql/main" -> "main").
|
|
|
|
We drop the namespace prefix, because these thread names are
|
|
truncated to 15 characters on Linux, and something like "innodb/" would
|
|
already take up about half of that.
|
|
*/
|
|
static void dbug_verify_thread_name(const char *name)
|
|
{
|
|
const char *psi_name= NULL;
|
|
const char *thread_class_name= PSI_THREAD_CALL(get_thread_class_name)();
|
|
if (thread_class_name)
|
|
{
|
|
/* Remove the path prefix */
|
|
const char *last_part= strrchr(thread_class_name, '/');
|
|
if (last_part)
|
|
psi_name= last_part + 1;
|
|
else
|
|
psi_name= thread_class_name;
|
|
}
|
|
if (psi_name && strcmp(psi_name, name))
|
|
{
|
|
fprintf(stderr, "ERROR: my_thread_set_name() mismatch: PSI name '%s' != '%s'\n",
|
|
psi_name, name);
|
|
abort();
|
|
}
|
|
size_t len= strlen(name);
|
|
if (len > 15)
|
|
{
|
|
/* Linux can' handle "long" (> 15 chars) names */
|
|
fprintf(stderr, "ERROR: my_thread_set_name() name too long: '%s'\n", name);
|
|
abort();
|
|
}
|
|
}
|
|
#else
|
|
#define dbug_verify_thread_name(name) do {} while (0)
|
|
#endif
|
|
|
|
/* Set current thread name for debugger/profiler and similar tools. */
|
|
extern "C" void my_thread_set_name(const char *name)
|
|
{
|
|
dbug_verify_thread_name(name);
|
|
|
|
#ifdef _WIN32
|
|
/*
|
|
SetThreadDescription might not be there on older Windows versions.
|
|
Load it dynamically.
|
|
*/
|
|
static func_SetThreadDescription my_SetThreadDescription=
|
|
(func_SetThreadDescription) GetProcAddress(GetModuleHandle("kernel32"),
|
|
"SetThreadDescription");
|
|
if (!my_SetThreadDescription)
|
|
return;
|
|
wchar_t wname[MAX_THREAD_NAME];
|
|
wname[0]= 0;
|
|
MultiByteToWideChar(CP_UTF8, 0, name, -1, wname, MAX_THREAD_NAME);
|
|
my_SetThreadDescription(GetCurrentThread(), wname);
|
|
#elif defined __linux__
|
|
char shortname[MAX_THREAD_NAME];
|
|
snprintf(shortname, MAX_THREAD_NAME, "%s", name);
|
|
pthread_setname_np(pthread_self(), shortname);
|
|
#elif defined __NetBSD__
|
|
pthread_setname_np(pthread_self(), "%s", (void *) name);
|
|
#elif defined __FreeBSD__ || defined __OpenBSD__
|
|
pthread_set_name_np(pthread_self(), name);
|
|
#elif defined __APPLE__
|
|
pthread_setname_np(name);
|
|
#else
|
|
(void) name;
|
|
#endif
|
|
}
|