Add Zephyr RTOS support

This commit is contained in:
Tomasz Gorochowik
2019-06-24 14:16:58 +02:00
parent 2aa40212c3
commit 67cdc2b9be
2 changed files with 102 additions and 25 deletions
+100 -25
View File
@@ -162,6 +162,39 @@ mg_static_assert(sizeof(void *) >= sizeof(int), "data type size check");
#define PATH_MAX FILENAME_MAX
#endif /* __SYMBIAN32__ */
#if defined(__ZEPHYR__)
#include <time.h>
#include <zephyr.h>
#include <posix/time.h>
#include <net/socket.h>
#include <posix/pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <libc_extensions.h>
/* Max worker threads is the max of pthreads minus the main application thread
* and minus the main civetweb thread, thus -2
*/
#define MAX_WORKER_THREADS (CONFIG_MAX_PTHREAD_COUNT - 2)
#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1)
#define ZEPHYR_STACK_SIZE USE_STACK_SIZE
#else
#define ZEPHYR_STACK_SIZE 8096
#endif
K_THREAD_STACK_DEFINE(civetweb_main_stack, ZEPHYR_STACK_SIZE);
K_THREAD_STACK_ARRAY_DEFINE(civetweb_worker_stacks, MAX_WORKER_THREADS, ZEPHYR_STACK_SIZE);
static int zephyr_worker_stack_index;
#endif
#if !defined(CIVETWEB_HEADER_INCLUDED)
/* Include the header file here, so the CivetWeb interface is defined for the
@@ -260,7 +293,7 @@ __cyg_profile_func_exit(void *this_fn, void *call_site)
/* Some ANSI #includes are not available on Windows CE */
#if !defined(_WIN32_WCE)
#if !defined(_WIN32_WCE) && !defined(__ZEPHYR__)
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
@@ -375,16 +408,6 @@ _civet_safe_clock_gettime(int clk_id, struct timespec *t)
#endif
#include <ctype.h>
#include <limits.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/********************************************************************/
/* CivetWeb configuration defines */
/********************************************************************/
@@ -765,33 +788,47 @@ struct mg_pollfd {
#else /* defined(_WIN32) - WINDOWS vs UNIX include block */
#include <arpa/inet.h>
#include <inttypes.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdint.h>
#include <sys/poll.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/utsname.h>
#include <sys/wait.h>
typedef const void *SOCK_OPT_TYPE;
#if defined(ANDROID)
typedef unsigned short int in_port_t;
#endif
#if !defined(__ZEPHYR__)
#include <ctype.h>
#include <limits.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/poll.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/utsname.h>
#include <sys/wait.h>
#include <dirent.h>
#include <grp.h>
#include <pwd.h>
#include <unistd.h>
#include <pthread.h>
#endif
#define vsnprintf_impl vsnprintf
#if !defined(NO_SSL_DL) && !defined(NO_SSL)
#include <dlfcn.h>
#endif
#include <pthread.h>
#if defined(__MACH__)
#define SSL_LIB "libssl.dylib"
#define CRYPTO_LIB "libcrypto.dylib"
@@ -5871,6 +5908,11 @@ set_close_on_exec(int fd,
const struct mg_connection *conn /* may be null */,
struct mg_context *ctx /* may be null */)
{
#if defined(__ZEPHYR__)
(void) fd;
(void) conn;
(void) ctx;
#else
if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) {
if (conn || ctx) {
struct mg_connection fc;
@@ -5880,6 +5922,7 @@ set_close_on_exec(int fd,
strerror(ERRNO));
}
}
#endif
}
@@ -5893,7 +5936,9 @@ mg_start_thread(mg_thread_func_t func, void *param)
(void)pthread_attr_init(&attr);
(void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1)
#if defined(__ZEPHYR__)
pthread_attr_setstack(&attr, &civetweb_main_stack, ZEPHYR_STACK_SIZE);
#elif defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1)
/* Compile-time option to control stack size,
* e.g. -DUSE_STACK_SIZE=16384 */
(void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE);
@@ -5918,7 +5963,11 @@ mg_start_thread_with_id(mg_thread_func_t func,
(void)pthread_attr_init(&attr);
#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1)
#if defined(__ZEPHYR__)
pthread_attr_setstack(&attr,
&civetweb_worker_stacks[zephyr_worker_stack_index++],
ZEPHYR_STACK_SIZE);
#elif defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1)
/* Compile-time option to control stack size,
* e.g. -DUSE_STACK_SIZE=16384 */
(void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE);
@@ -14920,7 +14969,7 @@ check_acl(struct mg_context *phys_ctx, uint32_t remote_ip)
}
#if !defined(_WIN32)
#if !defined(_WIN32) && !defined(__ZEPHYR__)
static int
set_uid_option(struct mg_context *phys_ctx)
{
@@ -16170,6 +16219,7 @@ set_tcp_nodelay(SOCKET sock, int nodelay_on)
}
#if !defined(__ZEPHYR__)
static void
close_socket_gracefully(struct mg_connection *conn)
{
@@ -16292,6 +16342,7 @@ close_socket_gracefully(struct mg_connection *conn)
closesocket(conn->client.sock);
conn->client.sock = INVALID_SOCKET;
}
#endif
static void
@@ -16341,7 +16392,11 @@ close_connection(struct mg_connection *conn)
}
#endif
if (conn->client.sock != INVALID_SOCKET) {
#if defined(__ZEPHYR__)
closesocket(conn->client.sock);
#else
close_socket_gracefully(conn);
#endif
conn->client.sock = INVALID_SOCKET;
}
@@ -17998,12 +18053,14 @@ static unsigned __stdcall worker_thread(void *thread_func_param)
static void *
worker_thread(void *thread_func_param)
{
#if !defined(__ZEPHYR__)
struct sigaction sa;
/* Ignore SIGPIPE */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sa, NULL);
#endif
worker_thread_run((struct mg_connection *)thread_func_param);
return NULL;
@@ -18019,7 +18076,9 @@ accept_new_connection(const struct socket *listener, struct mg_context *ctx)
struct socket so;
char src_addr[IP_ADDR_STR_LEN];
socklen_t len = sizeof(so.rsa);
#if !defined(__ZEPHYR__)
int on = 1;
#endif
if ((so.sock = accept(listener->sock, &so.rsa.sa, &len))
== INVALID_SOCKET) {
@@ -18043,6 +18102,7 @@ accept_new_connection(const struct socket *listener, struct mg_context *ctx)
strerror(ERRNO));
}
#if !defined(__ZEPHYR__)
/* Set TCP keep-alive. This is needed because if HTTP-level
* keep-alive
* is enabled, and client resets the connection, server won't get
@@ -18062,6 +18122,7 @@ accept_new_connection(const struct socket *listener, struct mg_context *ctx)
__func__,
strerror(ERRNO));
}
#endif
/* Disable TCP Nagle's algorithm. Normally TCP packets are coalesced
* to effectively fill up the underlying IP packet payload and
@@ -18231,12 +18292,14 @@ static unsigned __stdcall master_thread(void *thread_func_param)
static void *
master_thread(void *thread_func_param)
{
#if !defined(__ZEPHYR__)
struct sigaction sa;
/* Ignore SIGPIPE */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sa, NULL);
#endif
master_thread_run((struct mg_context *)thread_func_param);
return NULL;
@@ -18410,6 +18473,8 @@ get_system_name(char **sysName)
#else
*sysName = mg_strdup("Symbian");
#endif
#elif defined(__ZEPHYR__)
*sysName = mg_strdup("Zephyr OS");
#else
struct utsname name;
memset(&name, 0, sizeof(name));
@@ -18625,7 +18690,7 @@ mg_start(const struct mg_callbacks *callbacks,
!init_ssl_ctx(ctx, NULL) ||
#endif
!set_ports_option(ctx) ||
#if !defined(_WIN32)
#if !defined(_WIN32) && !defined(__ZEPHYR__)
!set_uid_option(ctx) ||
#endif
!set_acl_option(ctx)) {
@@ -19036,6 +19101,16 @@ mg_get_system_info(char *buffer, int buflen)
(unsigned)si.dwNumberOfProcessors,
(unsigned)si.dwActiveProcessorMask);
system_info_length += mg_str_append(&buffer, end, block);
#elif defined(__ZEPHYR__)
mg_snprintf(NULL,
NULL,
block,
sizeof(block),
",%s\"os\" : \"%s %s\"",
eol,
"Zephyr OS",
ZEPHYR_VERSION);
system_info_length += mg_str_append(&buffer, end, block);
#else
struct utsname name;
memset(&name, 0, sizeof(name));
+2
View File
@@ -0,0 +1,2 @@
build:
cmake: .