mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
Merge branch 'develop' into merge/develop
This commit is contained in:
commit
78e5b6f1b0
31 changed files with 1119 additions and 107 deletions
2
trunk/3rdparty/st-srs/.gitignore
vendored
2
trunk/3rdparty/st-srs/.gitignore
vendored
|
@ -1,5 +1,6 @@
|
|||
DARWIN_*_DBG
|
||||
LINUX_*_DBG
|
||||
CYGWIN64_*_DBG
|
||||
obj
|
||||
st.pc
|
||||
.idea
|
||||
|
@ -10,3 +11,4 @@ googletest-*
|
|||
*.gcno
|
||||
coverage
|
||||
codecov
|
||||
*.dSYM
|
||||
|
|
30
trunk/3rdparty/st-srs/LICENSE
vendored
Normal file
30
trunk/3rdparty/st-srs/LICENSE
vendored
Normal file
|
@ -0,0 +1,30 @@
|
|||
The state-threads is provided under the terms of the MPL-1.1 or the
|
||||
GPL-2.0-or-later. For more information about these licenses, please see
|
||||
https://spdx.org/licenses/MPL-1.1.html and
|
||||
https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
|
||||
Individual files contain the following tag instead of the full license text.
|
||||
|
||||
SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later
|
||||
|
||||
All source code in the "tools", "utest" and "porting" directory is
|
||||
distributed under the MIT style license.
|
||||
|
||||
SPDX-License-Identifier: MIT
|
||||
|
||||
This enables machine processing of license information based on the SPDX
|
||||
License Identifiers that are here available: http://spdx.org/licenses/
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Note: https://github.com/ossrs/state-threads/blob/srs/README#L68
|
||||
|
||||
The State Threads library is a derivative of the Netscape Portable
|
||||
Runtime library (NSPR). All source code in this directory is
|
||||
distributed under the terms of the Mozilla Public License (MPL) version
|
||||
1.1 or the GNU General Public License (GPL) version 2 or later. For
|
||||
more information about these licenses please see
|
||||
http://www.mozilla.org/MPL/ and http://www.gnu.org/copyleft/.
|
||||
|
||||
All source code in the "examples" directory is distributed under the BSD
|
||||
style license.
|
||||
|
44
trunk/3rdparty/st-srs/Makefile
vendored
44
trunk/3rdparty/st-srs/Makefile
vendored
|
@ -58,6 +58,17 @@ ECHO = /bin/echo
|
|||
BUILD = DBG
|
||||
TARGETDIR = $(OS)_$(shell uname -r)_$(BUILD)
|
||||
|
||||
# For Cygwin, it pass a default OS env, we ignore it.
|
||||
ifeq ($(OS), Windows_NT)
|
||||
OS =
|
||||
endif
|
||||
|
||||
# For cygwin/windows, the 'uname -r' generate path with parentheses,
|
||||
# which cause the make fails, so we use 'uname -s' instead.
|
||||
ifeq ($(OS), CYGWIN64)
|
||||
TARGETDIR = $(OS)_$(shell uname -s)_$(BUILD)
|
||||
endif
|
||||
|
||||
DEFINES = -D$(OS)
|
||||
CFLAGS =
|
||||
SFLAGS =
|
||||
|
@ -73,10 +84,12 @@ DESC = st.pc
|
|||
# Possible targets:
|
||||
|
||||
TARGETS = darwin-debug darwin-optimized \
|
||||
linux-debug linux-optimized
|
||||
linux-debug linux-optimized \
|
||||
cygwin64-debug
|
||||
|
||||
UTEST_TARGETS = darwin-debug-utest linux-debug-utest \
|
||||
darwin-debug-gcov linux-debug-gcov
|
||||
darwin-debug-gcov linux-debug-gcov \
|
||||
cygwin64-debug-utest
|
||||
|
||||
#
|
||||
# Platform specifics
|
||||
|
@ -91,7 +104,7 @@ CFLAGS += -arch x86_64
|
|||
LDFLAGS += -arch x86_64
|
||||
LDFLAGS += -dynamiclib -install_name /sw/lib/libst.$(MAJOR).$(DSO_SUFFIX) -compatibility_version $(MAJOR) -current_version $(VERSION)
|
||||
OTHER_FLAGS = -Wall
|
||||
DEFINES += -DMD_HAVE_KQUEUE
|
||||
DEFINES += -DMD_HAVE_KQUEUE -DMD_HAVE_SELECT
|
||||
endif
|
||||
|
||||
ifeq ($(OS), LINUX)
|
||||
|
@ -99,7 +112,16 @@ EXTRA_OBJS = $(TARGETDIR)/md_linux.o
|
|||
SFLAGS = -fPIC
|
||||
LDFLAGS = -shared -soname=$(SONAME) -lc
|
||||
OTHER_FLAGS = -Wall
|
||||
DEFINES += -DMD_HAVE_EPOLL
|
||||
DEFINES += -DMD_HAVE_EPOLL -DMD_HAVE_SELECT
|
||||
endif
|
||||
|
||||
ifeq ($(OS), CYGWIN64)
|
||||
EXTRA_OBJS = $(TARGETDIR)/md_cygwin64.o
|
||||
SFLAGS = -fPIC
|
||||
DSO_SUFFIX = dll
|
||||
LDFLAGS = -shared -soname=$(SONAME) -lc
|
||||
OTHER_FLAGS = -Wall
|
||||
DEFINES += -DMD_HAVE_SELECT
|
||||
endif
|
||||
|
||||
#
|
||||
|
@ -159,6 +181,10 @@ endif
|
|||
#
|
||||
# make EXTRA_CFLAGS=-UMD_HAVE_EPOLL <target>
|
||||
#
|
||||
# or to enable sendmmsg(2) support:
|
||||
#
|
||||
# make EXTRA_CFLAGS="-DMD_HAVE_SENDMMSG -D_GNU_SOURCE"
|
||||
#
|
||||
# or to enable stats for ST:
|
||||
#
|
||||
# make EXTRA_CFLAGS=-DDEBUG_STATS
|
||||
|
@ -245,6 +271,9 @@ $(TARGETDIR)/md_linux.o: md_linux.S
|
|||
$(TARGETDIR)/md_darwin.o: md_darwin.S
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
$(TARGETDIR)/md_cygwin64.o: md_cygwin64.S
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
$(TARGETDIR)/%.o: %.c common.h md.h
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
|
@ -277,6 +306,9 @@ linux-debug:
|
|||
linux-optimized:
|
||||
$(MAKE) OS="LINUX" BUILD="OPT"
|
||||
|
||||
cygwin64-debug:
|
||||
$(MAKE) OS="CYGWIN64" BUILD="DBG"
|
||||
|
||||
darwin-debug-utest:
|
||||
@echo "Build utest for state-threads"
|
||||
$(MAKE) OS="DARWIN" BUILD="DBG"
|
||||
|
@ -285,6 +317,10 @@ linux-debug-utest:
|
|||
@echo "Build utest for state-threads"
|
||||
$(MAKE) OS="LINUX" BUILD="DBG"
|
||||
cd utest && $(MAKE)
|
||||
cygwin64-debug-utest:
|
||||
@echo "Build utest for state-threads"
|
||||
$(MAKE) OS="CYGWIN64" BUILD="DBG"
|
||||
cd utest && $(MAKE) UTEST_FLAGS="-std=gnu++0x" # @see https://www.codenong.com/18784112/
|
||||
|
||||
darwin-debug-gcov:
|
||||
@echo "Build utest with gcov for state-threads"
|
||||
|
|
67
trunk/3rdparty/st-srs/README.md
vendored
67
trunk/3rdparty/st-srs/README.md
vendored
|
@ -11,30 +11,45 @@ Fork from http://sourceforge.net/projects/state-threads, patched for [SRS](https
|
|||
|
||||
For original ST without any changes, checkout the [ST master branch](https://github.com/ossrs/state-threads/tree/master).
|
||||
|
||||
## LICENSE
|
||||
|
||||
[state-threads](https://github.com/ossrs/state-threads/blob/srs/README#L68) is licenced under [MPL or GPLv2](https://github.com/ossrs/srs/wiki/LicenseMixing#state-threads).
|
||||
|
||||
## Usage
|
||||
|
||||
Get code:
|
||||
|
||||
```
|
||||
git clone https://github.com/ossrs/state-threads.git &&
|
||||
cd state-threads && git checkout srs
|
||||
```bash
|
||||
git clone -b srs https://github.com/ossrs/state-threads.git
|
||||
```
|
||||
|
||||
For Linux:
|
||||
|
||||
```
|
||||
make linux-debug EXTRA_CFLAGS="-DMD_HAVE_EPOLL"
|
||||
```bash
|
||||
make linux-debug
|
||||
```
|
||||
|
||||
For OSX:
|
||||
|
||||
```bash
|
||||
make darwin-debug
|
||||
```
|
||||
make darwin-debug EXTRA_CFLAGS="-DMD_HAVE_KQUEUE"
|
||||
|
||||
For Cygwin(Windows):
|
||||
|
||||
```
|
||||
make cygwin64-debug
|
||||
```
|
||||
|
||||
For Linux aarch64, which fail with `Unknown CPU architecture`:
|
||||
|
||||
```bash
|
||||
make linux-debug EXTRA_CFLAGS="-D__aarch64__"
|
||||
```
|
||||
|
||||
Linux with valgrind:
|
||||
|
||||
```
|
||||
```bash
|
||||
make linux-debug EXTRA_CFLAGS="-DMD_VALGRIND"
|
||||
```
|
||||
|
||||
|
@ -42,13 +57,13 @@ make linux-debug EXTRA_CFLAGS="-DMD_VALGRIND"
|
|||
|
||||
Linux with valgrind and epoll:
|
||||
|
||||
```
|
||||
```bash
|
||||
make linux-debug EXTRA_CFLAGS="-DMD_HAVE_EPOLL -DMD_VALGRIND"
|
||||
```
|
||||
|
||||
For OSX, user must specifies the valgrind header files:
|
||||
|
||||
```
|
||||
```bash
|
||||
make darwin-debug EXTRA_CFLAGS="-DMD_HAVE_KQUEUE -DMD_VALGRIND -I/usr/local/include"
|
||||
```
|
||||
|
||||
|
@ -58,21 +73,24 @@ make darwin-debug EXTRA_CFLAGS="-DMD_HAVE_KQUEUE -DMD_VALGRIND -I/usr/local/incl
|
|||
|
||||
The branch [srs](https://github.com/ossrs/state-threads/tree/srs) will be patched the following patches:
|
||||
|
||||
- [x] Patch [st.arm.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/1.st.arm.patch), for ARM.
|
||||
- [x] Patch [st.osx.kqueue.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/3.st.osx.kqueue.patch), for osx.
|
||||
- [x] Patch [st.disable.examples.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/4.st.disable.examples.patch), for ubuntu.
|
||||
- [x] [Refine TAB of code](https://github.com/ossrs/state-threads/compare/c2001d30ca58f55d72a6cc6b9b6c70391eaf14db...d2101b26988b0e0db0aabc53ddf452068c1e2cbc).
|
||||
- [x] Merge from [michaeltalyansky](https://github.com/michaeltalyansky/state-threads) and [xzh3836598](https://github.com/ossrs/state-threads/commit/9a17dec8f9c2814d93761665df7c5575a4d2d8a3), support [ARM](https://github.com/ossrs/state-threads/issues/1).
|
||||
- [x] Merge from [toffaletti](https://github.com/toffaletti/state-threads), support [valgrind](https://github.com/ossrs/state-threads/issues/2) for ST.
|
||||
- [x] Patch [st.osx10.14.build.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/6.st.osx10.14.build.patch), for osx 10.14 build.
|
||||
- [x] Support macro `MD_ST_NO_ASM` to disable ASM, [#8](https://github.com/ossrs/state-threads/issues/8).
|
||||
- [x] Merge patch [srs#1282](https://github.com/ossrs/srs/issues/1282#issuecomment-445539513) to support aarch64, [#9](https://github.com/ossrs/state-threads/issues/9).
|
||||
- [x] Support OSX for Apple Darwin, macOS, [#11](https://github.com/ossrs/state-threads/issues/11).
|
||||
- [ ] Support sendmmsg for UDP, [#12](https://github.com/ossrs/state-threads/issues/12).
|
||||
- [x] Refine performance for sleep or epoll_wait(0), [#17](https://github.com/ossrs/state-threads/issues/17).
|
||||
- [ ] Improve the performance of timer. [9fe8cfe5b](https://github.com/ossrs/state-threads/commit/9fe8cfe5b1c9741a2e671a46215184f267fba400), [7879c2b](https://github.com/ossrs/state-threads/commit/7879c2b), [387cddb](https://github.com/ossrs/state-threads/commit/387cddb)
|
||||
- [x] Support utest by gtest and coverage by gcov/gocvr.
|
||||
- [ ] Support Multiple Threads for Linux and Darwin. [#19](https://github.com/ossrs/state-threads/issues/19), [srs#2188](https://github.com/ossrs/srs/issues/2188).
|
||||
- [x] ARM: Patch [st.arm.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/1.st.arm.patch), for ARM.
|
||||
- [x] OSX: Patch [st.osx.kqueue.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/3.st.osx.kqueue.patch), for osx.
|
||||
- [x] Linux: Patch [st.disable.examples.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/4.st.disable.examples.patch), for ubuntu.
|
||||
- [x] System: [Refine TAB of code](https://github.com/ossrs/state-threads/compare/c2001d30ca58f55d72a6cc6b9b6c70391eaf14db...d2101b26988b0e0db0aabc53ddf452068c1e2cbc).
|
||||
- [x] ARM: Merge from [michaeltalyansky](https://github.com/michaeltalyansky/state-threads) and [xzh3836598](https://github.com/ossrs/state-threads/commit/9a17dec8f9c2814d93761665df7c5575a4d2d8a3), support [ARM](https://github.com/ossrs/state-threads/issues/1).
|
||||
- [x] Valgrind: Merge from [toffaletti](https://github.com/toffaletti/state-threads), support [valgrind](https://github.com/ossrs/state-threads/issues/2) for ST.
|
||||
- [x] OSX: Patch [st.osx10.14.build.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/6.st.osx10.14.build.patch), for osx 10.14 build.
|
||||
- [x] ARM: Support macro `MD_ST_NO_ASM` to disable ASM, [#8](https://github.com/ossrs/state-threads/issues/8).
|
||||
- [x] AARCH64: Merge patch [srs#1282](https://github.com/ossrs/srs/issues/1282#issuecomment-445539513) to support aarch64, [#9](https://github.com/ossrs/state-threads/issues/9).
|
||||
- [x] OSX: Support OSX for Apple Darwin, macOS, [#11](https://github.com/ossrs/state-threads/issues/11).
|
||||
- [x] System: Refine performance for sleep or epoll_wait(0), [#17](https://github.com/ossrs/state-threads/issues/17).
|
||||
- [x] System: Support utest by gtest and coverage by gcov/gocvr.
|
||||
- [x] System: Only support for Linux and Darwin. [#19](https://github.com/ossrs/state-threads/issues/19), [srs#2188](https://github.com/ossrs/srs/issues/2188).
|
||||
- [x] System: Improve the performance of timer. [9fe8cfe5b](https://github.com/ossrs/state-threads/commit/9fe8cfe5b1c9741a2e671a46215184f267fba400), [7879c2b](https://github.com/ossrs/state-threads/commit/7879c2b), [387cddb](https://github.com/ossrs/state-threads/commit/387cddb)
|
||||
- [x] Windows: Support Windows 64bits. [#20](https://github.com/ossrs/state-threads/issues/20).
|
||||
- [x] MIPS: Support Linux/MIPS for OpenWRT, [#21](https://github.com/ossrs/state-threads/issues/21).
|
||||
- [ ] System: Support Multiple Threads for Linux and Darwin. [#19](https://github.com/ossrs/state-threads/issues/19), [srs#2188](https://github.com/ossrs/srs/issues/2188).
|
||||
- [ ] System: Support sendmmsg for UDP, [#12](https://github.com/ossrs/state-threads/issues/12).
|
||||
|
||||
## GDB Tools
|
||||
|
||||
|
@ -141,6 +159,7 @@ bash auto/coverage.sh
|
|||
* API reference: http://ossrs.github.io/state-threads/docs/reference.html
|
||||
* Programming notes: http://ossrs.github.io/state-threads/docs/notes.html
|
||||
|
||||
* [How to porting ST to other OS/CPU?](https://github.com/ossrs/state-threads/issues/22)
|
||||
* About setjmp and longjmp, read [setjmp](https://gitee.com/winlinvip/srs-wiki/raw/master/images/st-setjmp.jpg).
|
||||
* About the stack structure, read [stack](https://gitee.com/winlinvip/srs-wiki/raw/master/images/st-stack.jpg)
|
||||
* About asm code comments, read [#91d530e](https://github.com/ossrs/state-threads/commit/91d530e#diff-ed9428b14ff6afda0e9ab04cc91d4445R25).
|
||||
|
|
12
trunk/3rdparty/st-srs/auto/fast.sh
vendored
12
trunk/3rdparty/st-srs/auto/fast.sh
vendored
|
@ -27,4 +27,14 @@ echo "Coverage report at coverage/st.html" &&
|
|||
open coverage/st.html
|
||||
|
||||
popd
|
||||
echo "UTest done, restore $(pwd)"
|
||||
echo "UTest done, restore $(pwd)"
|
||||
|
||||
cat << END > /dev/stdout
|
||||
|
||||
# CLI For DARWIN
|
||||
cd $PWD && rm -f ./obj/*.gcda &&
|
||||
make darwin-debug-gcov && ./obj/st_utest &&
|
||||
mkdir -p coverage && gcovr -r . -e LINUX -e DARWIN -e examples --html --html-details -o coverage/st.html &&
|
||||
open coverage/st.html
|
||||
|
||||
END
|
4
trunk/3rdparty/st-srs/common.h
vendored
4
trunk/3rdparty/st-srs/common.h
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
|
344
trunk/3rdparty/st-srs/event.c
vendored
344
trunk/3rdparty/st-srs/event.c
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
@ -55,8 +57,25 @@ unsigned long long _st_stat_epoll_shake = 0;
|
|||
unsigned long long _st_stat_epoll_spin = 0;
|
||||
#endif
|
||||
|
||||
#if !defined(MD_HAVE_KQUEUE) && !defined(MD_HAVE_EPOLL)
|
||||
#error Only support epoll(for Linux) or kqueue(for Darwin)
|
||||
#if !defined(MD_HAVE_KQUEUE) && !defined(MD_HAVE_EPOLL) && !defined(MD_HAVE_SELECT)
|
||||
#error Only support epoll(for Linux), kqueue(for Darwin) or select(for Cygwin)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef MD_HAVE_SELECT
|
||||
static struct _st_seldata {
|
||||
fd_set fd_read_set, fd_write_set, fd_exception_set;
|
||||
int fd_ref_cnts[FD_SETSIZE][3];
|
||||
int maxfd;
|
||||
} *_st_select_data;
|
||||
|
||||
#define _ST_SELECT_MAX_OSFD (_st_select_data->maxfd)
|
||||
#define _ST_SELECT_READ_SET (_st_select_data->fd_read_set)
|
||||
#define _ST_SELECT_WRITE_SET (_st_select_data->fd_write_set)
|
||||
#define _ST_SELECT_EXCEP_SET (_st_select_data->fd_exception_set)
|
||||
#define _ST_SELECT_READ_CNT(fd) (_st_select_data->fd_ref_cnts[fd][0])
|
||||
#define _ST_SELECT_WRITE_CNT(fd) (_st_select_data->fd_ref_cnts[fd][1])
|
||||
#define _ST_SELECT_EXCEP_CNT(fd) (_st_select_data->fd_ref_cnts[fd][2])
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -130,6 +149,300 @@ static struct _st_epolldata {
|
|||
_st_eventsys_t *_st_eventsys = NULL;
|
||||
|
||||
|
||||
#ifdef MD_HAVE_SELECT
|
||||
/*****************************************
|
||||
* select event system
|
||||
*/
|
||||
|
||||
ST_HIDDEN int _st_select_init(void)
|
||||
{
|
||||
_st_select_data = (struct _st_seldata *) malloc(sizeof(*_st_select_data));
|
||||
if (!_st_select_data)
|
||||
return -1;
|
||||
|
||||
memset(_st_select_data, 0, sizeof(*_st_select_data));
|
||||
_st_select_data->maxfd = -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ST_HIDDEN int _st_select_pollset_add(struct pollfd *pds, int npds)
|
||||
{
|
||||
struct pollfd *pd;
|
||||
struct pollfd *epd = pds + npds;
|
||||
|
||||
/* Do checks up front */
|
||||
for (pd = pds; pd < epd; pd++) {
|
||||
if (pd->fd < 0 || pd->fd >= FD_SETSIZE || !pd->events ||
|
||||
(pd->events & ~(POLLIN | POLLOUT | POLLPRI))) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
for (pd = pds; pd < epd; pd++) {
|
||||
if (pd->events & POLLIN) {
|
||||
FD_SET(pd->fd, &_ST_SELECT_READ_SET);
|
||||
_ST_SELECT_READ_CNT(pd->fd)++;
|
||||
}
|
||||
if (pd->events & POLLOUT) {
|
||||
FD_SET(pd->fd, &_ST_SELECT_WRITE_SET);
|
||||
_ST_SELECT_WRITE_CNT(pd->fd)++;
|
||||
}
|
||||
if (pd->events & POLLPRI) {
|
||||
FD_SET(pd->fd, &_ST_SELECT_EXCEP_SET);
|
||||
_ST_SELECT_EXCEP_CNT(pd->fd)++;
|
||||
}
|
||||
if (_ST_SELECT_MAX_OSFD < pd->fd)
|
||||
_ST_SELECT_MAX_OSFD = pd->fd;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ST_HIDDEN void _st_select_pollset_del(struct pollfd *pds, int npds)
|
||||
{
|
||||
struct pollfd *pd;
|
||||
struct pollfd *epd = pds + npds;
|
||||
|
||||
for (pd = pds; pd < epd; pd++) {
|
||||
if (pd->events & POLLIN) {
|
||||
if (--_ST_SELECT_READ_CNT(pd->fd) == 0)
|
||||
FD_CLR(pd->fd, &_ST_SELECT_READ_SET);
|
||||
}
|
||||
if (pd->events & POLLOUT) {
|
||||
if (--_ST_SELECT_WRITE_CNT(pd->fd) == 0)
|
||||
FD_CLR(pd->fd, &_ST_SELECT_WRITE_SET);
|
||||
}
|
||||
if (pd->events & POLLPRI) {
|
||||
if (--_ST_SELECT_EXCEP_CNT(pd->fd) == 0)
|
||||
FD_CLR(pd->fd, &_ST_SELECT_EXCEP_SET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ST_HIDDEN void _st_select_find_bad_fd(void)
|
||||
{
|
||||
_st_clist_t *q;
|
||||
_st_pollq_t *pq;
|
||||
int notify;
|
||||
struct pollfd *pds, *epds;
|
||||
int pq_max_osfd, osfd;
|
||||
short events;
|
||||
|
||||
_ST_SELECT_MAX_OSFD = -1;
|
||||
|
||||
for (q = _ST_IOQ.next; q != &_ST_IOQ; q = q->next) {
|
||||
pq = _ST_POLLQUEUE_PTR(q);
|
||||
notify = 0;
|
||||
epds = pq->pds + pq->npds;
|
||||
pq_max_osfd = -1;
|
||||
|
||||
for (pds = pq->pds; pds < epds; pds++) {
|
||||
osfd = pds->fd;
|
||||
pds->revents = 0;
|
||||
if (pds->events == 0)
|
||||
continue;
|
||||
if (fcntl(osfd, F_GETFL, 0) < 0) {
|
||||
pds->revents = POLLNVAL;
|
||||
notify = 1;
|
||||
}
|
||||
if (osfd > pq_max_osfd) {
|
||||
pq_max_osfd = osfd;
|
||||
}
|
||||
}
|
||||
|
||||
if (notify) {
|
||||
ST_REMOVE_LINK(&pq->links);
|
||||
pq->on_ioq = 0;
|
||||
/*
|
||||
* Decrement the count of descriptors for each descriptor/event
|
||||
* because this I/O request is being removed from the ioq
|
||||
*/
|
||||
for (pds = pq->pds; pds < epds; pds++) {
|
||||
osfd = pds->fd;
|
||||
events = pds->events;
|
||||
if (events & POLLIN) {
|
||||
if (--_ST_SELECT_READ_CNT(osfd) == 0) {
|
||||
FD_CLR(osfd, &_ST_SELECT_READ_SET);
|
||||
}
|
||||
}
|
||||
if (events & POLLOUT) {
|
||||
if (--_ST_SELECT_WRITE_CNT(osfd) == 0) {
|
||||
FD_CLR(osfd, &_ST_SELECT_WRITE_SET);
|
||||
}
|
||||
}
|
||||
if (events & POLLPRI) {
|
||||
if (--_ST_SELECT_EXCEP_CNT(osfd) == 0) {
|
||||
FD_CLR(osfd, &_ST_SELECT_EXCEP_SET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pq->thread->flags & _ST_FL_ON_SLEEPQ)
|
||||
_ST_DEL_SLEEPQ(pq->thread);
|
||||
pq->thread->state = _ST_ST_RUNNABLE;
|
||||
_ST_ADD_RUNQ(pq->thread);
|
||||
} else {
|
||||
if (_ST_SELECT_MAX_OSFD < pq_max_osfd)
|
||||
_ST_SELECT_MAX_OSFD = pq_max_osfd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ST_HIDDEN void _st_select_dispatch(void)
|
||||
{
|
||||
struct timeval timeout, *tvp;
|
||||
fd_set r, w, e;
|
||||
fd_set *rp, *wp, *ep;
|
||||
int nfd, pq_max_osfd, osfd;
|
||||
_st_clist_t *q;
|
||||
st_utime_t min_timeout;
|
||||
_st_pollq_t *pq;
|
||||
int notify;
|
||||
struct pollfd *pds, *epds;
|
||||
short events, revents;
|
||||
|
||||
/*
|
||||
* Assignment of fd_sets
|
||||
*/
|
||||
r = _ST_SELECT_READ_SET;
|
||||
w = _ST_SELECT_WRITE_SET;
|
||||
e = _ST_SELECT_EXCEP_SET;
|
||||
|
||||
rp = &r;
|
||||
wp = &w;
|
||||
ep = &e;
|
||||
|
||||
if (_ST_SLEEPQ == NULL) {
|
||||
tvp = NULL;
|
||||
} else {
|
||||
min_timeout = (_ST_SLEEPQ->due <= _ST_LAST_CLOCK) ? 0 :
|
||||
(_ST_SLEEPQ->due - _ST_LAST_CLOCK);
|
||||
timeout.tv_sec = (int) (min_timeout / 1000000);
|
||||
timeout.tv_usec = (int) (min_timeout % 1000000);
|
||||
tvp = &timeout;
|
||||
}
|
||||
|
||||
/* Check for I/O operations */
|
||||
nfd = select(_ST_SELECT_MAX_OSFD + 1, rp, wp, ep, tvp);
|
||||
|
||||
/* Notify threads that are associated with the selected descriptors */
|
||||
if (nfd > 0) {
|
||||
_ST_SELECT_MAX_OSFD = -1;
|
||||
for (q = _ST_IOQ.next; q != &_ST_IOQ; q = q->next) {
|
||||
pq = _ST_POLLQUEUE_PTR(q);
|
||||
notify = 0;
|
||||
epds = pq->pds + pq->npds;
|
||||
pq_max_osfd = -1;
|
||||
|
||||
for (pds = pq->pds; pds < epds; pds++) {
|
||||
osfd = pds->fd;
|
||||
events = pds->events;
|
||||
revents = 0;
|
||||
if ((events & POLLIN) && FD_ISSET(osfd, rp)) {
|
||||
revents |= POLLIN;
|
||||
}
|
||||
if ((events & POLLOUT) && FD_ISSET(osfd, wp)) {
|
||||
revents |= POLLOUT;
|
||||
}
|
||||
if ((events & POLLPRI) && FD_ISSET(osfd, ep)) {
|
||||
revents |= POLLPRI;
|
||||
}
|
||||
pds->revents = revents;
|
||||
if (revents) {
|
||||
notify = 1;
|
||||
}
|
||||
if (osfd > pq_max_osfd) {
|
||||
pq_max_osfd = osfd;
|
||||
}
|
||||
}
|
||||
if (notify) {
|
||||
ST_REMOVE_LINK(&pq->links);
|
||||
pq->on_ioq = 0;
|
||||
/*
|
||||
* Decrement the count of descriptors for each descriptor/event
|
||||
* because this I/O request is being removed from the ioq
|
||||
*/
|
||||
for (pds = pq->pds; pds < epds; pds++) {
|
||||
osfd = pds->fd;
|
||||
events = pds->events;
|
||||
if (events & POLLIN) {
|
||||
if (--_ST_SELECT_READ_CNT(osfd) == 0) {
|
||||
FD_CLR(osfd, &_ST_SELECT_READ_SET);
|
||||
}
|
||||
}
|
||||
if (events & POLLOUT) {
|
||||
if (--_ST_SELECT_WRITE_CNT(osfd) == 0) {
|
||||
FD_CLR(osfd, &_ST_SELECT_WRITE_SET);
|
||||
}
|
||||
}
|
||||
if (events & POLLPRI) {
|
||||
if (--_ST_SELECT_EXCEP_CNT(osfd) == 0) {
|
||||
FD_CLR(osfd, &_ST_SELECT_EXCEP_SET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pq->thread->flags & _ST_FL_ON_SLEEPQ)
|
||||
_ST_DEL_SLEEPQ(pq->thread);
|
||||
pq->thread->state = _ST_ST_RUNNABLE;
|
||||
_ST_ADD_RUNQ(pq->thread);
|
||||
} else {
|
||||
if (_ST_SELECT_MAX_OSFD < pq_max_osfd)
|
||||
_ST_SELECT_MAX_OSFD = pq_max_osfd;
|
||||
}
|
||||
}
|
||||
} else if (nfd < 0) {
|
||||
/*
|
||||
* It can happen when a thread closes file descriptor
|
||||
* that is being used by some other thread -- BAD!
|
||||
*/
|
||||
if (errno == EBADF)
|
||||
_st_select_find_bad_fd();
|
||||
}
|
||||
}
|
||||
|
||||
ST_HIDDEN int _st_select_fd_new(int osfd)
|
||||
{
|
||||
if (osfd >= FD_SETSIZE) {
|
||||
errno = EMFILE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ST_HIDDEN int _st_select_fd_close(int osfd)
|
||||
{
|
||||
if (_ST_SELECT_READ_CNT(osfd) || _ST_SELECT_WRITE_CNT(osfd) ||
|
||||
_ST_SELECT_EXCEP_CNT(osfd)) {
|
||||
errno = EBUSY;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ST_HIDDEN int _st_select_fd_getlimit(void)
|
||||
{
|
||||
return FD_SETSIZE;
|
||||
}
|
||||
|
||||
static _st_eventsys_t _st_select_eventsys = {
|
||||
"select",
|
||||
ST_EVENTSYS_SELECT,
|
||||
_st_select_init,
|
||||
_st_select_dispatch,
|
||||
_st_select_pollset_add,
|
||||
_st_select_pollset_del,
|
||||
_st_select_fd_new,
|
||||
_st_select_fd_close,
|
||||
_st_select_fd_getlimit
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef MD_HAVE_KQUEUE
|
||||
/*****************************************
|
||||
* kqueue event system
|
||||
|
@ -885,20 +1198,27 @@ int st_set_eventsys(int eventsys)
|
|||
return -1;
|
||||
}
|
||||
|
||||
#if defined (MD_HAVE_KQUEUE)
|
||||
_st_eventsys = &_st_kq_eventsys;
|
||||
return 0;
|
||||
#elif defined (MD_HAVE_EPOLL)
|
||||
if (_st_epoll_is_supported()) {
|
||||
_st_eventsys = &_st_epoll_eventsys;
|
||||
if (eventsys == ST_EVENTSYS_SELECT || eventsys == ST_EVENTSYS_DEFAULT) {
|
||||
#if defined (MD_HAVE_SELECT)
|
||||
_st_eventsys = &_st_select_eventsys;
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (eventsys == ST_EVENTSYS_ALT) {
|
||||
#if defined (MD_HAVE_KQUEUE)
|
||||
_st_eventsys = &_st_kq_eventsys;
|
||||
return 0;
|
||||
#elif defined (MD_HAVE_EPOLL)
|
||||
if (_st_epoll_is_supported()) {
|
||||
_st_eventsys = &_st_epoll_eventsys;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
#else
|
||||
#error Only support epoll(for Linux) or kqueue(for Darwin)
|
||||
#endif
|
||||
}
|
||||
|
||||
int st_get_eventsys(void)
|
||||
|
|
4
trunk/3rdparty/st-srs/io.c
vendored
4
trunk/3rdparty/st-srs/io.c
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
|
4
trunk/3rdparty/st-srs/key.c
vendored
4
trunk/3rdparty/st-srs/key.c
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
|
57
trunk/3rdparty/st-srs/md.h
vendored
57
trunk/3rdparty/st-srs/md.h
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
@ -67,7 +69,7 @@
|
|||
#define MD_USE_BUILTIN_SETJMP
|
||||
|
||||
#if defined(__amd64__) || defined(__x86_64__)
|
||||
#define JB_SP 12
|
||||
#define JB_SP 12 /* The jmpbuf is int(4B) array, while MD_GET_SP covert to long(8B) pointer, so the JB_SP should be 12 which is 6*sizeof(long)/sizeof(int) */
|
||||
#define MD_GET_SP(_t) *((long *)&((_t)->context[JB_SP]))
|
||||
#else
|
||||
#error Unknown CPU architecture
|
||||
|
@ -115,15 +117,7 @@
|
|||
(void) gettimeofday(&tv, NULL); \
|
||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||
|
||||
#if defined(__mips__)
|
||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||
ST_BEGIN_MACRO \
|
||||
MD_SETJMP((_thread)->context); \
|
||||
_thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \
|
||||
_thread->context[0].__jmpbuf[0].__sp = _sp; \
|
||||
ST_END_MACRO
|
||||
|
||||
#else /* Not mips */
|
||||
#if 1
|
||||
|
||||
/*
|
||||
* On linux, there are a few styles of jmpbuf format. These vary based
|
||||
|
@ -188,6 +182,11 @@
|
|||
#error "ARM/Linux pre-glibc2 not supported yet"
|
||||
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
|
||||
|
||||
#elif defined(__mips__)
|
||||
/* https://github.com/ossrs/state-threads/issues/21 */
|
||||
#define MD_USE_BUILTIN_SETJMP
|
||||
#define MD_GET_SP(_t) *((long *)&((_t)->context[0].__jb[0]))
|
||||
|
||||
#else
|
||||
#error "Unknown CPU architecture"
|
||||
#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
|
||||
|
@ -212,6 +211,42 @@
|
|||
#define MD_LONGJMP(env, val) longjmp(env, val)
|
||||
#endif
|
||||
|
||||
#elif defined (CYGWIN64)
|
||||
|
||||
// For CYGWIN64, build SRS on Windows.
|
||||
#define MD_USE_BSD_ANON_MMAP
|
||||
#define MD_ACCEPT_NB_INHERITED
|
||||
#define MD_HAVE_SOCKLEN_T
|
||||
|
||||
#define MD_USE_BUILTIN_SETJMP
|
||||
|
||||
#if defined(__amd64__) || defined(__x86_64__)
|
||||
#define JB_SP 6 // The context is long(32) array, @see https://github.com/ossrs/state-threads/issues/20#issuecomment-887569093
|
||||
#define MD_GET_SP(_t) *((long *)&((_t)->context[JB_SP]))
|
||||
#else
|
||||
#error Unknown CPU architecture
|
||||
#endif
|
||||
|
||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||
ST_BEGIN_MACRO \
|
||||
if (MD_SETJMP((_thread)->context)) \
|
||||
_main(); \
|
||||
MD_GET_SP(_thread) = (long) (_sp); \
|
||||
ST_END_MACRO
|
||||
|
||||
#if defined(MD_USE_BUILTIN_SETJMP)
|
||||
#define MD_SETJMP(env) _st_md_cxt_save(env)
|
||||
#define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
|
||||
|
||||
extern int _st_md_cxt_save(jmp_buf env);
|
||||
extern void _st_md_cxt_restore(jmp_buf env, int val);
|
||||
#endif
|
||||
|
||||
#define MD_GET_UTIME() \
|
||||
struct timeval tv; \
|
||||
(void) gettimeofday(&tv, NULL); \
|
||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||
|
||||
#else
|
||||
#error Unknown OS
|
||||
#endif /* OS */
|
||||
|
|
77
trunk/3rdparty/st-srs/md_cygwin64.S
vendored
Normal file
77
trunk/3rdparty/st-srs/md_cygwin64.S
vendored
Normal file
|
@ -0,0 +1,77 @@
|
|||
|
||||
/* If user disable the ASM, such as avoiding bugs in ASM, donot compile it. */
|
||||
#if !defined(MD_ST_NO_ASM)
|
||||
|
||||
#if defined(__amd64__) || defined(__x86_64__)
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
/*
|
||||
* Internal __jmp_buf layout
|
||||
*/
|
||||
#define JB_RBX 0
|
||||
#define JB_RBP 1
|
||||
#define JB_R12 2 /* R12:R15 Nonvolatile Must be preserved by callee */
|
||||
#define JB_R13 3 /* @see https://docs.microsoft.com/en-us/cpp/build/x64-software-conventions?view=msvc-160#register-usage */
|
||||
#define JB_R14 4 /* RBX, RBP, RDI, RSI, R12, R14, R14, and R15 must be saved in any function using them. */
|
||||
#define JB_R15 5 /* @see https://software.intel.com/content/www/us/en/develop/articles/introduction-to-x64-assembly.html */
|
||||
#define JB_RSP 6
|
||||
#define JB_PC 7
|
||||
|
||||
.file "md_cygwin64.S"
|
||||
.text
|
||||
|
||||
/* _st_md_cxt_save(__jmp_buf env) */ /* The env is rcx, https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160 */
|
||||
.globl _st_md_cxt_save
|
||||
.align 16
|
||||
_st_md_cxt_save:
|
||||
/*
|
||||
* Save registers.
|
||||
*/
|
||||
movq %rbx, (JB_RBX*8)(%rcx) /* Save rbx to env[0], *(int64_t*)(rcx+0)=rbx */
|
||||
movq %rbp, (JB_RBP*8)(%rcx) /* Save rbp to env[1], *(int64_t*)(rcx+1)=rbp */
|
||||
movq %r12, (JB_R12*8)(%rcx) /* Save r12 to env[2], *(int64_t*)(rcx+2)=r12 */
|
||||
movq %r13, (JB_R13*8)(%rcx) /* Save r13 to env[3], *(int64_t*)(rcx+3)=r13 */
|
||||
movq %r14, (JB_R14*8)(%rcx) /* Save r14 to env[4], *(int64_t*)(rcx+4)=r14 */
|
||||
movq %r15, (JB_R15*8)(%rcx) /* Save r15 to env[5], *(int64_t*)(rcx+5)=r15 */
|
||||
/* Save SP */
|
||||
leaq 8(%rsp), %r8 /* Save *(int64_t*)(rsp+8) to r8, https://github.com/ossrs/state-threads/issues/20#issuecomment-887569093 */
|
||||
movq %r8, (JB_RSP*8)(%rcx) /* Save r8(rsp) to env[6], *(int64_t*)(rcx+6)=r8 */
|
||||
/* Save PC we are returning to */
|
||||
movq (%rsp), %r9 /* Save PC(parent function address) %(rsp) to r9, https://github.com/ossrs/state-threads/issues/20#issuecomment-887569093 */
|
||||
movq %r9, (JB_PC*8)(%rcx) /* Save r9(PC) to env[7], *(int64_t*)(rcx+7)=r9 */
|
||||
xorq %rax, %rax /* Reset rax(return value) to 0 */
|
||||
ret
|
||||
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
/* _st_md_cxt_restore(__jmp_buf env, int val) */ /* The env is rcx, val is edx/rdx, https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160 */
|
||||
.globl _st_md_cxt_restore
|
||||
.align 16
|
||||
_st_md_cxt_restore:
|
||||
/*
|
||||
* Restore registers.
|
||||
*/
|
||||
movq (JB_RBX*8)(%rcx), %rbx /* Load rbx from env[0] */
|
||||
movq (JB_RBP*8)(%rcx), %rbp /* Load rbp from env[1] */
|
||||
movq (JB_R12*8)(%rcx), %r12 /* Load r12 from env[2] */
|
||||
movq (JB_R13*8)(%rcx), %r13 /* Load r13 from env[3] */
|
||||
movq (JB_R14*8)(%rcx), %r14 /* Load r14 from env[4] */
|
||||
movq (JB_R15*8)(%rcx), %r15 /* Load r15 from env[5] */
|
||||
/* Set return value */ /* The edx is param1 val, the eax is return value */
|
||||
test %edx, %edx /* if (!val) { */
|
||||
mov $01, %eax /* val=1; */
|
||||
cmove %eax, %edx /* } */
|
||||
mov %edx, %eax /* return val; */
|
||||
/* Restore PC and RSP */
|
||||
movq (JB_PC*8)(%rcx), %r8 /* Load r8(PC) from env[7], https://github.com/ossrs/state-threads/issues/20#issuecomment-887569093 */
|
||||
movq (JB_RSP*8)(%rcx), %rsp /* Load rsp from env[6] */
|
||||
/* Jump to saved PC */
|
||||
jmpq *%r8 /* Jump to r8(PC) */
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
2
trunk/3rdparty/st-srs/md_darwin.S
vendored
2
trunk/3rdparty/st-srs/md_darwin.S
vendored
|
@ -1,3 +1,5 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright (c) 2021 Winlin */
|
||||
|
||||
/* If user disable the ASM, such as avoiding bugs in ASM, donot compile it. */
|
||||
#if !defined(MD_ST_NO_ASM)
|
||||
|
|
81
trunk/3rdparty/st-srs/md_linux.S
vendored
81
trunk/3rdparty/st-srs/md_linux.S
vendored
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/* If user disable the ASM, such as avoiding bugs in ASM, donot compile it. */
|
||||
#if !defined(MD_ST_NO_ASM)
|
||||
|
@ -347,6 +348,86 @@
|
|||
|
||||
/****************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#elif defined(__mips__)
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
/*
|
||||
* Internal __jmp_buf layout
|
||||
*/
|
||||
#define JB_SP 0 /* Stack pointer */
|
||||
#define JB_RA 11 /* Return address */
|
||||
#define JB_GP 1 /* Global pointer */
|
||||
#define JB_S0 3 /* S0-S7, Saved temporaries */
|
||||
#define JB_S1 4 /* S0-S7, Saved temporaries */
|
||||
#define JB_S2 5 /* S0-S7, Saved temporaries */
|
||||
#define JB_S3 6 /* S0-S7, Saved temporaries */
|
||||
#define JB_S4 7 /* S0-S7, Saved temporaries */
|
||||
#define JB_S5 8 /* S0-S7, Saved temporaries */
|
||||
#define JB_S6 9 /* S0-S7, Saved temporaries */
|
||||
#define JB_S7 10 /* S0-S7, Saved temporaries */
|
||||
#define JB_FP 2 /* FP/S8 Frame pointer */
|
||||
|
||||
.file "md_linux.S"
|
||||
.text
|
||||
|
||||
/* _st_md_cxt_save(__jmp_buf env) */ /* The env is $a0, https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions */
|
||||
.globl _st_md_cxt_save
|
||||
.type _st_md_cxt_save, %function
|
||||
.align 2
|
||||
_st_md_cxt_save:
|
||||
sw $sp, 0($a0) /* Save sp to env[0], *(long*)($a0+0) =sp */
|
||||
sw $ra, 4($a0) /* Save ra to env[1], *(long*)($a0+4)=ra, the return address, https://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html */
|
||||
sw $gp, 8($a0) /* Save gp to env[2], *(long*)($a0+8) =gp */
|
||||
sw $s0, 12($a0) /* Save s0 to env[3], *(long*)($a0+12)=s0 */
|
||||
sw $s1, 16($a0) /* Save s1 to env[4], *(long*)($a0+16)=s1 */
|
||||
sw $s2, 20($a0) /* Save s2 to env[5], *(long*)($a0+20)=s2 */
|
||||
sw $s3, 24($a0) /* Save s3 to env[6], *(long*)($a0+24)=s3 */
|
||||
sw $s4, 28($a0) /* Save s4 to env[7], *(long*)($a0+28)=s4 */
|
||||
sw $s5, 32($a0) /* Save s5 to env[8], *(long*)($a0+32)=s5 */
|
||||
sw $s6, 36($a0) /* Save s6 to env[9], *(long*)($a0+36)=s6 */
|
||||
sw $s7, 40($a0) /* Save s7 to env[10], *(long*)($a0+40)=s7 */
|
||||
sw $fp, 44($a0) /* Save fp to env[11], *(long*)($a0+44) =fp */
|
||||
li $v0, 0 /* Set return value to 0 */
|
||||
jr $ra /* Return */
|
||||
|
||||
.size _st_md_cxt_save, .-_st_md_cxt_save
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
/* _st_md_cxt_restore(__jmp_buf env, int val) */
|
||||
.globl _st_md_cxt_restore
|
||||
.type _st_md_cxt_restore, %function
|
||||
.align 2
|
||||
_st_md_cxt_restore:
|
||||
lw $sp, 0($a0) /* Load sp from env[0], sp=*(long*)($a0+0) */
|
||||
lw $ra, 4($a0) /* Load sp from env[1], ra=*(long*)($a0+4), the saved return address */
|
||||
lw $gp, 8($a0) /* Load sp from env[2], gp=*(long*)($a0+8) */
|
||||
lw $s0, 12($a0) /* Load sp from env[3], s0=*(long*)($a0+12) */
|
||||
lw $s1, 16($a0) /* Load sp from env[4], s1=*(long*)($a0+16) */
|
||||
lw $s2, 20($a0) /* Load sp from env[5], s2=*(long*)($a0+20) */
|
||||
lw $s3, 24($a0) /* Load sp from env[6], s3=*(long*)($a0+24) */
|
||||
lw $s4, 28($a0) /* Load sp from env[7], s4=*(long*)($a0+28) */
|
||||
lw $s5, 32($a0) /* Load sp from env[8], s5=*(long*)($a0+32) */
|
||||
lw $s6, 36($a0) /* Load sp from env[9], s6=*(long*)($a0+36) */
|
||||
lw $s7, 40($a0) /* Load sp from env[10], s7=*(long*)($a0+40) */
|
||||
lw $fp, 44($a0) /* Load sp from env[2], fp=*(long*)($a0+44) */
|
||||
li $v0, 1 /* Set return value to 1 */
|
||||
jr $ra /* Return to the saved return address */
|
||||
|
||||
.size _st_md_cxt_restore, .-_st_md_cxt_restore
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
5
trunk/3rdparty/st-srs/public.h
vendored
5
trunk/3rdparty/st-srs/public.h
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
@ -65,6 +67,7 @@
|
|||
#endif
|
||||
|
||||
#define ST_EVENTSYS_DEFAULT 0
|
||||
#define ST_EVENTSYS_SELECT 1
|
||||
#define ST_EVENTSYS_ALT 3
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
4
trunk/3rdparty/st-srs/sched.c
vendored
4
trunk/3rdparty/st-srs/sched.c
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
|
4
trunk/3rdparty/st-srs/stk.c
vendored
4
trunk/3rdparty/st-srs/stk.c
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
|
4
trunk/3rdparty/st-srs/sync.c
vendored
4
trunk/3rdparty/st-srs/sync.c
vendored
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
/* SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later */
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
|
|
1
trunk/3rdparty/st-srs/tools/helloworld/.gitignore
vendored
Normal file
1
trunk/3rdparty/st-srs/tools/helloworld/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
helloworld
|
11
trunk/3rdparty/st-srs/tools/helloworld/Makefile
vendored
Normal file
11
trunk/3rdparty/st-srs/tools/helloworld/Makefile
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
.PHONY: clean
|
||||
|
||||
LDLIBS=../../obj/libst.a
|
||||
CFLAGS=-g -O0 -I../../obj
|
||||
|
||||
./helloworld: helloworld.c $(LDLIBS)
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -o helloworld helloworld.c $(LDLIBS)
|
||||
|
||||
clean:
|
||||
rm -f helloworld
|
||||
|
19
trunk/3rdparty/st-srs/tools/helloworld/helloworld.c
vendored
Normal file
19
trunk/3rdparty/st-srs/tools/helloworld/helloworld.c
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright (c) 2021 Winlin */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <st.h>
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
st_init();
|
||||
|
||||
for (int i = 0; i < 10000; i++) {
|
||||
printf("#%03d, Hello, state-threads world!\n", i);
|
||||
st_sleep(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
1
trunk/3rdparty/st-srs/tools/porting/.gitignore
vendored
Normal file
1
trunk/3rdparty/st-srs/tools/porting/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
porting
|
10
trunk/3rdparty/st-srs/tools/porting/Makefile
vendored
Normal file
10
trunk/3rdparty/st-srs/tools/porting/Makefile
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
.PHONY: clean
|
||||
|
||||
CFLAGS=-g -O0
|
||||
|
||||
./porting: porting.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -o $@ $^ $(LDLIBS)
|
||||
|
||||
clean:
|
||||
rm -f porting
|
||||
|
157
trunk/3rdparty/st-srs/tools/porting/porting.c
vendored
Normal file
157
trunk/3rdparty/st-srs/tools/porting/porting.c
vendored
Normal file
|
@ -0,0 +1,157 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright (c) 2021 Winlin */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
int foo_return_zero();
|
||||
int foo_return_one();
|
||||
extern void print_buf(unsigned char* p, int nn_jb);
|
||||
extern void print_jmpbuf();
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
printf("OS specs:\n");
|
||||
#ifdef __linux__
|
||||
printf("__linux__: %d\n", __linux__);
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
printf("__APPLE__: %d\n", __APPLE__);
|
||||
#endif
|
||||
|
||||
printf("\nCPU specs:\n");
|
||||
#ifdef __mips__
|
||||
// https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00565-2B-MIPS32-QRC-01.01.pdf
|
||||
printf("__mips__: %d, __mips:%d, _MIPSEL:%d\n", __mips__, __mips, _MIPSEL);
|
||||
#endif
|
||||
#ifdef __x86_64__
|
||||
printf("__x86_64__: %d\n", __x86_64__);
|
||||
#endif
|
||||
|
||||
printf("\nCompiler specs:\n");
|
||||
#ifdef __GLIBC__
|
||||
printf("__GLIBC__: %d\n", __GLIBC__);
|
||||
#endif
|
||||
printf("sizeof(long)=%d\n", (int)sizeof(long));
|
||||
printf("sizeof(long long int)=%d\n", (int)sizeof(long long int));
|
||||
printf("sizeof(void*)=%d\n", (int)sizeof(void*));
|
||||
#ifdef __ptr_t
|
||||
printf("sizeof(__ptr_t)=%d\n", sizeof(__ptr_t));
|
||||
#endif
|
||||
|
||||
printf("\nReturn value:\n");
|
||||
int r0 = foo_return_zero();
|
||||
int r1 = foo_return_one();
|
||||
printf("foo_return_zero=%d, foo_return_one=%d\n", r0, r1);
|
||||
|
||||
printf("\nCalling conventions:\n");
|
||||
print_jmpbuf();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int foo_return_zero()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int foo_return_one()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
#ifdef __mips__
|
||||
void print_jmpbuf()
|
||||
{
|
||||
// https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions
|
||||
register void* ra asm("ra");
|
||||
register void* gp asm("gp");
|
||||
register void* sp asm("sp");
|
||||
register void* fp asm("fp");
|
||||
// $s0–$s7 $16–$23 saved temporaries
|
||||
register void* s0 asm("s0");
|
||||
register void* s1 asm("s1");
|
||||
register void* s2 asm("s2");
|
||||
register void* s3 asm("s3");
|
||||
register void* s4 asm("s4");
|
||||
register void* s5 asm("s5");
|
||||
register void* s6 asm("s6");
|
||||
register void* s7 asm("s7");
|
||||
|
||||
/*
|
||||
typedef unsigned long long __jmp_buf[13];
|
||||
typedef struct __jmp_buf_tag {
|
||||
__jmp_buf __jb;
|
||||
unsigned long __fl;
|
||||
unsigned long __ss[128/sizeof(long)];
|
||||
} jmp_buf[1];
|
||||
*/
|
||||
jmp_buf ctx = {0};
|
||||
int r0 = setjmp(ctx);
|
||||
if (!r0) {
|
||||
longjmp(ctx, 1);
|
||||
}
|
||||
|
||||
printf("ra=%p, sp=%p, s0=%p, s1=%p, s2=%p, s3=%p, s4=%p, s5=%p, s6=%p, s7=%p, fp=%p, gp=%p\n",
|
||||
ra, sp, s0, s1, s2, s3, s4, s5, s6, s7, fp, gp);
|
||||
|
||||
int nn_jb = sizeof(ctx[0].__jb);
|
||||
printf("sizeof(jmp_buf)=%d (unsigned long long [%d])\n", nn_jb, nn_jb/8);
|
||||
|
||||
unsigned char* p = (unsigned char*)ctx[0].__jb;
|
||||
print_buf(p, nn_jb);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#ifdef __x86_64__
|
||||
void print_jmpbuf()
|
||||
{
|
||||
// https://courses.cs.washington.edu/courses/cse378/10au/sections/Section1_recap.pdf
|
||||
void *rbx, *rbp, *r12, *r13, *r14, *r15, *rsp;
|
||||
__asm__ __volatile__ ("movq %%rbx,%0": "=r"(rbx): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%rbp,%0": "=r"(rbp): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r12,%0": "=r"(r12): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r13,%0": "=r"(r13): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r14,%0": "=r"(r14): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r15,%0": "=r"(r15): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%rsp,%0": "=r"(rsp): /* No input */);
|
||||
|
||||
printf("rbx=%p, rbp=%p, r12=%p, r13=%p, r14=%p, r15=%p, rsp=%p\n",
|
||||
rbx, rbp, r12, r13, r14, r15, rsp);
|
||||
|
||||
jmp_buf ctx = {0};
|
||||
int r0 = setjmp(ctx);
|
||||
if (!r0) {
|
||||
longjmp(ctx, 1);
|
||||
}
|
||||
|
||||
int nn_jb = sizeof(ctx);
|
||||
printf("sizeof(jmp_buf)=%d (unsigned long long [%d])\n", nn_jb, nn_jb/8);
|
||||
|
||||
unsigned char* p = (unsigned char*)ctx;
|
||||
print_buf(p, nn_jb);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void print_buf(unsigned char* p, int nn_jb)
|
||||
{
|
||||
printf(" ");
|
||||
|
||||
for (int i = 0; i < nn_jb; i++) {
|
||||
printf("0x%02x ", (unsigned char)p[i]);
|
||||
|
||||
int newline = ((i + 1) % sizeof(void*));
|
||||
if (!newline || i == nn_jb - 1) {
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (!newline && i < nn_jb - 1) {
|
||||
printf(" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1
trunk/3rdparty/st-srs/tools/verify/.gitignore
vendored
Normal file
1
trunk/3rdparty/st-srs/tools/verify/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
verify
|
11
trunk/3rdparty/st-srs/tools/verify/Makefile
vendored
Normal file
11
trunk/3rdparty/st-srs/tools/verify/Makefile
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
.PHONY: clean
|
||||
|
||||
LDLIBS=../../obj/libst.a
|
||||
CFLAGS=-g -O0
|
||||
|
||||
./verify: verify.c $(LDLIBS)
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -o verify verify.c $(LDLIBS)
|
||||
|
||||
clean:
|
||||
rm -f verify
|
||||
|
103
trunk/3rdparty/st-srs/tools/verify/verify.c
vendored
Normal file
103
trunk/3rdparty/st-srs/tools/verify/verify.c
vendored
Normal file
|
@ -0,0 +1,103 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright (c) 2021 Winlin */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <setjmp.h>
|
||||
extern int _st_md_cxt_save(jmp_buf env);
|
||||
extern void _st_md_cxt_restore(jmp_buf env, int val);
|
||||
|
||||
void verify_jmpbuf();
|
||||
void print_buf(unsigned char* p, int nn_jb);
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
verify_jmpbuf();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
#ifdef __mips__
|
||||
void verify_jmpbuf()
|
||||
{
|
||||
// https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions
|
||||
register void* ra asm("ra");
|
||||
register void* gp asm("gp");
|
||||
register void* sp asm("sp");
|
||||
register void* fp asm("fp");
|
||||
// $s0–$s7 $16–$23 saved temporaries
|
||||
register void* s0 asm("s0");
|
||||
register void* s1 asm("s1");
|
||||
register void* s2 asm("s2");
|
||||
register void* s3 asm("s3");
|
||||
register void* s4 asm("s4");
|
||||
register void* s5 asm("s5");
|
||||
register void* s6 asm("s6");
|
||||
register void* s7 asm("s7");
|
||||
|
||||
jmp_buf ctx = {0};
|
||||
int r0 = _st_md_cxt_save(ctx);
|
||||
if (!r0) {
|
||||
_st_md_cxt_restore(ctx, 1); // Restore/Jump to previous line, set r0 to 1.
|
||||
}
|
||||
|
||||
printf("sp=%p, ra=%p, gp=%p, s0=%p, s1=%p, s2=%p, s3=%p, s4=%p, s5=%p, s6=%p, s7=%p, fp=%p\n",
|
||||
sp, ra, gp, s0, s1, s2, s3, s4, s5, s6, s7, fp);
|
||||
|
||||
int nn_jb = sizeof(ctx[0].__jb);
|
||||
unsigned char* p = (unsigned char*)ctx[0].__jb;
|
||||
print_buf(p, nn_jb);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#ifdef __x86_64__
|
||||
void verify_jmpbuf()
|
||||
{
|
||||
// https://courses.cs.washington.edu/courses/cse378/10au/sections/Section1_recap.pdf
|
||||
void *rbx, *rbp, *r12, *r13, *r14, *r15, *rsp;
|
||||
__asm__ __volatile__ ("movq %%rbx,%0": "=r"(rbx): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%rbp,%0": "=r"(rbp): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r12,%0": "=r"(r12): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r13,%0": "=r"(r13): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r14,%0": "=r"(r14): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%r15,%0": "=r"(r15): /* No input */);
|
||||
__asm__ __volatile__ ("movq %%rsp,%0": "=r"(rsp): /* No input */);
|
||||
|
||||
printf("rbx=%p, rbp=%p, r12=%p, r13=%p, r14=%p, r15=%p, rsp=%p\n",
|
||||
rbx, rbp, r12, r13, r14, r15, rsp);
|
||||
|
||||
jmp_buf ctx = {0};
|
||||
int r0 = _st_md_cxt_save(ctx);
|
||||
if (!r0) {
|
||||
_st_md_cxt_restore(ctx, 1); // Restore/Jump to previous line, set r0 to 1.
|
||||
}
|
||||
|
||||
int nn_jb = sizeof(ctx);
|
||||
printf("sizeof(jmp_buf)=%d (unsigned long long [%d])\n", nn_jb, nn_jb/8);
|
||||
|
||||
unsigned char* p = (unsigned char*)ctx;
|
||||
print_buf(p, nn_jb);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void print_buf(unsigned char* p, int nn_jb)
|
||||
{
|
||||
printf(" ");
|
||||
|
||||
for (int i = 0; i < nn_jb; i++) {
|
||||
printf("0x%02x ", (unsigned char)p[i]);
|
||||
|
||||
int newline = ((i + 1) % sizeof(void*));
|
||||
if (!newline || i == nn_jb - 1) {
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (!newline && i < nn_jb - 1) {
|
||||
printf(" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
2
trunk/3rdparty/st-srs/utest/Makefile
vendored
2
trunk/3rdparty/st-srs/utest/Makefile
vendored
|
@ -28,7 +28,7 @@ GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_DIR)/include/gt
|
|||
# compiles fast and for ordinary users its source rarely changes.
|
||||
$(ST_DIR)/obj/gtest-all.o : $(GTEST_SRCS_)
|
||||
$(CXX) -c $(GTEST_DIR)/src/gtest-all.cc -o $@ \
|
||||
$(CXXFLAGS) \
|
||||
$(CXXFLAGS) $(UTEST_FLAGS) \
|
||||
$(WARNFLAGS) \
|
||||
-I$(GTEST_DIR)/include -I$(GTEST_DIR)
|
||||
|
||||
|
|
136
trunk/3rdparty/st-srs/utest/st_utest.cpp
vendored
136
trunk/3rdparty/st-srs/utest/st_utest.cpp
vendored
|
@ -1,25 +1,5 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2021 Winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright (c) 2021 Winlin */
|
||||
|
||||
#include <st_utest.hpp>
|
||||
|
||||
|
@ -30,8 +10,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
// Copy from gtest-1.6.0/src/gtest_main.cc
|
||||
GTEST_API_ int main(int argc, char **argv) {
|
||||
// Select the best event system available on the OS. In Linux this is
|
||||
// epoll(). On BSD it will be kqueue.
|
||||
// epoll(). On BSD it will be kqueue. On Cygwin it will be select.
|
||||
#if __CYGWIN__
|
||||
assert(st_set_eventsys(ST_EVENTSYS_SELECT) != -1);
|
||||
#else
|
||||
assert(st_set_eventsys(ST_EVENTSYS_ALT) != -1);
|
||||
#endif
|
||||
|
||||
// Initialize state-threads, create idle coroutine.
|
||||
assert(st_init() == 0);
|
||||
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
@ -47,3 +33,107 @@ VOID TEST(SampleTest, FastSampleInt64Test)
|
|||
EXPECT_EQ(8, (int)sizeof(int64_t));
|
||||
}
|
||||
|
||||
void* pfn_coroutine(void* /*arg*/)
|
||||
{
|
||||
st_usleep(0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VOID TEST(SampleTest, StartCoroutine)
|
||||
{
|
||||
st_thread_t trd = st_thread_create(pfn_coroutine, NULL, 1, 0);
|
||||
EXPECT_TRUE(trd != NULL);
|
||||
|
||||
// Wait for joinable coroutine to quit.
|
||||
st_thread_join(trd, NULL);
|
||||
}
|
||||
|
||||
VOID TEST(SampleTest, StartCoroutineX3)
|
||||
{
|
||||
st_thread_t trd0 = st_thread_create(pfn_coroutine, NULL, 1, 0);
|
||||
st_thread_t trd1 = st_thread_create(pfn_coroutine, NULL, 1, 0);
|
||||
st_thread_t trd2 = st_thread_create(pfn_coroutine, NULL, 1, 0);
|
||||
EXPECT_TRUE(trd0 != NULL && trd1 != NULL && trd2 != NULL);
|
||||
|
||||
// Wait for joinable coroutine to quit.
|
||||
st_thread_join(trd1, NULL);
|
||||
st_thread_join(trd2, NULL);
|
||||
st_thread_join(trd0, NULL);
|
||||
}
|
||||
|
||||
void* pfn_coroutine_add(void* arg)
|
||||
{
|
||||
int v = 0;
|
||||
int* pi = (int*)arg;
|
||||
|
||||
// Load the change of arg.
|
||||
while (v != *pi) {
|
||||
v = *pi;
|
||||
st_usleep(0);
|
||||
}
|
||||
|
||||
// Add with const.
|
||||
v += 100;
|
||||
*pi = v;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VOID TEST(SampleTest, StartCoroutineAdd)
|
||||
{
|
||||
int v = 0;
|
||||
st_thread_t trd = st_thread_create(pfn_coroutine_add, &v, 1, 0);
|
||||
EXPECT_TRUE(trd != NULL);
|
||||
|
||||
// Wait for joinable coroutine to quit.
|
||||
st_thread_join(trd, NULL);
|
||||
|
||||
EXPECT_EQ(100, v);
|
||||
}
|
||||
|
||||
VOID TEST(SampleTest, StartCoroutineAddX3)
|
||||
{
|
||||
int v = 0;
|
||||
st_thread_t trd0 = st_thread_create(pfn_coroutine_add, &v, 1, 0);
|
||||
st_thread_t trd1 = st_thread_create(pfn_coroutine_add, &v, 1, 0);
|
||||
st_thread_t trd2 = st_thread_create(pfn_coroutine_add, &v, 1, 0);
|
||||
EXPECT_TRUE(trd0 != NULL && trd1 != NULL && trd2 != NULL);
|
||||
|
||||
// Wait for joinable coroutine to quit.
|
||||
st_thread_join(trd0, NULL);
|
||||
st_thread_join(trd1, NULL);
|
||||
st_thread_join(trd2, NULL);
|
||||
|
||||
EXPECT_EQ(300, v);
|
||||
}
|
||||
|
||||
int pfn_coroutine_params_x4(int a, int b, int c, int d)
|
||||
{
|
||||
int e = 0;
|
||||
|
||||
st_usleep(0);
|
||||
|
||||
e += a + b + c + d;
|
||||
e += 100;
|
||||
return e;
|
||||
}
|
||||
|
||||
void* pfn_coroutine_params(void* arg)
|
||||
{
|
||||
int r0 = pfn_coroutine_params_x4(1, 2, 3, 4);
|
||||
*(int*)arg = r0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VOID TEST(SampleTest, StartCoroutineParams)
|
||||
{
|
||||
int r0 = 0;
|
||||
st_thread_t trd = st_thread_create(pfn_coroutine_params, &r0, 1, 0);
|
||||
EXPECT_TRUE(trd != NULL);
|
||||
|
||||
// Wait for joinable coroutine to quit.
|
||||
st_thread_join(trd, NULL);
|
||||
|
||||
EXPECT_EQ(110, r0);
|
||||
}
|
||||
|
||||
|
|
24
trunk/3rdparty/st-srs/utest/st_utest.hpp
vendored
24
trunk/3rdparty/st-srs/utest/st_utest.hpp
vendored
|
@ -1,25 +1,5 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2021 Winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright (c) 2021 Winlin */
|
||||
|
||||
#ifndef ST_UTEST_PUBLIC_HPP
|
||||
#define ST_UTEST_PUBLIC_HPP
|
||||
|
|
|
@ -8,8 +8,9 @@ The changelog for SRS.
|
|||
|
||||
## SRS 5.0 Changelog
|
||||
|
||||
* v5.0, 2021-10-02, ST: Support Cygwin64 and MIPS. 5.0.13
|
||||
* v5.0, 2021-09-23, Merge [#2578](https://github.com/ossrs/srs/pull/2578) Support http callback on_play/stop. 5.0.12
|
||||
* v4.0, 2021-08-07, Fix [#2508](https://github.com/ossrs/srs/pull/2508), Support features query by API. 5.0.10
|
||||
* v5.0, 2021-08-07, Fix [#2508](https://github.com/ossrs/srs/pull/2508), Support features query by API. 5.0.10
|
||||
* v5.0, 2021-07-07, Refine AUTHORS.txt to AUTHORS.md, etc. 5.0.8
|
||||
* v5.0, 2021-07-01, Move AUTHORS.txt to trunk for docker. 5.0.7
|
||||
* v5.0, 2021-06-28, Squash: Support query lastest available version. 5.0.6
|
||||
|
|
|
@ -9,6 +9,6 @@
|
|||
|
||||
#define VERSION_MAJOR 5
|
||||
#define VERSION_MINOR 0
|
||||
#define VERSION_REVISION 12
|
||||
#define VERSION_REVISION 13
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue