Files
openGauss-server/src/include/gs_thread.h
Mijamind fb4dc850bc 1.多机并行支持协调线程自适应扫描
2.libcomm初始化仅在spqplugin加载且是资源池化场景时打开
3.string_agg bugfix
4.新增对应spqscan是否多dop的计算
2023-10-23 22:28:11 +08:00

243 lines
6.1 KiB
C
Executable File

/*
* Copyright (c) 2020 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* ---------------------------------------------------------------------------------------
*
* gs_thread.h
* Exports from src/port/gs_thread.c.
*
*
* IDENTIFICATION
* src/include/gs_thread.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef GS_THREAD_H_
#define GS_THREAD_H_
#include "gs_threadlocal.h"
#ifdef WIN32
#include <winsock2.h>
#define _WINSOCKAPI_
#include <windows.h>
#else
#include <pthread.h>
#endif
#define gs_thread_id(_t) ((_t).thid)
#ifdef WIN32
#define gs_thread_handle(_t) ((HANDLE)(_t).os_handle)
typedef unsigned ThreadId;
typedef struct gs_thread_t {
ThreadId thid;
HANDLE os_handle;
} gs_thread_t;
#else
typedef pthread_t ThreadId;
typedef struct gs_thread_t {
ThreadId thid;
} gs_thread_t;
#endif
typedef enum knl_thread_role {
MASTER_THREAD = 0,
WORKER = 1,
THREADPOOL_WORKER = 2,
THREADPOOL_LISTENER,
THREADPOOL_SCHEDULER,
THREADPOOL_STREAM,
STREAM_WORKER,
AUTOVACUUM_LAUNCHER,
AUTOVACUUM_WORKER,
JOB_SCHEDULER,
JOB_WORKER,
WLM_WORKER,
WLM_MONITOR,
WLM_ARBITER,
WLM_CPMONITOR,
AUDITOR,
PGSTAT,
SYSLOGGER,
CATCHUP,
ARCH,
ALARMCHECK,
REAPER,
PAGEREDO,
TWOPASECLEANER,
STARTUP,
FAULTMONITOR,
BGWRITER,
SPBGWRITER,
PERCENTILE_WORKER,
TXNSNAP_CAPTURER,
TXNSNAP_WORKER,
CFS_SHRINKER,
RBCLEANER,
RBWORKER,
SNAPSHOT_WORKER,
ASH_WORKER,
TRACK_STMT_WORKER,
TRACK_STMT_CLEANER,
CHECKPOINT_THREAD,
WALWRITER,
WALWRITERAUXILIARY,
WALRECEIVER,
WALRECWRITE,
DATARECIVER,
DATARECWRITER,
CBMWRITER,
PAGEWRITER_THREAD,
PAGEREPAIR_THREAD,
HEARTBEAT,
COMM_SENDERFLOWER,
COMM_RECEIVERFLOWER,
COMM_RECEIVER,
COMM_AUXILIARY,
COMM_POOLER_CLEAN,
LOGICAL_READ_RECORD,
PARALLEL_DECODE,
UNDO_RECYCLER,
UNDO_LAUNCHER,
UNDO_WORKER,
CSNMIN_SYNC,
GLOBALSTATS_THREAD,
BARRIER_CREATOR,
BGWORKER,
BARRIER_ARCH,
SHARE_STORAGE_XLOG_COPYER,
APPLY_LAUNCHER,
APPLY_WORKER,
STACK_PERF_WORKER,
#ifdef USE_SPQ
SPQ_COORDINATOR,
#endif
DMS_AUXILIARY_THREAD,
EXRTO_RECYCLER,
BARRIER_PREPARSE,
TS_COMPACTION,
TS_COMPACTION_CONSUMER,
TS_COMPACTION_AUXILIAY,
STREAMING_BACKEND,
STREAMING_ROUTER_BACKEND,
STREAMING_WORKER_BACKEND,
STREAMING_COLLECTOR_BACKEND,
STREAMING_QUEUE_BACKEND,
STREAMING_REAPER_BACKEND,
COMM_PROXYER,
/* should be last valid thread. */
THREAD_ENTRY_BOUND,
NO_SUBROLE,
REDISTRIBUTION_WORKER,
WAL_NORMAL_SENDER,
WAL_HADR_SENDER, /* A cross cluster wal sender to hadr cluster main standby */
WAL_HADR_CN_SENDER, /* A cross cluster wal sender to hadr cluster coordinator standby */
WAL_SHARE_STORE_SENDER, /* A cross cluster wal sender to share storage cluster standby */
WAL_STANDBY_SENDER, /* Am I cascading WAL to another standby ? */
WAL_DB_SENDER,
TOP_CONSUMER,
DCF_WORKER,
DMS_WORKER,
SW_SENDER
} knl_thread_role;
#ifdef USE_SPQ
typedef enum {
ROLE_UTILITY = 0, /* Operating as a simple database engine */
ROLE_QUERY_COORDINTOR, /* Operating as the parallel query dispatcher */
ROLE_QUERY_EXECUTOR, /* Operating as a parallel query executor */
ROLE_UNDEFINED /* Should never see this role in use */
} SpqRole;
#endif
/*
* It is an 64bit identifier in Linux x64 system. There are many legacy
* code assumes the original pid is 32 bit where we replace with threadId.
* If printf this number, we use %lu within the server. When compare valid
* ThreadIds, use PtThread::Equal() function.
*/
#define INVALID_NEXT_ADDR (void*)((unsigned long)(-1))
typedef struct knl_thread_arg {
knl_thread_role role;
char* save_para;
void* payload;
void* t_thrd;
#ifdef USE_SPQ
SpqRole spq_role;
#endif
union {
struct syslog_thread {
int syslog_handle;
} log_thread;
} extra_payload;
} knl_thread_arg;
typedef int (*GaussdbThreadEntry)(knl_thread_arg* arg);
typedef struct ThreadMetaData {
GaussdbThreadEntry func;
knl_thread_role role;
const char* thr_name; /* keep strlen(thr_name) < 16 */
const char* thr_long_name;
} ThreadMetaData;
/*
* A generic holder to keep all necessary arguments passed to generic
* ThreadStarterFunc() function.
*/
typedef struct ThreadArg {
void* (*m_taskRoutine)(void*); /* Task function caller passed in by the caller. */
struct ThreadArg* next; /* if next is INVALID_NEXT_ID, the ThreadArg is malloc when create a thread */
knl_thread_arg m_thd_arg;
} ThreadArg;
#define InvalidTid ((ThreadId)(-1)) /* An invalid thread identifier */
#ifdef WIN32
extern HANDLE gs_thread_get_handle(unsigned ThreadId);
#endif
extern gs_thread_t gs_thread_get_cur_thread(void);
extern ThreadId gs_thread_self(void);
extern void gs_thread_exit(int code);
extern void gs_thread_args_free(void);
extern int gs_thread_create(gs_thread_t* thread, void* (*taskRoutine)(void*), int argc, void* argv);
extern int gs_thread_join(gs_thread_t thread, void** value_ptr);
extern void gs_thread_args_pool_init(unsigned long pool_size, unsigned long backend_para_size);
extern void gs_thread_release_args_slot(ThreadArg* thrArg);
extern ThreadArg* gs_thread_get_args_slot(void);
extern void gs_thread_get_name(char** name_thread, char** argv, int argc);
extern void ThreadExitCXX(int code);
extern int ShowThreadName(const char* name);
typedef void (*uuid_struct_destroy_hook_type)(int which);
extern THR_LOCAL uuid_struct_destroy_hook_type uuid_struct_destroy_hook;
#endif /*GS_THREAD_H_ */