Support macOS OSX

pull/1684/head
winlin 5 years ago
parent b3b76b0ca6
commit c339542ce0

@ -128,6 +128,7 @@ OTHER_FLAGS = -Wall
endif endif
ifeq ($(OS), DARWIN) ifeq ($(OS), DARWIN)
EXTRA_OBJS = $(TARGETDIR)/md_darwin.o
LD = cc LD = cc
SFLAGS = -fPIC -fno-common SFLAGS = -fPIC -fno-common
DSO_SUFFIX = dylib DSO_SUFFIX = dylib
@ -139,8 +140,8 @@ CFLAGS += -arch ppc
LDFLAGS += -arch ppc LDFLAGS += -arch ppc
endif endif
ifeq ($(INTEL), yes) ifeq ($(INTEL), yes)
CFLAGS += -arch i386 -arch x86_64 CFLAGS += -arch x86_64
LDFLAGS += -arch i386 -arch x86_64 LDFLAGS += -arch x86_64
endif endif
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
@ -313,7 +314,9 @@ endif
# for SRS # for SRS
# disable examples for ubuntu crossbuild failed. # disable examples for ubuntu crossbuild failed.
# @see https://github.com/winlinvip/simple-rtmp-server/issues/308 # @see https://github.com/winlinvip/simple-rtmp-server/issues/308
ifeq ($(OS), LINUX)
EXAMPLES = EXAMPLES =
endif
ifeq ($(OS), DARWIN) ifeq ($(OS), DARWIN)
LINKNAME = libst.$(DSO_SUFFIX) LINKNAME = libst.$(DSO_SUFFIX)
@ -369,10 +372,13 @@ $(HEADER): public.h
$(TARGETDIR)/md.o: md.S $(TARGETDIR)/md.o: md.S
$(CC) $(CFLAGS) -c $< -o $@ $(CC) $(CFLAGS) -c $< -o $@
$(TARGETDIR)/md_darwin.o: md_darwin.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 $@
examples:: examples: $(SLIBRARY)
@echo Making $@ @echo Making $@
@cd $@; $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" OS="$(OS)" TARGETDIR="$(TARGETDIR)" @cd $@; $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" OS="$(OS)" TARGETDIR="$(TARGETDIR)"

@ -120,26 +120,30 @@
#define MD_ALWAYS_UNSERIALIZED_ACCEPT #define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_HAVE_SOCKLEN_T #define MD_HAVE_SOCKLEN_T
#define MD_SETJMP(env) _setjmp(env) #define MD_USE_BUILTIN_SETJMP
#define MD_LONGJMP(env, val) _longjmp(env, val)
#if defined(__ppc__) #if defined(__amd64__) || defined(__x86_64__)
#define MD_JB_SP 0 #define JB_SP 12
#elif defined(__i386__) #define MD_GET_SP(_t) *((long *)&((_t)->context[JB_SP]))
#define MD_JB_SP 9
#elif defined(__x86_64__)
#define MD_JB_SP 4
#else #else
#error Unknown CPU architecture #error Unknown CPU architecture
#endif #endif
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \ ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \ if (MD_SETJMP((_thread)->context)) \
_main(); \ _main(); \
*((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \ MD_GET_SP(_thread) = (long) (_sp); \
ST_END_MACRO 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() \ #define MD_GET_UTIME() \
struct timeval tv; \ struct timeval tv; \
(void) gettimeofday(&tv, NULL); \ (void) gettimeofday(&tv, NULL); \

@ -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

@ -137,6 +137,11 @@ if [ $SRS_CROSS_BUILD = YES ]; then
else else
srs_undefine_macro "SRS_AUTO_CROSSBUILD" $SRS_AUTO_HEADERS_H srs_undefine_macro "SRS_AUTO_CROSSBUILD" $SRS_AUTO_HEADERS_H
fi 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 # prefix
echo "" >> $SRS_AUTO_HEADERS_H echo "" >> $SRS_AUTO_HEADERS_H

@ -109,6 +109,7 @@ function Ubuntu_prepare()
if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then 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 Ubuntu_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "Install tools for ubuntu failed, ret=$ret"; exit $ret; fi
fi fi
##################################################################################### #####################################################################################
# for Centos, auto install tools by yum # for Centos, auto install tools by yum
##################################################################################### #####################################################################################
@ -182,14 +183,105 @@ function Centos_prepare()
if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then 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 Centos_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "Install tools for CentOS failed, ret=$ret"; exit $ret; fi
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 # for Centos, auto install tools by yum
##################################################################################### #####################################################################################
# We must use a bash function instead of variable. # We must use a bash function instead of variable.
function sed_utility() { function sed_utility() {
sed -i "$@" if [ $OS_IS_OSX = YES ]; then
sed -i '' "$@"
else
sed -i "$@"
fi
ret=$?; if [[ $ret -ne 0 ]]; then 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 return $ret
fi fi
} }
@ -204,7 +296,7 @@ SED="sed_utility" && echo "SED is $SED"
# directly build on arm/mips, for example, pi or cubie, # directly build on arm/mips, for example, pi or cubie,
# export srs-librtmp # export srs-librtmp
# others is invalid. # 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 if [[ $SRS_PI = NO && $SRS_CUBIE = NO && $SRS_CROSS_BUILD = NO ]]; then
echo "Your OS `uname -s` is not supported." echo "Your OS `uname -s` is not supported."
exit 1 exit 1

@ -284,18 +284,16 @@ function parse_user_option() {
--with-hls) SRS_HLS=YES ;; --with-hls) SRS_HLS=YES ;;
--with-dvr) SRS_DVR=YES ;; --with-dvr) SRS_DVR=YES ;;
--without-stream-caster) ;& --without-stream-caster) echo "ignore option \"$option\"" ;;
--without-ingest) ;& --without-ingest) echo "ignore option \"$option\"" ;;
--without-ssl) ;& --without-ssl) echo "ignore option \"$option\"" ;;
--without-stat) ;& --without-stat) echo "ignore option \"$option\"" ;;
--without-transcode) ;& --without-transcode) echo "ignore option \"$option\"" ;;
--without-http-callback) ;& --without-http-callback) echo "ignore option \"$option\"" ;;
--without-http-server) ;& --without-http-server) echo "ignore option \"$option\"" ;;
--without-http-api) ;& --without-http-api) echo "ignore option \"$option\"" ;;
--without-hls) ;& --without-hls) echo "ignore option \"$option\"" ;;
--without-dvr) --without-dvr) echo "ignore option \"$option\"" ;;
echo "ignore option \"$option\""
;;
*) *)
echo "$0: error: invalid 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 echo "For crossbuild, must not use default toolchain, cc: $SRS_TOOL_CC, cxx: $SRS_TOOL_CXX, ar: $SRS_TOOL_AR"; exit -1
fi 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 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 fi
if [[ $SRS_FFMPEG_TOOL == YES ]]; then 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 fi
# TODO: FIXME: check more os. # TODO: FIXME: check more os.

