代码拉取完成,页面将自动刷新
同步操作将从 compile_success/gazelle_kylin_src 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From b61caf98b117313d1c2d59c1954d494901adcb73 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 8 Oct 2022 20:39:48 +0800
Subject: [PATCH 19/21] add thread select path
---
src/lstack/api/lstack_wrap.c | 14 ++++++---
src/lstack/core/lstack_init.c | 54 +++++++++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index 296906e..d88513b 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -42,9 +42,11 @@ enum KERNEL_LWIP_PATH {
PATH_UNKNOW,
};
+bool select_thread_path(void);
+
static enum KERNEL_LWIP_PATH select_path(int fd)
{
- if (posix_api == NULL) {
+ if (unlikely(posix_api == NULL)) {
/* posix api maybe call before gazelle init */
if (posix_api_init() != 0) {
LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
@@ -52,6 +54,10 @@ static enum KERNEL_LWIP_PATH select_path(int fd)
return PATH_KERNEL;
}
+ if (!select_thread_path()) {
+ return PATH_KERNEL;
+ }
+
if (unlikely(posix_api->ues_posix)) {
return PATH_KERNEL;
}
@@ -93,7 +99,7 @@ static inline int32_t do_epoll_create(int32_t size)
static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event* event)
{
- if (unlikely(posix_api->ues_posix)) {
+ if (unlikely(posix_api->ues_posix) || !select_thread_path()) {
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
@@ -102,7 +108,7 @@ static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct
static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout)
{
- if (unlikely(posix_api->ues_posix)) {
+ if (unlikely(posix_api->ues_posix) || !select_thread_path()) {
return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
}
@@ -369,7 +375,7 @@ static int32_t do_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
GAZELLE_RETURN(EINVAL);
}
- if (unlikely(posix_api->ues_posix) || nfds == 0) {
+ if (unlikely(posix_api->ues_posix) || nfds == 0 || !select_thread_path()) {
return posix_api->poll_fn(fds, nfds, timeout);
}
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index b1c69e6..f647b8e 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -48,8 +48,10 @@
#define LSTACK_SO_NAME "liblstack.so"
#define LSTACK_PRELOAD_NAME_LEN PATH_MAX
#define LSTACK_PRELOAD_ENV_PROC "GAZELLE_BIND_PROCNAME"
+#define LSTACK_ENV_THREAD "GAZELLE_THREAD_NAME"
static volatile bool g_init_fail = false;
+static PER_THREAD int32_t g_thread_path = -1;
void set_init_fail(void)
{
@@ -64,14 +66,34 @@ bool get_init_fail(void)
struct lstack_preload {
int32_t preload_switch;
char env_procname[LSTACK_PRELOAD_NAME_LEN];
+ bool get_thread_name;
+ char env_threadname[LSTACK_PRELOAD_NAME_LEN];
};
static struct lstack_preload g_preload_info = {0};
+static void get_select_thread_name(void)
+{
+ g_preload_info.get_thread_name = true;
+
+ char *enval = NULL;
+ enval = getenv(LSTACK_ENV_THREAD);
+ if (enval == NULL) {
+ return;
+ }
+ if (strcpy_s(g_preload_info.env_threadname, LSTACK_PRELOAD_NAME_LEN, enval) != EOK) {
+ return;
+ }
+
+ LSTACK_PRE_LOG(LSTACK_INFO, "thread name=%s ok\n", g_preload_info.env_threadname);
+}
+
static int32_t preload_info_init(void)
{
char *enval = NULL;
g_preload_info.preload_switch = 0;
+
+ get_select_thread_name();
enval = getenv(LSTACK_PRELOAD_ENV_SYS);
if (enval == NULL) {
@@ -91,9 +113,41 @@ static int32_t preload_info_init(void)
}
g_preload_info.preload_switch = 1;
+ LSTACK_PRE_LOG(LSTACK_INFO, "LD_PRELOAD ok\n");
return 0;
}
+bool select_thread_path(void)
+{
+ if (g_thread_path >= 0) {
+ return g_thread_path;
+ }
+
+ if (!g_preload_info.get_thread_name) {
+ get_select_thread_name();
+ }
+
+ /* not set GAZELLE_THREAD_NAME, select all thread */
+ if (g_preload_info.env_threadname[0] == '\0') {
+ g_thread_path = 1;
+ return true;
+ }
+
+ char thread_name[PATH_MAX] = {0};
+ if (pthread_getname_np(pthread_self(), thread_name, PATH_MAX) != 0) {
+ g_thread_path = 0;
+ return false;
+ }
+
+ if (strstr(thread_name, g_preload_info.env_threadname) == NULL) {
+ g_thread_path = 0;
+ return false;
+ }
+
+ g_thread_path = 1;
+ return true;
+}
+
static int32_t check_process_conflict(void)
{
int32_t ret;
--
2.23.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。