Merge pull request #1392 from bytecodealliance/main

Merge main into dev/socket
This commit is contained in:
Wenyong Huang
2022-08-20 12:31:10 +08:00
committed by GitHub
209 changed files with 26189 additions and 1212 deletions

View File

@ -43,6 +43,17 @@ os_mmap(void *hint, size_t size, int prot, int flags)
/* integer overflow */
return NULL;
#if WASM_ENABLE_JIT != 0
/**
* Allocate memory at the highest possible address if the
* request size is large, or LLVM JIT might report error:
* IMAGE_REL_AMD64_ADDR32NB relocation requires an ordered
* section layout.
*/
if (request_size > 10 * BH_MB)
alloc_type |= MEM_TOP_DOWN;
#endif
protect = access_to_win32_flags(prot);
if (protect != PAGE_NOACCESS) {
alloc_type |= MEM_COMMIT;

View File

@ -37,6 +37,10 @@ typedef struct os_thread_data {
korp_mutex wait_lock;
/* Waiting list of other threads who are joining this thread */
os_thread_wait_list thread_wait_list;
/* Whether the thread has exited */
bool thread_exited;
/* Thread return value */
void *thread_retval;
} os_thread_data;
static bool is_thread_sys_inited = false;
@ -44,6 +48,9 @@ static bool is_thread_sys_inited = false;
/* Thread data of supervisor thread */
static os_thread_data supervisor_thread_data;
/* Thread data list lock */
static korp_mutex thread_data_list_lock;
/* Thread data key */
static DWORD thread_data_key;
@ -90,7 +97,10 @@ os_thread_sys_init()
if (!TlsSetValue(thread_data_key, &supervisor_thread_data))
goto fail4;
if ((module = GetModuleHandle((LPSTR) "kernel32"))) {
if (os_mutex_init(&thread_data_list_lock) != BHT_OK)
goto fail5;
if ((module = GetModuleHandle((LPCTSTR) "kernel32"))) {
*(void **)&GetCurrentThreadStackLimits_Kernel32 =
GetProcAddress(module, "GetCurrentThreadStackLimits");
}
@ -98,6 +108,8 @@ os_thread_sys_init()
is_thread_sys_inited = true;
return BHT_OK;
fail5:
TlsSetValue(thread_data_key, NULL);
fail4:
os_cond_destroy(&supervisor_thread_data.wait_cond);
fail3:
@ -113,6 +125,22 @@ void
os_thread_sys_destroy()
{
if (is_thread_sys_inited) {
os_thread_data *thread_data, *thread_data_next;
thread_data = supervisor_thread_data.next;
while (thread_data) {
thread_data_next = thread_data->next;
/* Destroy resources of thread data */
os_cond_destroy(&thread_data->wait_cond);
os_sem_destroy(&thread_data->wait_node.sem);
os_mutex_destroy(&thread_data->wait_lock);
BH_FREE(thread_data);
thread_data = thread_data_next;
}
os_mutex_destroy(&thread_data_list_lock);
os_cond_destroy(&supervisor_thread_data.wait_cond);
os_mutex_destroy(&supervisor_thread_data.wait_lock);
os_sem_destroy(&supervisor_thread_data.wait_node.sem);
@ -148,13 +176,10 @@ os_thread_cleanup(void *retval)
}
thread_data->thread_wait_list = NULL;
}
/* Set thread status and thread return value */
thread_data->thread_exited = true;
thread_data->thread_retval = retval;
os_mutex_unlock(&thread_data->wait_lock);
/* Destroy resources */
os_cond_destroy(&thread_data->wait_cond);
os_sem_destroy(&thread_data->wait_node.sem);
os_mutex_destroy(&thread_data->wait_lock);
BH_FREE(thread_data);
}
static unsigned __stdcall os_thread_wrapper(void *arg)
@ -224,6 +249,13 @@ os_thread_create_with_prio(korp_tid *p_tid, thread_start_routine_t start,
os_mutex_unlock(&parent->wait_lock);
goto fail4;
}
/* Add thread data into thread data list */
os_mutex_lock(&thread_data_list_lock);
thread_data->next = supervisor_thread_data.next;
supervisor_thread_data.next = thread_data;
os_mutex_unlock(&thread_data_list_lock);
/* Wait for the thread routine to set thread_data's tid
and add thread_data to thread data list */
os_cond_wait(&parent->wait_cond, &parent->wait_lock);
@ -271,6 +303,16 @@ os_thread_join(korp_tid thread, void **p_retval)
bh_assert(thread_data);
os_mutex_lock(&thread_data->wait_lock);
if (thread_data->thread_exited) {
/* Thread has exited */
if (p_retval)
*p_retval = thread_data->thread_retval;
os_mutex_unlock(&thread_data->wait_lock);
return BHT_OK;
}
/* Thread is running */
if (!thread_data->thread_wait_list)
thread_data->thread_wait_list = &curr_thread_data->wait_node;
else {
@ -280,6 +322,7 @@ os_thread_join(korp_tid thread, void **p_retval)
p = p->next;
p->next = &curr_thread_data->wait_node;
}
os_mutex_unlock(&thread_data->wait_lock);
/* Wait the sem */