diff --git a/trunk/3rdparty/st-srs/common.h b/trunk/3rdparty/st-srs/common.h index 7eef498f7..7733814d5 100644 --- a/trunk/3rdparty/st-srs/common.h +++ b/trunk/3rdparty/st-srs/common.h @@ -266,9 +266,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 4fea5986e..ae064af8b 100644 --- a/trunk/3rdparty/st-srs/event.c +++ b/trunk/3rdparty/st-srs/event.c @@ -51,10 +51,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) && !defined(MD_HAVE_SELECT) @@ -86,7 +86,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; @@ -119,7 +119,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; @@ -147,7 +147,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_SELECT diff --git a/trunk/3rdparty/st-srs/io.c b/trunk/3rdparty/st-srs/io.c index 22998b05c..08777e7fd 100644 --- a/trunk/3rdparty/st-srs/io.c +++ b/trunk/3rdparty/st-srs/io.c @@ -56,20 +56,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 @@ -81,7 +81,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 845b7f4d7..4d37e4896 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -56,31 +56,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; +__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; -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_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) { @@ -167,7 +169,7 @@ void _st_vp_schedule(void) int st_init(void) { _st_thread_t *thread; - + if (_st_active_count) { /* Already initialized */ return 0; @@ -178,7 +180,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); @@ -713,8 +719,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 a37c3e62e..a81bee019 100644 --- a/trunk/3rdparty/st-srs/stk.c +++ b/trunk/3rdparty/st-srs/stk.c @@ -52,9 +52,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 f69e22477..74138bd0f 100644 --- a/trunk/3rdparty/st-srs/sync.c +++ b/trunk/3rdparty/st-srs/sync.c @@ -47,9 +47,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; diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 828e08ea6..6a548f1b0 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-06-28, ST: Support thread-local for multiple threads. v5.0.31 * v5.0, 2022-06-17, Merge [#3010](https://github.com/ossrs/srs/pull/3010): SRT: Support Coroutine Native SRT over ST. (#3010). v5.0.30 * v5.0, 2022-06-15, For [#3058](https://github.com/ossrs/srs/pull/3058): Docker: Support x86_64, armv7 and aarch64 docker image (#3058). v5.0.29 * v5.0, 2022-04-04, Support NGINX HLS Cluster, see [CN](https://github.com/ossrs/srs/wiki/v4_CN_SampleHlsCluster) or [EN](https://github.com/ossrs/srs/wiki/v4_EN_SampleHlsCluster). v5.0.28 diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 53cb1d568..2309ed682 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 30 +#define VERSION_REVISION 31 #endif