From 9404a56be576f14499dc260f0c215b97b10a1a5b Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 26 Apr 2021 08:05:39 +0800 Subject: [PATCH] ST: Support thread-local state-threads commit 755c3b227d3207458c251156cc9bf14df9da13fc Author: winlin Date: Tue Apr 6 19:46:33 2021 +0800 ST: Change global stat variables to thread-local. commit 2307a511567cbad01c232f0afdd3c283656aee78 Author: winlin Date: Tue Apr 6 15:21:14 2021 +0800 ST: Support thread-local ST, fix bug. commit a385d361a654acd9e477ec5eef53d0eae975a63a Author: winlin Date: Mon Apr 5 12:37:53 2021 +0800 ST: Change ST to thread-local 1. All statick and global variables is thread-local. 2. Call st_init() to init st for each thread. 3. Notice that ST is isolate for threads. --- trunk/3rdparty/st-srs/common.h | 6 ++-- trunk/3rdparty/st-srs/event.c | 14 ++++----- trunk/3rdparty/st-srs/io.c | 30 ++++++++++---------- trunk/3rdparty/st-srs/sched.c | 52 +++++++++++++++++++--------------- trunk/3rdparty/st-srs/stk.c | 6 ++-- trunk/3rdparty/st-srs/sync.c | 6 ++-- 6 files changed, 60 insertions(+), 54 deletions(-) diff --git a/trunk/3rdparty/st-srs/common.h b/trunk/3rdparty/st-srs/common.h index 744f37becc..3c15cff916 100644 --- a/trunk/3rdparty/st-srs/common.h +++ b/trunk/3rdparty/st-srs/common.h @@ -264,9 +264,9 @@ typedef struct _st_netfd { * Current vp, thread, and event system */ -extern _st_vp_t _st_this_vp; -extern _st_thread_t *_st_this_thread; -extern _st_eventsys_t *_st_eventsys; +extern __thread _st_vp_t _st_this_vp; +extern __thread _st_thread_t *_st_this_thread; +extern __thread _st_eventsys_t *_st_eventsys; #define _ST_CURRENT_THREAD() (_st_this_thread) #define _ST_SET_CURRENT_THREAD(_thread) (_st_this_thread = (_thread)) diff --git a/trunk/3rdparty/st-srs/event.c b/trunk/3rdparty/st-srs/event.c index d7e770d341..1af11cee3d 100644 --- a/trunk/3rdparty/st-srs/event.c +++ b/trunk/3rdparty/st-srs/event.c @@ -49,10 +49,10 @@ // Global stat. #if defined(DEBUG) && defined(DEBUG_STATS) -unsigned long long _st_stat_epoll = 0; -unsigned long long _st_stat_epoll_zero = 0; -unsigned long long _st_stat_epoll_shake = 0; -unsigned long long _st_stat_epoll_spin = 0; +__thread unsigned long long _st_stat_epoll = 0; +__thread unsigned long long _st_stat_epoll_zero = 0; +__thread unsigned long long _st_stat_epoll_shake = 0; +__thread unsigned long long _st_stat_epoll_spin = 0; #endif #if !defined(MD_HAVE_KQUEUE) && !defined(MD_HAVE_EPOLL) @@ -67,7 +67,7 @@ typedef struct _kq_fd_data { int revents; } _kq_fd_data_t; -static struct _st_kqdata { +static __thread struct _st_kqdata { _kq_fd_data_t *fd_data; struct kevent *evtlist; struct kevent *addlist; @@ -99,7 +99,7 @@ typedef struct _epoll_fd_data { int revents; } _epoll_fd_data_t; -static struct _st_epolldata { +static __thread struct _st_epolldata { _epoll_fd_data_t *fd_data; struct epoll_event *evtlist; int fd_data_size; @@ -127,7 +127,7 @@ static struct _st_epolldata { #endif /* MD_HAVE_EPOLL */ -_st_eventsys_t *_st_eventsys = NULL; +__thread _st_eventsys_t *_st_eventsys = NULL; #ifdef MD_HAVE_KQUEUE diff --git a/trunk/3rdparty/st-srs/io.c b/trunk/3rdparty/st-srs/io.c index c4ec8f010d..43625dc5da 100644 --- a/trunk/3rdparty/st-srs/io.c +++ b/trunk/3rdparty/st-srs/io.c @@ -54,20 +54,20 @@ // Global stat. #if defined(DEBUG) && defined(DEBUG_STATS) -unsigned long long _st_stat_recvfrom = 0; -unsigned long long _st_stat_recvfrom_eagain = 0; -unsigned long long _st_stat_sendto = 0; -unsigned long long _st_stat_sendto_eagain = 0; -unsigned long long _st_stat_read = 0; -unsigned long long _st_stat_read_eagain = 0; -unsigned long long _st_stat_readv = 0; -unsigned long long _st_stat_readv_eagain = 0; -unsigned long long _st_stat_writev = 0; -unsigned long long _st_stat_writev_eagain = 0; -unsigned long long _st_stat_recvmsg = 0; -unsigned long long _st_stat_recvmsg_eagain = 0; -unsigned long long _st_stat_sendmsg = 0; -unsigned long long _st_stat_sendmsg_eagain = 0; +__thread unsigned long long _st_stat_recvfrom = 0; +__thread unsigned long long _st_stat_recvfrom_eagain = 0; +__thread unsigned long long _st_stat_sendto = 0; +__thread unsigned long long _st_stat_sendto_eagain = 0; +__thread unsigned long long _st_stat_read = 0; +__thread unsigned long long _st_stat_read_eagain = 0; +__thread unsigned long long _st_stat_readv = 0; +__thread unsigned long long _st_stat_readv_eagain = 0; +__thread unsigned long long _st_stat_writev = 0; +__thread unsigned long long _st_stat_writev_eagain = 0; +__thread unsigned long long _st_stat_recvmsg = 0; +__thread unsigned long long _st_stat_recvmsg_eagain = 0; +__thread unsigned long long _st_stat_sendmsg = 0; +__thread unsigned long long _st_stat_sendmsg_eagain = 0; #endif #if EAGAIN != EWOULDBLOCK @@ -79,7 +79,7 @@ unsigned long long _st_stat_sendmsg_eagain = 0; #define _LOCAL_MAXIOV 16 /* File descriptor object free list */ -static _st_netfd_t *_st_netfd_freelist = NULL; +static __thread _st_netfd_t *_st_netfd_freelist = NULL; /* Maximum number of file descriptors that the process can open */ static int _st_osfd_limit = -1; diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index 2fe9c1822d..3960e9a944 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -54,31 +54,33 @@ // Global stat. #if defined(DEBUG) && defined(DEBUG_STATS) -unsigned long long _st_stat_sched_15ms = 0; -unsigned long long _st_stat_sched_20ms = 0; -unsigned long long _st_stat_sched_25ms = 0; -unsigned long long _st_stat_sched_30ms = 0; -unsigned long long _st_stat_sched_35ms = 0; -unsigned long long _st_stat_sched_40ms = 0; -unsigned long long _st_stat_sched_80ms = 0; -unsigned long long _st_stat_sched_160ms = 0; -unsigned long long _st_stat_sched_s = 0; - -unsigned long long _st_stat_thread_run = 0; -unsigned long long _st_stat_thread_idle = 0; -unsigned long long _st_stat_thread_yield = 0; -unsigned long long _st_stat_thread_yield2 = 0; +__thread unsigned long long _st_stat_sched_15ms = 0; +__thread unsigned long long _st_stat_sched_20ms = 0; +__thread unsigned long long _st_stat_sched_25ms = 0; +__thread unsigned long long _st_stat_sched_30ms = 0; +__thread unsigned long long _st_stat_sched_35ms = 0; +__thread unsigned long long _st_stat_sched_40ms = 0; +__thread unsigned long long _st_stat_sched_80ms = 0; +__thread unsigned long long _st_stat_sched_160ms = 0; +__thread unsigned long long _st_stat_sched_s = 0; + +__thread unsigned long long _st_stat_thread_run = 0; +__thread unsigned long long _st_stat_thread_idle = 0; +__thread unsigned long long _st_stat_thread_yield = 0; +__thread unsigned long long _st_stat_thread_yield2 = 0; #endif /* Global data */ -_st_vp_t _st_this_vp; /* This VP */ -_st_thread_t *_st_this_thread; /* Current thread */ -int _st_active_count = 0; /* Active thread count */ +__thread _st_vp_t _st_this_vp; /* This VP */ +__thread _st_thread_t *_st_this_thread; /* Current thread */ +__thread int _st_active_count = 0; /* Active thread count */ -time_t _st_curr_time = 0; /* Current time as returned by time(2) */ -st_utime_t _st_last_tset; /* Last time it was fetched */ +__thread time_t _st_curr_time = 0; /* Current time as returned by time(2) */ +__thread st_utime_t _st_last_tset; /* Last time it was fetched */ +// We should initialize the thread-local variable in st_init(). +extern __thread _st_clist_t _st_free_stacks; int st_poll(struct pollfd *pds, int npds, st_utime_t timeout) { @@ -165,7 +167,7 @@ void _st_vp_schedule(void) int st_init(void) { _st_thread_t *thread; - + if (_st_active_count) { /* Already initialized */ return 0; @@ -176,7 +178,11 @@ int st_init(void) if (_st_io_init() < 0) return -1; - + + // Initialize the thread-local variables. + ST_INIT_CLIST(&_st_free_stacks); + + // Initialize ST. memset(&_st_this_vp, 0, sizeof(_st_vp_t)); ST_INIT_CLIST(&_ST_RUNQ); @@ -711,8 +717,8 @@ int _st_iterate_threads_flag = 0; void _st_iterate_threads(void) { - static _st_thread_t *thread = NULL; - static jmp_buf orig_jb, save_jb; + static __thread _st_thread_t *thread = NULL; + static __thread jmp_buf orig_jb, save_jb; _st_clist_t *q; if (!_st_iterate_threads_flag) { diff --git a/trunk/3rdparty/st-srs/stk.c b/trunk/3rdparty/st-srs/stk.c index 3e681e5954..11796c850b 100644 --- a/trunk/3rdparty/st-srs/stk.c +++ b/trunk/3rdparty/st-srs/stk.c @@ -50,9 +50,9 @@ /* How much space to leave between the stacks, at each end */ #define REDZONE _ST_PAGE_SIZE -_st_clist_t _st_free_stacks = ST_INIT_STATIC_CLIST(&_st_free_stacks); -int _st_num_free_stacks = 0; -int _st_randomize_stacks = 0; +__thread _st_clist_t _st_free_stacks; +__thread int _st_num_free_stacks = 0; +__thread int _st_randomize_stacks = 0; static char *_st_new_stk_segment(int size); diff --git a/trunk/3rdparty/st-srs/sync.c b/trunk/3rdparty/st-srs/sync.c index 907fdfac3c..f686cff686 100644 --- a/trunk/3rdparty/st-srs/sync.c +++ b/trunk/3rdparty/st-srs/sync.c @@ -45,9 +45,9 @@ #include "common.h" -extern time_t _st_curr_time; -extern st_utime_t _st_last_tset; -extern int _st_active_count; +extern __thread time_t _st_curr_time; +extern __thread st_utime_t _st_last_tset; +extern __thread int _st_active_count; static st_utime_t (*_st_utime)(void) = NULL;