@ -30,7 +30,9 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <algorithm> #include <algorithm>
#ifndef SRS_AUTO_OSX
#include <sys/inotify.h> #include <sys/inotify.h>
#endif
using namespace std; using namespace std;
#include <srs_kernel_log.hpp> #include <srs_kernel_log.hpp>
@ -478,6 +480,7 @@ srs_error_t SrsInotifyWorker::start()
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
#ifndef SRS_AUTO_OSX
// Whether enable auto reload config. // Whether enable auto reload config.
bool auto_reload = _srs_config->inotify_auto_reload(); bool auto_reload = _srs_config->inotify_auto_reload();
if (!auto_reload && _srs_in_docker && _srs_config->auto_reload_for_docker()) { 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) { if ((err = trd->start()) != srs_success) {
return srs_error_wrap(err, "inotify"); return srs_error_wrap(err, "inotify");
} }
#endif
return err; return err;
} }
@ -556,6 +560,7 @@ srs_error_t SrsInotifyWorker::cycle()
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
#ifndef SRS_AUTO_OSX
string config_path = _srs_config->config(); string config_path = _srs_config->config();
string config_file = srs_path_basename(config_path); string config_file = srs_path_basename(config_path);
string k8s_file = "..data"; string k8s_file = "..data";
@ -595,6 +600,7 @@ srs_error_t SrsInotifyWorker::cycle()
srs_usleep(3000 * SRS_UTIME_MILLISECONDS); srs_usleep(3000 * SRS_UTIME_MILLISECONDS);
} }
#endif
return err; return err;
} }
@ -763,7 +769,7 @@ srs_error_t SrsServer::initialize_st()
if ((err = srs_st_init()) != srs_success) { if ((err = srs_st_init()) != srs_success) {
return srs_error_wrap(err, "initialize st failed"); return srs_error_wrap(err, "initialize st failed");
} }
// @remark, st alloc segment use mmap, which only support 32757 threads, // @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. // 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. // TODO: FIXME: maybe can use "sysctl vm.max_map_count" to refine.

