Enable source debugging feature for windows platform (#910)

- use platform independent data types in debug-engine library
- add os_socket APIs and provide windows and posix implementation
- avoid using platform related header files in non-platform layer
- use format specifiers macros for sprintf and sscanf
- change thread handle type from uint64 to korp_tid
- add lock when sending socket packet to avoid thread racing
This commit is contained in:
Xu Jun
2021-12-22 19:52:07 +08:00
committed by GitHub
parent af251e45ca
commit ccb2de35d7
21 changed files with 851 additions and 316 deletions

View File

@ -11,15 +11,27 @@ os_thread_sys_init();
void
os_thread_sys_destroy();
int
init_winsock();
void
deinit_winsock();
int
bh_platform_init()
{
if (init_winsock() != 0) {
return -1;
}
return os_thread_sys_init();
}
void
bh_platform_destroy()
{
deinit_winsock();
os_thread_sys_destroy();
}

View File

@ -26,6 +26,8 @@
#include <malloc.h>
#include <process.h>
#include <Windows.h>
#include <BaseTsd.h>
#include <winsock2.h>
#ifdef __cplusplus
extern "C" {
@ -35,12 +37,20 @@ extern "C" {
#define BH_PLATFORM_WINDOWS
#endif
#ifdef _MSC_VER
#ifndef PATH_MAX
#define PATH_MAX MAX_PATH
#endif
#endif /* #ifdef _MSC_VER */
/* Stack size of applet threads's native part. */
#define BH_APPLET_PRESERVED_STACK_SIZE (32 * 1024)
/* Default thread priority */
#define BH_THREAD_DEFAULT_PRIORITY 0
typedef SSIZE_T ssize_t;
typedef void *korp_thread;
typedef void *korp_tid;
typedef void *korp_mutex;
@ -53,6 +63,8 @@ typedef struct korp_cond {
os_thread_wait_list thread_wait_list;
} korp_cond;
#define bh_socket_t SOCKET
unsigned
os_getpagesize();
void *

View File

@ -0,0 +1,140 @@
/*
* Copyright (C) 2021 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#include "platform_api_vmcore.h"
#include "platform_api_extension.h"
/* link with Ws2_32.lib */
#pragma comment(lib, "ws2_32.lib")
static bool is_winsock_inited = false;
int
init_winsock()
{
WSADATA wsaData;
if (!is_winsock_inited) {
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
os_printf("winsock init failed");
return BHT_ERROR;
}
is_winsock_inited = true;
}
return BHT_OK;
}
void
deinit_winsock()
{
if (is_winsock_inited) {
WSACleanup();
}
}
int
os_socket_create(bh_socket_t *sock, int tcp_or_udp)
{
if (!sock) {
return BHT_ERROR;
}
if (1 == tcp_or_udp) {
*sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
}
else if (0 == tcp_or_udp) {
*sock = socket(AF_INET, SOCK_DGRAM, 0);
}
return (*sock == -1) ? BHT_ERROR : BHT_OK;
}
int
os_socket_bind(bh_socket_t socket, const char *host, int *port)
{
struct sockaddr_in addr;
int socklen, ret;
assert(host);
assert(port);
addr.sin_addr.s_addr = inet_addr(host);
addr.sin_port = htons(*port);
addr.sin_family = AF_INET;
ret = bind(socket, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0) {
goto fail;
}
socklen = sizeof(addr);
if (getsockname(socket, (void *)&addr, &socklen) == -1) {
os_printf("getsockname failed with error %d\n", WSAGetLastError());
goto fail;
}
*port = ntohs(addr.sin_port);
return BHT_OK;
fail:
return BHT_ERROR;
}
int
os_socket_listen(bh_socket_t socket, int max_client)
{
if (listen(socket, max_client) != 0) {
os_printf("socket listen failed with error %d\n", WSAGetLastError());
return BHT_ERROR;
}
return BHT_OK;
}
int
os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr,
unsigned int *addrlen)
{
struct sockaddr addr_tmp;
unsigned int len = sizeof(struct sockaddr);
*sock = accept(server_sock, (struct sockaddr *)&addr_tmp, &len);
if (*sock < 0) {
os_printf("socket accept failed with error %d\n", WSAGetLastError());
return BHT_ERROR;
}
return BHT_OK;
}
int
os_socket_recv(bh_socket_t socket, void *buf, unsigned int len)
{
return recv(socket, buf, len, 0);
}
int
os_socket_send(bh_socket_t socket, const void *buf, unsigned int len)
{
return send(socket, buf, len, 0);
}
int
os_socket_close(bh_socket_t socket)
{
closesocket(socket);
return BHT_OK;
}
int
os_socket_shutdown(bh_socket_t socket)
{
shutdown(socket, SD_BOTH);
return BHT_OK;
}