From c339542ce0a341eba8e5ca112b36e0b89b914da6 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 28 Mar 2020 17:20:40 +0800 Subject: [PATCH] Support macOS OSX --- trunk/3rdparty/st-srs/Makefile | 12 ++- trunk/3rdparty/st-srs/md.h | 32 ++++---- trunk/3rdparty/st-srs/md_darwin.S | 76 +++++++++++++++++++ trunk/auto/auto_headers.sh | 5 ++ trunk/auto/depends.sh | 98 ++++++++++++++++++++++++- trunk/auto/options.sh | 34 ++++----- trunk/src/app/srs_app_server.cpp | 8 +- trunk/src/app/srs_app_utility.cpp | 82 +++++++++++++++++++-- trunk/src/kernel/srs_kernel_utility.cpp | 2 + trunk/src/kernel/srs_kernel_utility.hpp | 6 +- trunk/src/main/srs_main_server.cpp | 4 +- trunk/src/service/srs_service_log.cpp | 2 +- trunk/src/utest/srs_utest_kernel.cpp | 2 + 13 files changed, 312 insertions(+), 51 deletions(-) create mode 100644 trunk/3rdparty/st-srs/md_darwin.S diff --git a/trunk/3rdparty/st-srs/Makefile b/trunk/3rdparty/st-srs/Makefile index 304d44377c..601d3e5079 100644 --- a/trunk/3rdparty/st-srs/Makefile +++ b/trunk/3rdparty/st-srs/Makefile @@ -128,6 +128,7 @@ OTHER_FLAGS = -Wall endif ifeq ($(OS), DARWIN) +EXTRA_OBJS = $(TARGETDIR)/md_darwin.o LD = cc SFLAGS = -fPIC -fno-common DSO_SUFFIX = dylib @@ -139,8 +140,8 @@ CFLAGS += -arch ppc LDFLAGS += -arch ppc endif ifeq ($(INTEL), yes) -CFLAGS += -arch i386 -arch x86_64 -LDFLAGS += -arch i386 -arch x86_64 +CFLAGS += -arch x86_64 +LDFLAGS += -arch x86_64 endif LDFLAGS += -dynamiclib -install_name /sw/lib/libst.$(MAJOR).$(DSO_SUFFIX) -compatibility_version $(MAJOR) -current_version $(VERSION) OTHER_FLAGS = -Wall @@ -313,7 +314,9 @@ endif # for SRS # disable examples for ubuntu crossbuild failed. # @see https://github.com/winlinvip/simple-rtmp-server/issues/308 +ifeq ($(OS), LINUX) EXAMPLES = +endif ifeq ($(OS), DARWIN) LINKNAME = libst.$(DSO_SUFFIX) @@ -369,10 +372,13 @@ $(HEADER): public.h $(TARGETDIR)/md.o: md.S $(CC) $(CFLAGS) -c $< -o $@ +$(TARGETDIR)/md_darwin.o: md_darwin.S + $(CC) $(CFLAGS) -c $< -o $@ + $(TARGETDIR)/%.o: %.c common.h md.h $(CC) $(CFLAGS) -c $< -o $@ -examples:: +examples: $(SLIBRARY) @echo Making $@ @cd $@; $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" OS="$(OS)" TARGETDIR="$(TARGETDIR)" diff --git a/trunk/3rdparty/st-srs/md.h b/trunk/3rdparty/st-srs/md.h index dc4ef54c90..8c0a222d69 100644 --- a/trunk/3rdparty/st-srs/md.h +++ b/trunk/3rdparty/st-srs/md.h @@ -120,26 +120,30 @@ #define MD_ALWAYS_UNSERIALIZED_ACCEPT #define MD_HAVE_SOCKLEN_T - #define MD_SETJMP(env) _setjmp(env) - #define MD_LONGJMP(env, val) _longjmp(env, val) + #define MD_USE_BUILTIN_SETJMP - #if defined(__ppc__) - #define MD_JB_SP 0 - #elif defined(__i386__) - #define MD_JB_SP 9 - #elif defined(__x86_64__) - #define MD_JB_SP 4 + #if defined(__amd64__) || defined(__x86_64__) + #define JB_SP 12 + #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(); \ - *((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \ + + #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); \ diff --git a/trunk/3rdparty/st-srs/md_darwin.S b/trunk/3rdparty/st-srs/md_darwin.S new file mode 100644 index 0000000000..6cd163d441 --- /dev/null +++ b/trunk/3rdparty/st-srs/md_darwin.S @@ -0,0 +1,76 @@ + +/* 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 /* Backup IP, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_R13 3 /* Backup SP, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_R14 4 /* Backup LR, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_R15 5 /* Backup PC, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_RSP 6 + #define JB_PC 7 + + .file "md_darwin.S" + .text + + /* _st_md_cxt_save(__jmp_buf env) */ /* The env is rdi, http://blog.chinaunix.net/uid-20157960-id-1974354.html */ + .globl __st_md_cxt_save + .align 16 + __st_md_cxt_save: + /* + * Save registers. + */ + movq %rbx, (JB_RBX*8)(%rdi) /* Save rbx to env[0], *(int64_t*)(rdi+0)=rbx */ + movq %rbp, (JB_RBP*8)(%rdi) /* Save rbp to env[1], *(int64_t*)(rdi+1)=rbp */ + movq %r12, (JB_R12*8)(%rdi) /* Save r12 to env[2], *(int64_t*)(rdi+2)=r12 */ + movq %r13, (JB_R13*8)(%rdi) /* Save r13 to env[3], *(int64_t*)(rdi+3)=r13 */ + movq %r14, (JB_R14*8)(%rdi) /* Save r14 to env[4], *(int64_t*)(rdi+4)=r14 */ + movq %r15, (JB_R15*8)(%rdi) /* Save r15 to env[5], *(int64_t*)(rdi+5)=r15 */ + /* Save SP */ + leaq 8(%rsp), %rdx /* Save *(int64_t*)(rsp+8) to rdx, https://my.oschina.net/guonaihong/blog/508907 */ + movq %rdx, (JB_RSP*8)(%rdi) /* Save rdx(rsp) to env[6], *(int64_t*)(rdi+6)=rdx */ + /* Save PC we are returning to */ + movq (%rsp), %rax /* Save PC(parent function address) %(rsp) to rax */ + movq %rax, (JB_PC*8)(%rdi) /* Save rax(PC) to env[7], *(int64_t*)(rdi+7)=rax */ + xorq %rax, %rax /* Reset rax to 0 */ + ret + + + /****************************************************************/ + + /* _st_md_cxt_restore(__jmp_buf env, int val) */ /* The env is rdi, val is esi/rsi, http://blog.chinaunix.net/uid-20157960-id-1974354.html */ + .globl __st_md_cxt_restore + .align 16 + __st_md_cxt_restore: + /* + * Restore registers. + */ + movq (JB_RBX*8)(%rdi), %rbx /* Load rbx from env[0] */ + movq (JB_RBP*8)(%rdi), %rbp /* Load rbp from env[1] */ + movq (JB_R12*8)(%rdi), %r12 /* Load r12 from env[2] */ + movq (JB_R13*8)(%rdi), %r13 /* Load r13 from env[3] */ + movq (JB_R14*8)(%rdi), %r14 /* Load r14 from env[4] */ + movq (JB_R15*8)(%rdi), %r15 /* Load r15 from env[5] */ + /* Set return value */ /* The esi is param1 val, the eax is return value */ + test %esi, %esi /* if (!val) { */ + mov $01, %eax /* val=1; */ + cmove %eax, %esi /* } */ + mov %esi, %eax /* return val; */ + movq (JB_PC*8)(%rdi), %rdx /* Load rdx(PC) from env[7] */ + movq (JB_RSP*8)(%rdi), %rsp /* Load rsp from env[6] */ + /* Jump to saved PC */ + jmpq *%rdx /* Jump to rdx(PC) */ + + /****************************************************************/ + +#endif + +#endif diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh index 87720b8401..25564d1d26 100755 --- a/trunk/auto/auto_headers.sh +++ b/trunk/auto/auto_headers.sh @@ -137,6 +137,11 @@ if [ $SRS_CROSS_BUILD = YES ]; then else srs_undefine_macro "SRS_AUTO_CROSSBUILD" $SRS_AUTO_HEADERS_H fi +if [ $SRS_OSX = YES ]; then + srs_define_macro "SRS_AUTO_OSX" $SRS_AUTO_HEADERS_H +else + srs_undefine_macro "SRS_AUTO_OSX" $SRS_AUTO_HEADERS_H +fi # prefix echo "" >> $SRS_AUTO_HEADERS_H diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index d89749d58d..616e6373e8 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -109,6 +109,7 @@ function Ubuntu_prepare() if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then Ubuntu_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "Install tools for ubuntu failed, ret=$ret"; exit $ret; fi fi + ##################################################################################### # for Centos, auto install tools by yum ##################################################################################### @@ -182,14 +183,105 @@ function Centos_prepare() if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then Centos_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "Install tools for CentOS failed, ret=$ret"; exit $ret; fi fi + +##################################################################################### +# For OSX, auto install tools by brew +##################################################################################### +OS_IS_OSX=NO +function OSX_prepare() +{ + uname -s|grep Darwin >/dev/null 2>&1 + ret=$?; if [[ 0 -ne $ret ]]; then + if [ $SRS_OSX = YES ]; then + echo "OSX check failed, actual is `uname -s`" + exit 1; + fi + return 0; + fi + + # cross build for arm, install the cross build tool chain. + if [ $SRS_CROSS_BUILD = YES ]; then + echo "embeded(arm/mips) is invalid for OSX" + return 1 + fi + + OS_IS_OSX=YES + echo "OSX detected, install tools if needed" + # requires the osx when os + if [ $OS_IS_OSX = YES ]; then + if [ $SRS_OSX = NO ]; then + echo "OSX detected, must specifies the --osx" + exit 1 + fi + fi + + brew --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install brew" + echo "ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"" + ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install brew success" + fi + + gcc --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install gcc" + echo "brew install gcc" + brew install gcc; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install gcc success" + fi + + g++ --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install gcc-c++" + echo "brew install gcc-c++" + brew install gcc-c++; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install gcc-c++ success" + fi + + make --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install make" + echo "brew install make" + brew install make; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install make success" + fi + + patch --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install patch" + echo "brew install patch" + brew install patch; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install patch success" + fi + + unzip --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install unzip" + echo "brew install unzip" + brew install unzip; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install unzip success" + fi + + echo "OSX install tools success" + return 0 +} +# donot prepare tools, for srs-librtmp depends only gcc and g++. +if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then + OSX_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "OSX prepare failed, ret=$ret"; exit $ret; fi +fi + ##################################################################################### # for Centos, auto install tools by yum ##################################################################################### # We must use a bash function instead of variable. function sed_utility() { - sed -i "$@" + if [ $OS_IS_OSX = YES ]; then + sed -i '' "$@" + else + sed -i "$@" + fi + ret=$?; if [[ $ret -ne 0 ]]; then - echo "sed -i \"$@\"" + if [ $OS_IS_OSX = YES ]; then + echo "sed -i '' \"$@\"" + else + echo "sed -i \"$@\"" + fi return $ret fi } @@ -204,7 +296,7 @@ SED="sed_utility" && echo "SED is $SED" # directly build on arm/mips, for example, pi or cubie, # export srs-librtmp # others is invalid. -if [[ $OS_IS_UBUNTU = NO && $OS_IS_CENTOS = NO && $SRS_EXPORT_LIBRTMP_PROJECT = NO ]]; then +if [[ $OS_IS_UBUNTU = NO && $OS_IS_CENTOS = NO && $OS_IS_OSX = NO && $SRS_EXPORT_LIBRTMP_PROJECT = NO ]]; then if [[ $SRS_PI = NO && $SRS_CUBIE = NO && $SRS_CROSS_BUILD = NO ]]; then echo "Your OS `uname -s` is not supported." exit 1 diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 4c6bc58ca1..321288bc3b 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -284,18 +284,16 @@ function parse_user_option() { --with-hls) SRS_HLS=YES ;; --with-dvr) SRS_DVR=YES ;; - --without-stream-caster) ;& - --without-ingest) ;& - --without-ssl) ;& - --without-stat) ;& - --without-transcode) ;& - --without-http-callback) ;& - --without-http-server) ;& - --without-http-api) ;& - --without-hls) ;& - --without-dvr) - echo "ignore option \"$option\"" - ;; + --without-stream-caster) echo "ignore option \"$option\"" ;; + --without-ingest) echo "ignore option \"$option\"" ;; + --without-ssl) echo "ignore option \"$option\"" ;; + --without-stat) echo "ignore option \"$option\"" ;; + --without-transcode) echo "ignore option \"$option\"" ;; + --without-http-callback) echo "ignore option \"$option\"" ;; + --without-http-server) echo "ignore option \"$option\"" ;; + --without-http-api) echo "ignore option \"$option\"" ;; + --without-hls) echo "ignore option \"$option\"" ;; + --without-dvr) echo "ignore option \"$option\"" ;; *) echo "$0: error: invalid option \"$option\"" @@ -562,16 +560,16 @@ function check_option_conflicts() { echo "For crossbuild, must not use default toolchain, cc: $SRS_TOOL_CC, cxx: $SRS_TOOL_CXX, ar: $SRS_TOOL_AR"; exit -1 fi - if [ $SRS_OSX = YES ]; then - echo "We don't support OSX, please use docker https://github.com/ossrs/srs-docker"; exit -1 - fi - if [[ $SRS_NGINX == YES ]]; then - echo "Don't support building NGINX, please use docker https://github.com/ossrs/srs-docker"; exit -1 + echo "Don't support building NGINX, please use docker https://github.com/ossrs/srs-docker"; exit -1; fi if [[ $SRS_FFMPEG_TOOL == YES ]]; then - echo "Don't support building FFMPEG, please use docker https://github.com/ossrs/srs-docker"; exit -1 + echo "Don't support building FFMPEG, please use docker https://github.com/ossrs/srs-docker"; exit -1; + fi + + if [[ $SRS_OSX == YES && $SRS_UTEST == YES ]]; then + echo "Mac does not support utest."; exit -1; fi # TODO: FIXME: check more os. diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 39521fbc14..2ca4321edb 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -30,7 +30,9 @@ #include #include #include +#ifndef SRS_AUTO_OSX #include +#endif using namespace std; #include @@ -478,6 +480,7 @@ srs_error_t SrsInotifyWorker::start() { srs_error_t err = srs_success; +#ifndef SRS_AUTO_OSX // Whether enable auto reload config. bool auto_reload = _srs_config->inotify_auto_reload(); if (!auto_reload && _srs_in_docker && _srs_config->auto_reload_for_docker()) { @@ -548,6 +551,7 @@ srs_error_t SrsInotifyWorker::start() if ((err = trd->start()) != srs_success) { return srs_error_wrap(err, "inotify"); } +#endif return err; } @@ -556,6 +560,7 @@ srs_error_t SrsInotifyWorker::cycle() { srs_error_t err = srs_success; +#ifndef SRS_AUTO_OSX string config_path = _srs_config->config(); string config_file = srs_path_basename(config_path); string k8s_file = "..data"; @@ -595,6 +600,7 @@ srs_error_t SrsInotifyWorker::cycle() srs_usleep(3000 * SRS_UTIME_MILLISECONDS); } +#endif return err; } @@ -763,7 +769,7 @@ srs_error_t SrsServer::initialize_st() if ((err = srs_st_init()) != srs_success) { return srs_error_wrap(err, "initialize st failed"); } - + // @remark, st alloc segment use mmap, which only support 32757 threads, // if need to support more, for instance, 100k threads, define the macro MALLOC_STACK. // TODO: FIXME: maybe can use "sysctl vm.max_map_count" to refine. diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index 04ece71840..3a7ab640d8 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -35,6 +35,9 @@ #include #include #include +#ifdef SRS_AUTO_OSX +#include +#endif using namespace std; #include @@ -326,6 +329,7 @@ SrsProcSystemStat* srs_get_system_proc_stat() bool get_proc_system_stat(SrsProcSystemStat& r) { +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/stat", "r"); if (f == NULL) { srs_warn("open system cpu stat failed, ignore"); @@ -355,6 +359,7 @@ bool get_proc_system_stat(SrsProcSystemStat& r) } fclose(f); +#endif r.ok = true; @@ -363,6 +368,7 @@ bool get_proc_system_stat(SrsProcSystemStat& r) bool get_proc_self_stat(SrsProcSelfStat& r) { +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/self/stat", "r"); if (f == NULL) { srs_warn("open self cpu stat failed, ignore"); @@ -389,6 +395,7 @@ bool get_proc_self_stat(SrsProcSelfStat& r) &r.guest_time, &r.cguest_time); fclose(f); +#endif r.ok = true; @@ -484,6 +491,7 @@ SrsDiskStat* srs_get_disk_stat() bool srs_get_disk_vmstat_stat(SrsDiskStat& r) { +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/vmstat", "r"); if (f == NULL) { srs_warn("open vmstat failed, ignore"); @@ -503,6 +511,7 @@ bool srs_get_disk_vmstat_stat(SrsDiskStat& r) } fclose(f); +#endif r.ok = true; @@ -513,13 +522,14 @@ bool srs_get_disk_diskstats_stat(SrsDiskStat& r) { r.ok = true; r.sample_time = srsu2ms(srs_get_system_time()); - + +#ifndef SRS_AUTO_OSX // if disabled, ignore all devices. SrsConfDirective* conf = _srs_config->get_stats_disk_device(); if (conf == NULL) { return true; } - + FILE* f = fopen("/proc/diskstats", "r"); if (f == NULL) { srs_warn("open vmstat failed, ignore"); @@ -584,6 +594,7 @@ bool srs_get_disk_diskstats_stat(SrsDiskStat& r) } fclose(f); +#endif r.ok = true; @@ -675,7 +686,8 @@ SrsMemInfo* srs_get_meminfo() void srs_update_meminfo() { SrsMemInfo& r = _srs_system_meminfo; - + +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/meminfo", "r"); if (f == NULL) { srs_warn("open meminfo failed, ignore"); @@ -701,6 +713,7 @@ void srs_update_meminfo() } fclose(f); +#endif r.sample_time = srsu2ms(srs_get_system_time()); r.MemActive = r.MemTotal - r.MemFree; @@ -767,7 +780,8 @@ void srs_update_platform_info() SrsPlatformInfo& r = _srs_system_platform_info; r.srs_startup_time = srsu2ms(srs_get_system_startup_time()); - + +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/uptime", "r"); if (f == NULL) { @@ -796,7 +810,44 @@ void srs_update_platform_info() fclose(f); } - +#else + // man 3 sysctl + if (true) { + struct timeval tv; + size_t len = sizeof(timeval); + + int mib[2]; + mib[0] = CTL_KERN; + mib[1] = KERN_BOOTTIME; + if (sysctl(mib, 2, &tv, &len, NULL, 0) < 0) { + srs_warn("sysctl boottime failed, ignore"); + return; + } + + time_t bsec = tv.tv_sec; + time_t csec = ::time(NULL); + r.os_uptime = difftime(csec, bsec); + } + + // man 3 sysctl + if (true) { + struct loadavg la; + size_t len = sizeof(loadavg); + + int mib[2]; + mib[0] = CTL_VM; + mib[1] = VM_LOADAVG; + if (sysctl(mib, 2, &la, &len, NULL, 0) < 0) { + srs_warn("sysctl loadavg failed, ignore"); + return; + } + + r.load_one_minutes = (double)la.ldavg[0] / la.fscale; + r.load_five_minutes = (double)la.ldavg[1] / la.fscale; + r.load_fifteen_minutes = (double)la.ldavg[2] / la.fscale; + } +#endif + r.ok = true; } @@ -842,6 +893,7 @@ int srs_get_network_devices_count() void srs_update_network_devices() { +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/net/dev", "r"); if (f == NULL) { @@ -878,6 +930,7 @@ void srs_update_network_devices() fclose(f); } +#endif } SrsNetworkRtmpServer::SrsNetworkRtmpServer() @@ -924,7 +977,8 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps) int nb_tcp_total = 0; int nb_tcp_mem = 0; int nb_udp4 = 0; - + +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/net/sockstat", "r"); if (f == NULL) { @@ -954,9 +1008,20 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps) fclose(f); } - +#else + // TODO: FIXME: impelments it. + nb_socks = 0; + nb_tcp4_hashed = 0; + nb_tcp_orphans = 0; + nb_tcp_tws = 0; + nb_tcp_total = 0; + nb_tcp_mem = 0; + nb_udp4 = 0; +#endif + int nb_tcp_estab = 0; - + +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/net/snmp", "r"); if (f == NULL) { @@ -986,6 +1051,7 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps) fclose(f); } +#endif // @see: https://github.com/shemminger/iproute2/blob/master/misc/ss.c // TODO: FIXME: ignore the slabstat, @see: get_slabstat() diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 5fe03a1290..1d91b72bd5 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -124,7 +124,9 @@ srs_utime_t srs_get_system_startup_time() } // For utest to mock it. +#ifndef SRS_AUTO_OSX _srs_gettimeofday_t _srs_gettimeofday = ::gettimeofday; +#endif srs_utime_t srs_update_system_time() { diff --git a/trunk/src/kernel/srs_kernel_utility.hpp b/trunk/src/kernel/srs_kernel_utility.hpp index 04d3862987..c63937430d 100644 --- a/trunk/src/kernel/srs_kernel_utility.hpp +++ b/trunk/src/kernel/srs_kernel_utility.hpp @@ -166,7 +166,11 @@ extern int srs_chunk_header_c3(int perfer_cid, uint32_t timestamp, char* cache, // For utest to mock it. #include -typedef int (*_srs_gettimeofday_t)(struct timeval* tv, struct timezone* tz); +#ifdef SRS_AUTO_OSX + #define _srs_gettimeofday gettimeofday +#else + typedef int (*_srs_gettimeofday_t) (struct timeval* tv, struct timezone* tz); +#endif #endif diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 603e0f1e2b..d5cdbd1822 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -121,8 +121,8 @@ srs_error_t do_main(int argc, char** argv) // config already applied to log. srs_trace("%s, %s", RTMP_SIG_SRS_SERVER, RTMP_SIG_SRS_LICENSE); srs_trace("contributors: %s", SRS_AUTO_CONSTRIBUTORS); - srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s", - _srs_config->cwd().c_str(), cwd.c_str(), SRS_AUTO_BUILD_DATE, SRS_AUTO_USER_CONFIGURE, SRS_AUTO_UNAME); + srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s, osx: %d", + _srs_config->cwd().c_str(), cwd.c_str(), SRS_AUTO_BUILD_DATE, SRS_AUTO_USER_CONFIGURE, SRS_AUTO_UNAME, SRS_AUTO_OSX_BOOL); srs_trace("configure detail: " SRS_AUTO_CONFIGURE); #ifdef SRS_AUTO_EMBEDED_TOOL_CHAIN srs_trace("crossbuild tool chain: " SRS_AUTO_EMBEDED_TOOL_CHAIN); diff --git a/trunk/src/service/srs_service_log.cpp b/trunk/src/service/srs_service_log.cpp index af5cec2ff6..4bc0a0c2eb 100644 --- a/trunk/src/service/srs_service_log.cpp +++ b/trunk/src/service/srs_service_log.cpp @@ -46,7 +46,7 @@ int SrsThreadContext::generate_id() static int id = 0; if (id == 0) { - id = (100 + ((int)(int64_t)this)%1000); + id = (100 + ((uint32_t)(int64_t)this)%1000); } int gid = id++; diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index acfdeeff03..9f1c6cf18c 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -4208,6 +4208,7 @@ VOID TEST(KernelUtilityTest, CoverBitsBufferAll) } } +#ifndef SRS_AUTO_OSX extern _srs_gettimeofday_t _srs_gettimeofday; int mock_gettimeofday(struct timeval* /*tp*/, struct timezone* /*tzp*/) { return -1; @@ -4238,6 +4239,7 @@ VOID TEST(KernelUtilityTest, CoverTimeSpecial) EXPECT_TRUE(-1 == srs_update_system_time()); } } +#endif extern int64_t _srs_system_time_startup_time; extern int64_t _srs_system_time_us_cache;