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

@ -23,6 +23,11 @@ extern "C" {
* *
***************************************************/
/****************************************************
* Section 1 *
* Multi thread support *
****************************************************/
/**
* NOTES:
* 1. If you are building VM core only, it must be implemented to
@ -174,6 +179,116 @@ os_cond_reltimedwait(korp_cond *cond, korp_mutex *mutex, uint64 useconds);
int
os_cond_signal(korp_cond *cond);
/****************************************************
* Section 2 *
* Socket support *
****************************************************/
/**
* NOTES:
* Socket APIs are required by source debugging feature.
* If you don't need source debugging feature, then no
* need to implement these APIs
*/
/**
* Create a socket
*
* @param sock [OUTPUT] the pointer of socket
* @param tcp_or_udp 1 for tcp, 0 for udp
*
* @return 0 if success, -1 otherwise
*/
int
os_socket_create(bh_socket_t *sock, int tcp_or_udp);
/**
* Assign the address and port to the socket
*
* @param socket the socket to bind
* @param addr the ip address, only IPv4 supported currently
* @param port [INPUT/OUTPUT] the port number, if the value is 0,
* it will use a port assigned by OS. On return it will
* contain the actual bound port number
*
* @return 0 if success, -1 otherwise
*/
int
os_socket_bind(bh_socket_t socket, const char *addr, int *port);
/**
* Make the socket as a passive socket to accept incoming connection requests
*
* @param socket the socket to listen
* @param max_client maximum clients
*
* @return 0 if success, -1 otherwise
*/
int
os_socket_listen(bh_socket_t socket, int max_client);
/**
* Accept an incoming connection
*
* @param server_sock the socket to accept new connections
* @param sock [OUTPUT] the connected socket
* @param addr [OUTPUT] the address of the peer socket. If addr is NULL,
* nothing is filled in, and addrlen will not be used
* @param addrlen [INPUT/OUTPUT] the size (in bytes) of the structure
* pointed to by addr, on return it will contain the actual
* size of the peer address
*
* @return 0 if success, -1 otherwise
*/
int
os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr,
unsigned int *addrlen);
/**
* Blocking receive message from a socket.
*
* @param socket the socket to receive message from
* @param buf the buffer to store the data
* @param len length of the buffer, this API does not guarantee that
* [len] bytes are received
*
* @return number of bytes received if success, -1 otherwise
*/
int
os_socket_recv(bh_socket_t socket, void *buf, unsigned int len);
/**
* Blocking send message on a socket
*
* @param socket the socket to send message
* @param buf the buffer of data to be sent
* @param len length of the buffer
*
* @return number of bytes sent if success, -1 otherwise
*/
int
os_socket_send(bh_socket_t socket, const void *buf, unsigned int len);
/**
* Close a socket
*
* @param socket the socket to be closed
*
* @return always return 0
*/
int
os_socket_close(bh_socket_t socket);
/**
* Shutdown a socket
*
* @param socket the socket to be shutdown
*
* @return always return 0
*/
int
os_socket_shutdown(bh_socket_t socket);
#ifdef __cplusplus
}
#endif

View File

@ -104,6 +104,25 @@ typedef int64_t int64;
typedef void *(*thread_start_routine_t)(void *);
#ifndef bh_socket_t
/* If no socket defined on current platform,
give a fake definition to make the compiler happy */
#define bh_socket_t int
#endif
/* Format specifiers macros in case
they are not provided by compiler */
#ifndef __PRI64_PREFIX
#if UINTPTR_MAX == UINT64_MAX
#define __PRI64_PREFIX "l"
#define __PRIPTR_PREFIX "l"
#else
#define __PRI64_PREFIX "ll"
#define __PRIPTR_PREFIX
#endif
#endif /* #ifndef __PRI64_PREFIX */
/* Macros for printing format specifiers */
#ifndef PRId32
#define PRId32 "d"
#endif
@ -120,16 +139,6 @@ typedef void *(*thread_start_routine_t)(void *);
#define PRIX32 "X"
#endif
#ifndef __PRI64_PREFIX
#if UINTPTR_MAX == UINT64_MAX
#define __PRI64_PREFIX "l"
#define __PRIPTR_PREFIX "l"
#else
#define __PRI64_PREFIX "ll"
#define __PRIPTR_PREFIX
#endif
#endif
#ifndef PRId64
#define PRId64 __PRI64_PREFIX "d"
#endif
@ -142,10 +151,40 @@ typedef void *(*thread_start_routine_t)(void *);
#ifndef PRIX64
#define PRIX64 __PRI64_PREFIX "X"
#endif
#ifndef PRIxPTR
#define PRIxPTR __PRIPTR_PREFIX "x"
#endif
#ifndef PRIXPTR
#define PRIXPTR __PRIPTR_PREFIX "X"
#endif
/* Macros for scanning format specifiers */
#ifndef SCNd32
#define SCNd32 "d"
#endif
#ifndef SCNi32
#define SCNi32 "i"
#endif
#ifndef SCNu32
#define SCNu32 "u"
#endif
#ifndef SCNx32
#define SCNx32 "x"
#endif
#ifndef SCNd64
#define SCNd64 __PRI64_PREFIX "d"
#endif
#ifndef SCNu64
#define SCNu64 __PRI64_PREFIX "u"
#endif
#ifndef SCNx64
#define SCNx64 __PRI64_PREFIX "x"
#endif
#ifndef SCNxPTR
#define SCNxPTR __PRIPTR_PREFIX "x"
#endif
#ifdef __cplusplus
}
#endif