diff --git a/include/uv.h b/include/uv.h index caac1bac10266fd442c562a526ba8940cd12b265..39d699bef4186a6163f681e7df48cf17caa122de 100644 --- a/include/uv.h +++ b/include/uv.h @@ -1970,7 +1970,7 @@ UV_EXTERN void* uv_loop_get_data(const uv_loop_t*); UV_EXTERN void uv_loop_set_data(uv_loop_t*, void* data); UV_EXTERN int uv_register_task_to_event(struct uv_loop_s* loop, uv_post_task func, void* handler); UV_EXTERN int uv_unregister_task_to_event(struct uv_loop_s* loop); -UV_EXTERN int uv_check_data_valid(struct uv_loop_data* data); +UV_EXTERN int uv_check_data_valid(uv_loop_t* loop); /* String utilities needed internally for dealing with Windows. */ size_t uv_utf16_length_as_wtf8(const uint16_t* utf16, diff --git a/src/threadpool.c b/src/threadpool.c index 19acc7dd3a1a5d2452f4e87539908d80a7eae3c1..9d13120fdd3799c58f831cdb98c72c1b931672a0 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -383,15 +383,14 @@ void uv__work_submit_to_eventloop(uv_req_t* req, struct uv__work* w, int qos) { uv_mutex_lock(&loop->wq_mutex); w->work = NULL; /* Signal uv_cancel() that the work req is done executing. */ - if (uv_check_data_valid((struct uv_loop_data*)(loop->data)) == 0) { + if (uv_check_data_valid(loop) == 0) { int status = (w->work == uv__cancelled) ? UV_ECANCELED : 0; - struct uv_loop_data* addr = (struct uv_loop_data*)((uint64_t)loop->data - - (UV_EVENT_MAGIC_OFFSET << UV_EVENT_MAGIC_OFFSETBITS)); + struct uv_loop_data* data = (struct uv_loop_data*)loop->data; uv_mutex_unlock(&loop->wq_mutex); if (req->type == UV_WORK) { - addr->post_task_func((char*)req->reserved[1], uv__task_done_wrapper, (void*)w, status, qos); + data->post_task_func((char*)req->reserved[1], uv__task_done_wrapper, (void*)w, status, qos); } else { - addr->post_task_func(NULL, uv__task_done_wrapper, (void*)w, status, qos); + data->post_task_func(NULL, uv__task_done_wrapper, (void*)w, status, qos); } } else { uv__loop_internal_fields_t* lfields = uv__get_internal_fields(loop); @@ -451,14 +450,13 @@ static int uv__work_cancel(uv_loop_t* loop, uv_req_t* req, struct uv__work* w) { uv__loop_internal_fields_t* lfields = uv__get_internal_fields(w->loop); int qos = (ffrt_qos_t)(intptr_t)req->reserved[0]; - if (uv_check_data_valid((struct uv_loop_data*)(w->loop->data)) == 0) { + if (uv_check_data_valid(w->loop) == 0) { int status = (w->work == uv__cancelled) ? UV_ECANCELED : 0; - struct uv_loop_data* addr = (struct uv_loop_data*)((uint64_t)w->loop->data - - (UV_EVENT_MAGIC_OFFSET << UV_EVENT_MAGIC_OFFSETBITS)); + struct uv_loop_data* data = (struct uv_loop_data*)w->loop->data; if (req->type == UV_WORK) { - addr->post_task_func((char*)req->reserved[1], uv__task_done_wrapper, (void*)w, status, qos); + data->post_task_func((char*)req->reserved[1], uv__task_done_wrapper, (void*)w, status, qos); } else { - addr->post_task_func(NULL, uv__task_done_wrapper, (void*)w, status, qos); + data->post_task_func(NULL, uv__task_done_wrapper, (void*)w, status, qos); } } else { uv__queue_insert_tail(&(lfields->wq_sub[qos]), &w->wq); @@ -493,7 +491,7 @@ void uv__work_done(uv_async_t* handle) { #endif #ifdef USE_OHOS_DFX - if (uv_check_data_valid((struct uv_loop_data*)(loop->data)) == 0) { + if (uv_check_data_valid(loop) == 0) { return; } uv__print_active_reqs(loop, "complete"); @@ -749,7 +747,7 @@ int uv_queue_work_with_qos(uv_loop_t* loop, STATIC_ASSERT(uv_qos_user_initiated == ffrt_qos_user_initiated); STATIC_ASSERT(uv_qos_user_interactive == ffrt_qos_user_interactive); if (qos == uv_qos_reserved) { - UV_LOGW("Invaild qos %{public}d", (int)qos); + UV_LOGW("Invalid qos %{public}d", (int)qos); return UV_EINVAL; } if (qos < ffrt_qos_background || qos > ffrt_qos_user_interactive) { @@ -800,7 +798,7 @@ int uv_queue_work_with_qos_internal(uv_loop_t* loop, STATIC_ASSERT(uv_qos_user_initiated == ffrt_qos_user_initiated); STATIC_ASSERT(uv_qos_user_interactive == ffrt_qos_user_interactive); if (qos == uv_qos_reserved) { - UV_LOGW("Invaild qos %{public}d", (int)qos); + UV_LOGW("Invalid qos %{public}d", (int)qos); return UV_EINVAL; } if (qos < ffrt_qos_background || qos > ffrt_qos_user_interactive) { diff --git a/src/timer.c b/src/timer.c index 6bae90794b1255f07cce954ecaa4c7f8e955ef39..6bb1a45b36b30e6df893a0bfaf7c48afd4049403 100644 --- a/src/timer.c +++ b/src/timer.c @@ -104,7 +104,7 @@ int uv_timer_start(uv_timer_t* handle, timer_less_than); uv__handle_start(handle); #ifdef __linux__ - if (uv_check_data_valid((struct uv_loop_data*)handle->loop->data) == 0) { + if (uv_check_data_valid(handle->loop) == 0) { uv_async_send(&handle->loop->wq_async); } #endif diff --git a/src/unix/core.c b/src/unix/core.c index 47a6ba498e67f5ea402f3e48050fdfa9b0524f2f..1a2eb5a3172089d1f08dd2e03c1fa0cdae9ed11b 100644 --- a/src/unix/core.c +++ b/src/unix/core.c @@ -1946,17 +1946,13 @@ int uv_register_task_to_event(struct uv_loop_s* loop, uv_post_task func, void* h struct uv_loop_data* data = (struct uv_loop_data*)malloc(sizeof(struct uv_loop_data)); if (data == NULL) return -1; - if ((uint64_t)data >> UV_EVENT_MAGIC_OFFSETBITS != 0x0) { - UV_LOGE("malloc address error"); - free(data); - return -1; - } (void)memset(data, 0, sizeof(struct uv_loop_data)); data->post_task_func = func; data->event_handler = handler; - data = (struct uv_loop_data*)((uint64_t)data | (UV_EVENT_MAGIC_OFFSET << UV_EVENT_MAGIC_OFFSETBITS)); loop->data = (void *)data; + uv__loop_internal_fields_t* lfields_flag = uv__get_internal_fields(loop); + lfields_flag->register_flag = 1; return 0; #else return -1; @@ -1967,13 +1963,12 @@ int uv_register_task_to_event(struct uv_loop_s* loop, uv_post_task func, void* h int uv_unregister_task_to_event(struct uv_loop_s* loop) { #if defined(__aarch64__) - if (loop == NULL || loop->data == NULL || - ((uint64_t)loop->data >> UV_EVENT_MAGIC_OFFSETBITS) != (uint64_t)(UV_EVENT_MAGIC_OFFSET)) + uv__loop_internal_fields_t* lfields_flag = uv__get_internal_fields(loop); + if (loop == NULL || loop->data == NULL || lfields_flag->register_flag == 0) return -1; - loop->data = (struct uv_loop_data*)((uint64_t)loop->data - - (UV_EVENT_MAGIC_OFFSET << UV_EVENT_MAGIC_OFFSETBITS)); free(loop->data); loop->data = NULL; + lfields_flag->register_flag = 0; return 0; #else return -1; @@ -1981,14 +1976,14 @@ int uv_unregister_task_to_event(struct uv_loop_s* loop) } -int uv_check_data_valid(struct uv_loop_data* data) { +int uv_check_data_valid(uv_loop_t* loop) { #if defined(__aarch64__) - if (data == NULL || ((uint64_t)data >> UV_EVENT_MAGIC_OFFSETBITS) != (uint64_t)(UV_EVENT_MAGIC_OFFSET)) { + uv__loop_internal_fields_t* lfields_flag = uv__get_internal_fields(loop); + if (loop == NULL || loop->data == NULL || lfields_flag->register_flag == 0) { return -1; } - struct uv_loop_data* addr = (struct uv_loop_data*)((uint64_t)data - - (UV_EVENT_MAGIC_OFFSET << UV_EVENT_MAGIC_OFFSETBITS)); - if (addr->post_task_func == NULL) { + + if (((struct uv_loop_data*)loop->data)->post_task_func == NULL) { UV_LOGE("post_task_func NULL"); return -1; } diff --git a/src/unix/loop.c b/src/unix/loop.c index a24c4420effd4569c6c37f79949c5f5d9094a2d6..7852461564fb63899581ede801094a4dc7300a27 100644 --- a/src/unix/loop.c +++ b/src/unix/loop.c @@ -70,6 +70,10 @@ int uv_loop_init(uv_loop_t* loop) { loop->active_handles = 0; #if defined(USE_OHOS_DFX) && defined(__aarch64__) uv__init_thread_id(loop); +#endif +#ifdef __aarch64__ + uv__loop_internal_fields_t* lfields_flag = uv__get_internal_fields(loop); + lfields_flag->register_flag = 0; #endif loop->active_reqs.count = 0; loop->nfds = 0; diff --git a/src/uv-common.h b/src/uv-common.h index dd324c113e81be291a317032027a4b9b83644c70..7319cac6e11285225a42868ec9c274471729faf4 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -457,6 +457,9 @@ struct uv__loop_internal_fields_s { #if defined(USE_OHOS_DFX) && defined(__aarch64__) unsigned int thread_id; #endif +#ifdef __aarch64__ + unsigned int register_flag; +#endif }; uint64_t uv__get_addr_tag(void* addr);