@ -35,6 +35,9 @@
#include <sys/time.h> #include <sys/time.h>
#include <math.h> #include <math.h>
#include <map> #include <map>
#ifdef SRS_AUTO_OSX
#include <sys/sysctl.h>
#endif
using namespace std; using namespace std;
#include <srs_kernel_log.hpp> #include <srs_kernel_log.hpp>
@ -326,6 +329,7 @@ SrsProcSystemStat* srs_get_system_proc_stat()
bool get_proc_system_stat(SrsProcSystemStat& r) bool get_proc_system_stat(SrsProcSystemStat& r)
{ {
#ifndef SRS_AUTO_OSX
FILE* f = fopen("/proc/stat", "r"); FILE* f = fopen("/proc/stat", "r");
if (f == NULL) { if (f == NULL) {
srs_warn("open system cpu stat failed, ignore"); srs_warn("open system cpu stat failed, ignore");
@ -355,6 +359,7 @@ bool get_proc_system_stat(SrsProcSystemStat& r)
} }
fclose(f); fclose(f);
#endif
r.ok = true; r.ok = true;
@ -363,6 +368,7 @@ bool get_proc_system_stat(SrsProcSystemStat& r)
bool get_proc_self_stat(SrsProcSelfStat& r) bool get_proc_self_stat(SrsProcSelfStat& r)
{ {
#ifndef SRS_AUTO_OSX
FILE* f = fopen("/proc/self/stat", "r"); FILE* f = fopen("/proc/self/stat", "r");
if (f == NULL) { if (f == NULL) {
srs_warn("open self cpu stat failed, ignore"); 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); &r.guest_time, &r.cguest_time);
fclose(f); fclose(f);
#endif
r.ok = true; r.ok = true;
@ -484,6 +491,7 @@ SrsDiskStat* srs_get_disk_stat()
bool srs_get_disk_vmstat_stat(SrsDiskStat& r) bool srs_get_disk_vmstat_stat(SrsDiskStat& r)
{ {
#ifndef SRS_AUTO_OSX
FILE* f = fopen("/proc/vmstat", "r"); FILE* f = fopen("/proc/vmstat", "r");
if (f == NULL) { if (f == NULL) {
srs_warn("open vmstat failed, ignore"); srs_warn("open vmstat failed, ignore");
@ -503,6 +511,7 @@ bool srs_get_disk_vmstat_stat(SrsDiskStat& r)
} }
fclose(f); fclose(f);
#endif
r.ok = true; r.ok = true;
@ -513,13 +522,14 @@ bool srs_get_disk_diskstats_stat(SrsDiskStat& r)
{ {
r.ok = true; r.ok = true;
r.sample_time = srsu2ms(srs_get_system_time()); r.sample_time = srsu2ms(srs_get_system_time());
#ifndef SRS_AUTO_OSX
// if disabled, ignore all devices. // if disabled, ignore all devices.
SrsConfDirective* conf = _srs_config->get_stats_disk_device(); SrsConfDirective* conf = _srs_config->get_stats_disk_device();
if (conf == NULL) { if (conf == NULL) {
return true; return true;
} }
FILE* f = fopen("/proc/diskstats", "r"); FILE* f = fopen("/proc/diskstats", "r");
if (f == NULL) { if (f == NULL) {
srs_warn("open vmstat failed, ignore"); srs_warn("open vmstat failed, ignore");
@ -584,6 +594,7 @@ bool srs_get_disk_diskstats_stat(SrsDiskStat& r)
} }
fclose(f); fclose(f);
#endif
r.ok = true; r.ok = true;
@ -675,7 +686,8 @@ SrsMemInfo* srs_get_meminfo()
void srs_update_meminfo() void srs_update_meminfo()
{ {
SrsMemInfo& r = _srs_system_meminfo; SrsMemInfo& r = _srs_system_meminfo;
#ifndef SRS_AUTO_OSX
FILE* f = fopen("/proc/meminfo", "r"); FILE* f = fopen("/proc/meminfo", "r");
if (f == NULL) { if (f == NULL) {
srs_warn("open meminfo failed, ignore"); srs_warn("open meminfo failed, ignore");
@ -701,6 +713,7 @@ void srs_update_meminfo()
} }
fclose(f); fclose(f);
#endif
r.sample_time = srsu2ms(srs_get_system_time()); r.sample_time = srsu2ms(srs_get_system_time());
r.MemActive = r.MemTotal - r.MemFree; r.MemActive = r.MemTotal - r.MemFree;
@ -767,7 +780,8 @@ void srs_update_platform_info()
SrsPlatformInfo& r = _srs_system_platform_info; SrsPlatformInfo& r = _srs_system_platform_info;
r.srs_startup_time = srsu2ms(srs_get_system_startup_time()); r.srs_startup_time = srsu2ms(srs_get_system_startup_time());
#ifndef SRS_AUTO_OSX
if (true) { if (true) {
FILE* f = fopen("/proc/uptime", "r"); FILE* f = fopen("/proc/uptime", "r");
if (f == NULL) { if (f == NULL) {
@ -796,7 +810,44 @@ void srs_update_platform_info()
fclose(f); 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; r.ok = true;
} }
@ -842,6 +893,7 @@ int srs_get_network_devices_count()
void srs_update_network_devices() void srs_update_network_devices()
{ {
#ifndef SRS_AUTO_OSX
if (true) { if (true) {
FILE* f = fopen("/proc/net/dev", "r"); FILE* f = fopen("/proc/net/dev", "r");
if (f == NULL) { if (f == NULL) {
@ -878,6 +930,7 @@ void srs_update_network_devices()
fclose(f); fclose(f);
} }
#endif
} }
SrsNetworkRtmpServer::SrsNetworkRtmpServer() SrsNetworkRtmpServer::SrsNetworkRtmpServer()
@ -924,7 +977,8 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps)
int nb_tcp_total = 0; int nb_tcp_total = 0;
int nb_tcp_mem = 0; int nb_tcp_mem = 0;
int nb_udp4 = 0; int nb_udp4 = 0;
#ifndef SRS_AUTO_OSX
if (true) { if (true) {
FILE* f = fopen("/proc/net/sockstat", "r"); FILE* f = fopen("/proc/net/sockstat", "r");
if (f == NULL) { if (f == NULL) {
@ -954,9 +1008,20 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps)
fclose(f); 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; int nb_tcp_estab = 0;
#ifndef SRS_AUTO_OSX
if (true) { if (true) {
FILE* f = fopen("/proc/net/snmp", "r"); FILE* f = fopen("/proc/net/snmp", "r");
if (f == NULL) { if (f == NULL) {
@ -986,6 +1051,7 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps)
fclose(f); fclose(f);
} }
#endif
// @see: https://github.com/shemminger/iproute2/blob/master/misc/ss.c // @see: https://github.com/shemminger/iproute2/blob/master/misc/ss.c
// TODO: FIXME: ignore the slabstat, @see: get_slabstat() // TODO: FIXME: ignore the slabstat, @see: get_slabstat()

@ -124,7 +124,9 @@ srs_utime_t srs_get_system_startup_time()
} }
// For utest to mock it. // For utest to mock it.
#ifndef SRS_AUTO_OSX
_srs_gettimeofday_t _srs_gettimeofday = ::gettimeofday; _srs_gettimeofday_t _srs_gettimeofday = ::gettimeofday;
#endif
srs_utime_t srs_update_system_time() srs_utime_t srs_update_system_time()
{ {

@ -166,7 +166,11 @@ extern int srs_chunk_header_c3(int perfer_cid, uint32_t timestamp, char* cache,
// For utest to mock it. // For utest to mock it.
#include <sys/time.h> #include <sys/time.h>
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 #endif

@ -121,8 +121,8 @@ srs_error_t do_main(int argc, char** argv)
// config already applied to log. // config already applied to log.
srs_trace("%s, %s", RTMP_SIG_SRS_SERVER, RTMP_SIG_SRS_LICENSE); srs_trace("%s, %s", RTMP_SIG_SRS_SERVER, RTMP_SIG_SRS_LICENSE);
srs_trace("contributors: %s", SRS_AUTO_CONSTRIBUTORS); srs_trace("contributors: %s", SRS_AUTO_CONSTRIBUTORS);
srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s", 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_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); srs_trace("configure detail: " SRS_AUTO_CONFIGURE);
#ifdef SRS_AUTO_EMBEDED_TOOL_CHAIN #ifdef SRS_AUTO_EMBEDED_TOOL_CHAIN
srs_trace("crossbuild tool chain: " SRS_AUTO_EMBEDED_TOOL_CHAIN); srs_trace("crossbuild tool chain: " SRS_AUTO_EMBEDED_TOOL_CHAIN);

@ -46,7 +46,7 @@ int SrsThreadContext::generate_id()
static int id = 0; static int id = 0;
if (id == 0) { if (id == 0) {
id = (100 + ((int)(int64_t)this)%1000); id = (100 + ((uint32_t)(int64_t)this)%1000);
} }
int gid = id++; int gid = id++;

@ -4208,6 +4208,7 @@ VOID TEST(KernelUtilityTest, CoverBitsBufferAll)
} }
} }
#ifndef SRS_AUTO_OSX
extern _srs_gettimeofday_t _srs_gettimeofday; extern _srs_gettimeofday_t _srs_gettimeofday;
int mock_gettimeofday(struct timeval* /*tp*/, struct timezone* /*tzp*/) { int mock_gettimeofday(struct timeval* /*tp*/, struct timezone* /*tzp*/) {
return -1; return -1;
@ -4238,6 +4239,7 @@ VOID TEST(KernelUtilityTest, CoverTimeSpecial)
EXPECT_TRUE(-1 == srs_update_system_time()); EXPECT_TRUE(-1 == srs_update_system_time());
} }
} }
#endif
extern int64_t _srs_system_time_startup_time; extern int64_t _srs_system_time_startup_time;
extern int64_t _srs_system_time_us_cache; extern int64_t _srs_system_time_us_cache;

Loading…
Cancel
Save