1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

For #2532: Windows: Support CYGWIN64 for SRS (#3255)

1. Support cygwin by '--cygwin64=on'
2. Detect cygwin automatically.
3. Disalbe sanitizer, srt and srtp with openssl.
4. Disable multiple threads, use single threads.
5. Support utest for cygwin64.
6. Query features for windows by API.
7. Disable stat APIs for cygwin.
8. Use ST select event driver.

Co-authored-by: wenjie.zhao <740936897@qq.com>
This commit is contained in:
Winlin 2022-11-20 12:29:57 +08:00 committed by GitHub
parent 3d0dcb2a17
commit d741f81110
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 122 additions and 30 deletions

View file

@ -41,6 +41,8 @@ void srs_build_features(stringstream& ss)
{
if (SRS_OSX_BOOL) {
ss << "&os=mac";
} else if (SRS_CYGWIN64_BOOL) {
ss << "&os=windows";
} else {
ss << "&os=linux";
}

View file

@ -13,7 +13,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <algorithm>
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
#include <sys/inotify.h>
#endif
using namespace std;
@ -191,7 +191,7 @@ srs_error_t SrsInotifyWorker::start()
{
srs_error_t err = srs_success;
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
// 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()) {
@ -271,7 +271,7 @@ srs_error_t SrsInotifyWorker::cycle()
{
srs_error_t err = srs_success;
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
string config_path = _srs_config->config();
string config_file = srs_path_basename(config_path);
string k8s_file = "..data";

View file

@ -36,7 +36,7 @@ using namespace std;
#include <unistd.h>
#include <fcntl.h>
#ifdef SRS_OSX
#if defined(SRS_OSX) || defined(SRS_CYGWIN64)
pid_t gettid() {
return 0;
}
@ -49,7 +49,7 @@ using namespace std;
// These functions first appeared in glibc in version 2.12.
// See https://man7.org/linux/man-pages/man3/pthread_setname_np.3.html
#if defined(SRS_CROSSBUILD) && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 12))
#if defined(SRS_CYGWIN64) || (defined(SRS_CROSSBUILD) && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 12)))
void pthread_setname_np(pthread_t trd, const char* name) {
}
#endif

View file

@ -330,7 +330,7 @@ SrsProcSystemStat* srs_get_system_proc_stat()
bool get_proc_system_stat(SrsProcSystemStat& r)
{
#ifndef SRS_OSX
#if !defined(SRS_OSX)
FILE* f = fopen("/proc/stat", "r");
if (f == NULL) {
srs_warn("open system cpu stat failed, ignore");
@ -369,7 +369,7 @@ bool get_proc_system_stat(SrsProcSystemStat& r)
bool get_proc_self_stat(SrsProcSelfStat& r)
{
#ifndef SRS_OSX
#if !defined(SRS_OSX)
FILE* f = fopen("/proc/self/stat", "r");
if (f == NULL) {
srs_warn("open self cpu stat failed, ignore");
@ -493,7 +493,7 @@ SrsDiskStat* srs_get_disk_stat()
bool srs_get_disk_vmstat_stat(SrsDiskStat& r)
{
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
FILE* f = fopen("/proc/vmstat", "r");
if (f == NULL) {
srs_warn("open vmstat failed, ignore");
@ -525,7 +525,7 @@ bool srs_get_disk_diskstats_stat(SrsDiskStat& r)
r.ok = true;
r.sample_time = srsu2ms(srs_update_system_time());
#ifndef SRS_OSX
#if !defined(SRS_OSX)
// if disabled, ignore all devices.
SrsConfDirective* conf = _srs_config->get_stats_disk_device();
if (conf == NULL) {
@ -689,7 +689,7 @@ void srs_update_meminfo()
{
SrsMemInfo& r = _srs_system_meminfo;
#ifndef SRS_OSX
#if !defined(SRS_OSX)
FILE* f = fopen("/proc/meminfo", "r");
if (f == NULL) {
srs_warn("open meminfo failed, ignore");
@ -783,7 +783,7 @@ void srs_update_platform_info()
r.srs_startup_time = srsu2ms(srs_get_system_startup_time());
#ifndef SRS_OSX
#if !defined(SRS_OSX)
if (true) {
FILE* f = fopen("/proc/uptime", "r");
if (f == NULL) {
@ -877,7 +877,7 @@ static SrsSnmpUdpStat _srs_snmp_udp_stat;
bool get_udp_snmp_statistic(SrsSnmpUdpStat& r)
{
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
if (true) {
FILE* f = fopen("/proc/net/snmp", "r");
if (f == NULL) {
@ -983,7 +983,7 @@ int srs_get_network_devices_count()
void srs_update_network_devices()
{
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
if (true) {
FILE* f = fopen("/proc/net/dev", "r");
if (f == NULL) {
@ -1071,7 +1071,7 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps)
int nb_tcp_mem = 0;
int nb_udp4 = 0;
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
if (true) {
FILE* f = fopen("/proc/net/sockstat", "r");
if (f == NULL) {
@ -1119,7 +1119,7 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps)
int nb_tcp_estab = 0;
#ifndef SRS_OSX
#if !defined(SRS_OSX) && !defined(SRS_CYGWIN64)
if (true) {
FILE* f = fopen("/proc/net/snmp", "r");
if (f == NULL) {

View file

@ -6,6 +6,10 @@
#include <srs_app_uuid.hpp>
#if defined(SRS_CYGWIN64)
#define HAVE_LOFF_T
#endif
#include <unistd.h>
#include <stdio.h>
#include <sys/file.h>
@ -1082,7 +1086,9 @@ void uuid_generate(uuid_t out)
#include <string.h>
#include <sys/time.h>
#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)
#include <sys/syscall.h>
#endif
//#include "randutils.h"

View file

@ -101,6 +101,7 @@
XX(ERROR_APM_ENDPOINT , 1088, "ApmEndpoint", "APM endpoint is invalid") \
XX(ERROR_APM_AUTH , 1089, "ApmAuth", "APM team or token is invalid") \
XX(ERROR_EXPORTER_DISABLED , 1090, "ExporterDisable", "Prometheus exporter is disabled") \
XX(ERROR_ST_SET_SELECT , 1091, "StSetSelect", "ST set select failed") \
/**************************************************/
/* RTMP protocol error. */

View file

@ -48,9 +48,15 @@ srs_error_t srs_st_init()
// Select the best event system available on the OS. In Linux this is
// epoll(). On BSD it will be kqueue.
#if defined(SRS_CYGWIN64)
if (st_set_eventsys(ST_EVENTSYS_SELECT) == -1) {
return srs_error_new(ERROR_ST_SET_SELECT, "st enable st failed, current is %s", st_get_eventsys_name());
}
#else
if (st_set_eventsys(ST_EVENTSYS_ALT) == -1) {
return srs_error_new(ERROR_ST_SET_EPOLL, "st enable st failed, current is %s", st_get_eventsys_name());
}
#endif
// Before ST init, we might have already initialized the background cid.
SrsContextId cid = _srs_context->get_id();

View file

@ -5751,6 +5751,11 @@ VOID TEST(KernelUtilityTest, CoverCheckIPAddrValid)
ASSERT_TRUE(srs_check_ip_addr_valid("::"));
ASSERT_FALSE(srs_check_ip_addr_valid("256.256.256.256"));
ASSERT_FALSE(srs_check_ip_addr_valid("2001:0db8:85a3:0:0:8A2E:0370:7334:"));
#ifdef SRS_CYGWIN64
// TODO: Might be a bug for cygwin64.
ASSERT_TRUE(srs_check_ip_addr_valid("2001:0db8:85a3:0:0:8A2E:0370:7334:"));
#else
ASSERT_FALSE(srs_check_ip_addr_valid("2001:0db8:85a3:0:0:8A2E:0370:7334:"));
#endif
ASSERT_FALSE(srs_check_ip_addr_valid("1e1.4.5.6"));
}

View file

@ -870,7 +870,12 @@ VOID TEST(TCPServerTest, TCPListen)
srs_close_stfd(pfd);
srs_close_stfd(pfd2);
#ifdef SRS_CYGWIN64
// Should failed because cygwin does not support REUSE_PORT.
HELPER_EXPECT_FAILED(err2);
#else
HELPER_EXPECT_SUCCESS(err2);
#endif
}
// Typical listen.