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
|
DARWIN_*_DBG
|
||||||
LINUX_*_DBG
|
LINUX_*_DBG
|
||||||
|
CYGWIN64_*_DBG
|
||||||
obj
|
obj
|
||||||
st.pc
|
st.pc
|
||||||
.idea
|
.idea
|
||||||
|
@ -10,3 +11,4 @@ googletest-*
|
||||||
*.gcno
|
*.gcno
|
||||||
coverage
|
coverage
|
||||||
codecov
|
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
|
BUILD = DBG
|
||||||
TARGETDIR = $(OS)_$(shell uname -r)_$(BUILD)
|
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)
|
DEFINES = -D$(OS)
|
||||||
CFLAGS =
|
CFLAGS =
|
||||||
SFLAGS =
|
SFLAGS =
|
||||||
|
@ -73,10 +84,12 @@ DESC = st.pc
|
||||||
# Possible targets:
|
# Possible targets:
|
||||||
|
|
||||||
TARGETS = darwin-debug darwin-optimized \
|
TARGETS = darwin-debug darwin-optimized \
|
||||||
linux-debug linux-optimized
|
linux-debug linux-optimized \
|
||||||
|
cygwin64-debug
|
||||||
|
|
||||||
UTEST_TARGETS = darwin-debug-utest linux-debug-utest \
|
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
|
# Platform specifics
|
||||||
|
@ -91,7 +104,7 @@ CFLAGS += -arch x86_64
|
||||||
LDFLAGS += -arch x86_64
|
LDFLAGS += -arch x86_64
|
||||||
LDFLAGS += -dynamiclib -install_name /sw/lib/libst.$(MAJOR).$(DSO_SUFFIX) -compatibility_version $(MAJOR) -current_version $(VERSION)
|
LDFLAGS += -dynamiclib -install_name /sw/lib/libst.$(MAJOR).$(DSO_SUFFIX) -compatibility_version $(MAJOR) -current_version $(VERSION)
|
||||||
OTHER_FLAGS = -Wall
|
OTHER_FLAGS = -Wall
|
||||||
DEFINES += -DMD_HAVE_KQUEUE
|
DEFINES += -DMD_HAVE_KQUEUE -DMD_HAVE_SELECT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(OS), LINUX)
|
ifeq ($(OS), LINUX)
|
||||||
|
@ -99,7 +112,16 @@ EXTRA_OBJS = $(TARGETDIR)/md_linux.o
|
||||||
SFLAGS = -fPIC
|
SFLAGS = -fPIC
|
||||||
LDFLAGS = -shared -soname=$(SONAME) -lc
|
LDFLAGS = -shared -soname=$(SONAME) -lc
|
||||||
OTHER_FLAGS = -Wall
|
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
|
endif
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -159,6 +181,10 @@ endif
|
||||||
#
|
#
|
||||||
# make EXTRA_CFLAGS=-UMD_HAVE_EPOLL <target>
|
# 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:
|
# or to enable stats for ST:
|
||||||
#
|
#
|
||||||
# make EXTRA_CFLAGS=-DDEBUG_STATS
|
# make EXTRA_CFLAGS=-DDEBUG_STATS
|
||||||
|
@ -245,6 +271,9 @@ $(TARGETDIR)/md_linux.o: md_linux.S
|
||||||
$(TARGETDIR)/md_darwin.o: md_darwin.S
|
$(TARGETDIR)/md_darwin.o: md_darwin.S
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
$(TARGETDIR)/md_cygwin64.o: md_cygwin64.S
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(TARGETDIR)/%.o: %.c common.h md.h
|
$(TARGETDIR)/%.o: %.c common.h md.h
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
@ -277,6 +306,9 @@ linux-debug:
|
||||||
linux-optimized:
|
linux-optimized:
|
||||||
$(MAKE) OS="LINUX" BUILD="OPT"
|
$(MAKE) OS="LINUX" BUILD="OPT"
|
||||||
|
|
||||||
|
cygwin64-debug:
|
||||||
|
$(MAKE) OS="CYGWIN64" BUILD="DBG"
|
||||||
|
|
||||||
darwin-debug-utest:
|
darwin-debug-utest:
|
||||||
@echo "Build utest for state-threads"
|
@echo "Build utest for state-threads"
|
||||||
$(MAKE) OS="DARWIN" BUILD="DBG"
|
$(MAKE) OS="DARWIN" BUILD="DBG"
|
||||||
|
@ -285,6 +317,10 @@ linux-debug-utest:
|
||||||
@echo "Build utest for state-threads"
|
@echo "Build utest for state-threads"
|
||||||
$(MAKE) OS="LINUX" BUILD="DBG"
|
$(MAKE) OS="LINUX" BUILD="DBG"
|
||||||
cd utest && $(MAKE)
|
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:
|
darwin-debug-gcov:
|
||||||
@echo "Build utest with gcov for state-threads"
|
@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).
|
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
|
## Usage
|
||||||
|
|
||||||
Get code:
|
Get code:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
git clone https://github.com/ossrs/state-threads.git &&
|
git clone -b srs https://github.com/ossrs/state-threads.git
|
||||||
cd state-threads && git checkout srs
|
|
||||||
```
|
```
|
||||||
|
|
||||||
For Linux:
|
For Linux:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
make linux-debug EXTRA_CFLAGS="-DMD_HAVE_EPOLL"
|
make linux-debug
|
||||||
```
|
```
|
||||||
|
|
||||||
For OSX:
|
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:
|
Linux with valgrind:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
make linux-debug EXTRA_CFLAGS="-DMD_VALGRIND"
|
make linux-debug EXTRA_CFLAGS="-DMD_VALGRIND"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -42,13 +57,13 @@ make linux-debug EXTRA_CFLAGS="-DMD_VALGRIND"
|
||||||
|
|
||||||
Linux with valgrind and epoll:
|
Linux with valgrind and epoll:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
make linux-debug EXTRA_CFLAGS="-DMD_HAVE_EPOLL -DMD_VALGRIND"
|
make linux-debug EXTRA_CFLAGS="-DMD_HAVE_EPOLL -DMD_VALGRIND"
|
||||||
```
|
```
|
||||||
|
|
||||||
For OSX, user must specifies the valgrind header files:
|
For OSX, user must specifies the valgrind header files:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
make darwin-debug EXTRA_CFLAGS="-DMD_HAVE_KQUEUE -DMD_VALGRIND -I/usr/local/include"
|
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:
|
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] ARM: 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] 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] Patch [st.disable.examples.patch](https://github.com/ossrs/srs/blob/2.0release/trunk/3rdparty/patches/4.st.disable.examples.patch), for ubuntu.
|
- [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] [Refine TAB of code](https://github.com/ossrs/state-threads/compare/c2001d30ca58f55d72a6cc6b9b6c70391eaf14db...d2101b26988b0e0db0aabc53ddf452068c1e2cbc).
|
- [x] System: [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] 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] Merge from [toffaletti](https://github.com/toffaletti/state-threads), support [valgrind](https://github.com/ossrs/state-threads/issues/2) for ST.
|
- [x] Valgrind: 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] 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] Support macro `MD_ST_NO_ASM` to disable ASM, [#8](https://github.com/ossrs/state-threads/issues/8).
|
- [x] ARM: 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] 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] Support OSX for Apple Darwin, macOS, [#11](https://github.com/ossrs/state-threads/issues/11).
|
- [x] OSX: 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] System: Refine performance for sleep or epoll_wait(0), [#17](https://github.com/ossrs/state-threads/issues/17).
|
||||||
- [x] 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.
|
||||||
- [ ] 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] 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] Support utest by gtest and coverage by gcov/gocvr.
|
- [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)
|
||||||
- [ ] 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] 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
|
## GDB Tools
|
||||||
|
|
||||||
|
@ -141,6 +159,7 @@ bash auto/coverage.sh
|
||||||
* API reference: http://ossrs.github.io/state-threads/docs/reference.html
|
* API reference: http://ossrs.github.io/state-threads/docs/reference.html
|
||||||
* Programming notes: http://ossrs.github.io/state-threads/docs/notes.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 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 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).
|
* 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
|
open coverage/st.html
|
||||||
|
|
||||||
popd
|
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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* 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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* 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;
|
unsigned long long _st_stat_epoll_spin = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(MD_HAVE_KQUEUE) && !defined(MD_HAVE_EPOLL)
|
#if !defined(MD_HAVE_KQUEUE) && !defined(MD_HAVE_EPOLL) && !defined(MD_HAVE_SELECT)
|
||||||
#error Only support epoll(for Linux) or kqueue(for Darwin)
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -130,6 +149,300 @@ static struct _st_epolldata {
|
||||||
_st_eventsys_t *_st_eventsys = NULL;
|
_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
|
#ifdef MD_HAVE_KQUEUE
|
||||||
/*****************************************
|
/*****************************************
|
||||||
* kqueue event system
|
* kqueue event system
|
||||||
|
@ -885,20 +1198,27 @@ int st_set_eventsys(int eventsys)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (MD_HAVE_KQUEUE)
|
if (eventsys == ST_EVENTSYS_SELECT || eventsys == ST_EVENTSYS_DEFAULT) {
|
||||||
_st_eventsys = &_st_kq_eventsys;
|
#if defined (MD_HAVE_SELECT)
|
||||||
return 0;
|
_st_eventsys = &_st_select_eventsys;
|
||||||
#elif defined (MD_HAVE_EPOLL)
|
|
||||||
if (_st_epoll_is_supported()) {
|
|
||||||
_st_eventsys = &_st_epoll_eventsys;
|
|
||||||
return 0;
|
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;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
#else
|
|
||||||
#error Only support epoll(for Linux) or kqueue(for Darwin)
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int st_get_eventsys(void)
|
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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* 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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* 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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
@ -67,7 +69,7 @@
|
||||||
#define MD_USE_BUILTIN_SETJMP
|
#define MD_USE_BUILTIN_SETJMP
|
||||||
|
|
||||||
#if defined(__amd64__) || defined(__x86_64__)
|
#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]))
|
#define MD_GET_SP(_t) *((long *)&((_t)->context[JB_SP]))
|
||||||
#else
|
#else
|
||||||
#error Unknown CPU architecture
|
#error Unknown CPU architecture
|
||||||
|
@ -115,15 +117,7 @@
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#if defined(__mips__)
|
#if 1
|
||||||
#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 */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On linux, there are a few styles of jmpbuf format. These vary based
|
* 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"
|
#error "ARM/Linux pre-glibc2 not supported yet"
|
||||||
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
|
#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
|
#else
|
||||||
#error "Unknown CPU architecture"
|
#error "Unknown CPU architecture"
|
||||||
#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
|
#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
|
||||||
|
@ -212,6 +211,42 @@
|
||||||
#define MD_LONGJMP(env, val) longjmp(env, val)
|
#define MD_LONGJMP(env, val) longjmp(env, val)
|
||||||
#endif
|
#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
|
#else
|
||||||
#error Unknown OS
|
#error Unknown OS
|
||||||
#endif /* 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 user disable the ASM, such as avoiding bugs in ASM, donot compile it. */
|
||||||
#if !defined(MD_ST_NO_ASM)
|
#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 user disable the ASM, such as avoiding bugs in ASM, donot compile it. */
|
||||||
#if !defined(MD_ST_NO_ASM)
|
#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
|
||||||
|
|
||||||
#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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
@ -65,6 +67,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ST_EVENTSYS_DEFAULT 0
|
#define ST_EVENTSYS_DEFAULT 0
|
||||||
|
#define ST_EVENTSYS_SELECT 1
|
||||||
#define ST_EVENTSYS_ALT 3
|
#define ST_EVENTSYS_ALT 3
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* 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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* 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
|
* The contents of this file are subject to the Mozilla Public
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
* except in compliance with the License. You may obtain a copy of
|
* 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.
|
# compiles fast and for ordinary users its source rarely changes.
|
||||||
$(ST_DIR)/obj/gtest-all.o : $(GTEST_SRCS_)
|
$(ST_DIR)/obj/gtest-all.o : $(GTEST_SRCS_)
|
||||||
$(CXX) -c $(GTEST_DIR)/src/gtest-all.cc -o $@ \
|
$(CXX) -c $(GTEST_DIR)/src/gtest-all.cc -o $@ \
|
||||||
$(CXXFLAGS) \
|
$(CXXFLAGS) $(UTEST_FLAGS) \
|
||||||
$(WARNFLAGS) \
|
$(WARNFLAGS) \
|
||||||
-I$(GTEST_DIR)/include -I$(GTEST_DIR)
|
-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 @@
|
||||||
/*
|
/* SPDX-License-Identifier: MIT */
|
||||||
The MIT License (MIT)
|
/* Copyright (c) 2021 Winlin */
|
||||||
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <st_utest.hpp>
|
#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
|
// Copy from gtest-1.6.0/src/gtest_main.cc
|
||||||
GTEST_API_ int main(int argc, char **argv) {
|
GTEST_API_ int main(int argc, char **argv) {
|
||||||
// Select the best event system available on the OS. In Linux this is
|
// 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);
|
assert(st_set_eventsys(ST_EVENTSYS_ALT) != -1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Initialize state-threads, create idle coroutine.
|
||||||
assert(st_init() == 0);
|
assert(st_init() == 0);
|
||||||
|
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
@ -47,3 +33,107 @@ VOID TEST(SampleTest, FastSampleInt64Test)
|
||||||
EXPECT_EQ(8, (int)sizeof(int64_t));
|
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 @@
|
||||||
/*
|
/* SPDX-License-Identifier: MIT */
|
||||||
The MIT License (MIT)
|
/* Copyright (c) 2021 Winlin */
|
||||||
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ST_UTEST_PUBLIC_HPP
|
#ifndef ST_UTEST_PUBLIC_HPP
|
||||||
#define ST_UTEST_PUBLIC_HPP
|
#define ST_UTEST_PUBLIC_HPP
|
||||||
|
|
|
@ -8,8 +8,9 @@ The changelog for SRS.
|
||||||
|
|
||||||
## SRS 5.0 Changelog
|
## 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
|
* 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-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-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
|
* v5.0, 2021-06-28, Squash: Support query lastest available version. 5.0.6
|
||||||
|
|
|
@ -9,6 +9,6 @@
|
||||||
|
|
||||||
#define VERSION_MAJOR 5
|
#define VERSION_MAJOR 5
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 12
|
#define VERSION_REVISION 13
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue