@@ -704,8 +704,8 @@ struct loader_impl_node_type
704704	/*  TODO: This implementation won't work for multi-isolate environments. We should test it. */ 
705705	std::thread::id js_thread_id;
706706
707- 	int64_t  base_active_handles;
708- 	std::atomic_int64_t  extra_active_handles;
707+ 	uint64_t  base_active_handles;
708+ 	std::atomic_uint64_t  extra_active_handles;
709709	uv_prepare_t  destroy_prepare;
710710	uv_check_t  destroy_check;
711711	std::atomic_bool event_loop_empty;
@@ -874,7 +874,7 @@ static void node_loader_impl_thread_log(void *data);
874874static  void  node_loader_impl_walk_async_handles_count (uv_handle_t  *handle, void  *arg);
875875#endif 
876876
877- static  int64_t  node_loader_impl_async_handles_count (loader_impl_node node_impl);
877+ static  uint64_t  node_loader_impl_async_handles_count (loader_impl_node node_impl);
878878
879879static  void  node_loader_impl_try_destroy (loader_impl_node node_impl);
880880
@@ -4346,7 +4346,7 @@ static void node_loader_impl_destroy_cb(loader_impl_node node_impl)
43464346	node_loader_impl_print_handles (node_impl);
43474347#endif 
43484348
4349- 	if  (node_impl->event_loop_empty .load () == false  && node_loader_impl_user_async_handles_count (node_impl) < = 0 )
4349+ 	if  (node_impl->event_loop_empty .load () == false  && node_loader_impl_user_async_handles_count (node_impl) = = 0 )
43504350	{
43514351		loader_impl_handle_safe_cast<uv_prepare_t > destroy_prepare_cast = { NULL  };
43524352		loader_impl_handle_safe_cast<uv_check_t > destroy_check_cast = { NULL  };
@@ -4399,7 +4399,7 @@ void node_loader_impl_destroy_safe(napi_env env, loader_impl_async_destroy_safe_
43994399	node_loader_impl_exception (env, status);
44004400
44014401	/*  Check if there are async handles, destroy if the queue is empty, otherwise request the destroy */ 
4402- 	if  (node_loader_impl_user_async_handles_count (node_impl) < = 0  || node_impl->event_loop_empty .load () == true )
4402+ 	if  (node_loader_impl_user_async_handles_count (node_impl) = = 0  || node_impl->event_loop_empty .load () == true )
44034403	{
44044404		node_loader_impl_destroy_safe_impl (node_impl, env);
44054405		destroy_safe->has_finished  = true ;
@@ -4431,7 +4431,7 @@ static inline int uv__queue_empty(const struct node_loader_impl_uv__queue *q)
44314431#if  (defined(__APPLE__) && defined(__MACH__)) || defined(__MACOSX__)
44324432void  node_loader_impl_walk_async_handles_count (uv_handle_t  *handle, void  *arg)
44334433{
4434- 	int64_t  *async_count = static_cast <int64_t  *>(arg);
4434+ 	uint64_t  *async_count = static_cast <uint64_t  *>(arg);
44354435
44364436	if  (uv_is_active (handle) && !uv_is_closing (handle))
44374437	{
@@ -4447,11 +4447,11 @@ void node_loader_impl_walk_async_handles_count(uv_handle_t *handle, void *arg)
44474447}
44484448#endif 
44494449
4450- int64_t  node_loader_impl_async_closing_handles_count (loader_impl_node node_impl)
4450+ uint64_t  node_loader_impl_async_closing_handles_count (loader_impl_node node_impl)
44514451{
44524452#if  defined(WIN32) || defined(_WIN32)
4453- 	return  (int64_t )(node_impl->thread_loop ->pending_reqs_tail  != NULL ) +
4454- 		   (int64_t )(node_impl->thread_loop ->endgame_handles  != NULL );
4453+ 	return  (uint64_t )(node_impl->thread_loop ->pending_reqs_tail  != NULL ) +
4454+ 		   (uint64_t )(node_impl->thread_loop ->endgame_handles  != NULL );
44554455#else 
44564456	union 
44574457	{
@@ -4461,49 +4461,66 @@ int64_t node_loader_impl_async_closing_handles_count(loader_impl_node node_impl)
44614461
44624462	uv__queue_cast.data  = (void  *)&node_impl->thread_loop ->pending_queue ;
44634463
4464- 	return  (int64_t )(!uv__queue_empty (uv__queue_cast.ptr )) +
4465- 		   (int64_t )(node_impl->thread_loop ->closing_handles  != NULL );
4464+ 	return  (uint64_t )(!uv__queue_empty (uv__queue_cast.ptr )) +
4465+ 		   (uint64_t )(node_impl->thread_loop ->closing_handles  != NULL );
44664466#endif 
44674467}
44684468
4469- int64_t  node_loader_impl_async_handles_count (loader_impl_node node_impl)
4469+ uint64_t  node_loader_impl_async_handles_count (loader_impl_node node_impl)
44704470{
44714471#if  (defined(__APPLE__) && defined(__MACH__)) || defined(__MACOSX__)
4472- 	int64_t  active_handles = 0 ;
4472+ 	uint64_t  active_handles = 0 ;
44734473	uv_walk (node_impl->thread_loop , node_loader_impl_walk_async_handles_count, (void  *)&active_handles);
44744474
44754475	return  active_handles +
4476- 		   (int64_t )(node_impl->thread_loop ->active_reqs .count  > 0 ) +
4476+ 		   (uint64_t )(node_impl->thread_loop ->active_reqs .count  > 0 ) +
44774477		   node_loader_impl_async_closing_handles_count (node_impl);
44784478#else 
4479- 	int64_t  active_handles = (int64_t )node_impl->thread_loop ->active_handles  +
4480- 							 ( int64_t )(node_impl->thread_loop ->active_reqs .count  > 0 ) +
4481- 							 node_loader_impl_async_closing_handles_count (node_impl);
4479+ 	uint64_t  active_handles = (uint64_t )node_impl->thread_loop ->active_handles  +
4480+ 							  ( uint64_t )(node_impl->thread_loop ->active_reqs .count  > 0 ) +
4481+ 							   node_loader_impl_async_closing_handles_count (node_impl);
44824482	return  active_handles;
44834483#endif 
44844484}
44854485
4486- int64_t  node_loader_impl_user_async_handles_count (loader_impl_node node_impl)
4486+ uint64_t  node_loader_impl_user_async_handles_count (loader_impl_node node_impl)
44874487{
4488- 	int64_t  active_handles = node_loader_impl_async_handles_count (node_impl);
4489- 	int64_t  extra_active_handles = node_impl->extra_active_handles .load ();
4488+ 	uint64_t  active_handles = node_loader_impl_async_handles_count (node_impl);
4489+ 	uint64_t  extra_active_handles = node_impl->extra_active_handles .load ();
4490+ 	uint64_t  base_active_handles = node_impl->base_active_handles ;
44904491
44914492	/*  TODO: Uncomment for debugging handles */ 
44924493	/* 
44934494#if (!defined(NDEBUG) || defined(DEBUG) || defined(_DEBUG) || defined(__DEBUG) || defined(__DEBUG__)) 
4494- 	int64_t  closing = node_loader_impl_async_closing_handles_count(node_impl); 
4495+ 	uint64_t  closing = node_loader_impl_async_closing_handles_count(node_impl); 
44954496
44964497	printf("[active_handles] - [base_active_handles] - [extra_active_handles] + [active_reqs] + [closing]\n"); 
4497- 	printf("       %" PRId64  "        -           %" PRId64  "          -            %" PRId64  "           +    %" PRId64  " [> 0]    +    %" PRId64  "\n", 
4498- 		(int64_t )node_impl->thread_loop->active_handles, 
4499- 		node_impl-> base_active_handles, 
4498+ 	printf("       %" PRIu64  "        -           %" PRIu64  "          -            %" PRIu64  "           +    %" PRIu64  " [> 0]    +    %" PRIu64  "\n", 
4499+ 		(uint64_t )node_impl->thread_loop->active_handles, 
4500+ 		base_active_handles, 
45004501		extra_active_handles, 
4501- 		(int64_t )node_impl->thread_loop->active_reqs.count, 
4502+ 		(uint64_t )node_impl->thread_loop->active_reqs.count, 
45024503		closing); 
45034504#endif 
45044505*/ 
45054506
4506- 	return  active_handles - node_impl->base_active_handles  - extra_active_handles;
4507+ 	/*  Check for overflow */ 
4508+ 	uint64_t  total_base_handles = base_active_handles + extra_active_handles;
4509+ 
4510+ 	if  (total_base_handles < base_active_handles)
4511+ 	{
4512+ 		/*  Overflow occurred */ 
4513+ 		return  UINT64_MAX;
4514+ 	}
4515+ 
4516+ 	/*  Check for underflow */ 
4517+ 	if  (active_handles < total_base_handles)
4518+ 	{
4519+ 		/*  Underflow occurred */ 
4520+ 		return  0 ;
4521+ 	}
4522+ 
4523+ 	return  active_handles - total_base_handles;
45074524}
45084525
45094526void  node_loader_impl_print_handles (loader_impl_node node_impl)
@@ -4512,8 +4529,8 @@ void node_loader_impl_print_handles(loader_impl_node node_impl)
45124529
45134530	/*  TODO: Uncomment for debugging handles */ 
45144531	/* 
4515- 	printf("Number of active handles: %" PRId64  "\n", node_loader_impl_async_handles_count(node_impl)); 
4516- 	printf("Number of user active handles: %" PRId64  "\n", node_loader_impl_user_async_handles_count(node_impl)); 
4532+ 	printf("Number of active handles: %" PRIu64  "\n", node_loader_impl_async_handles_count(node_impl)); 
4533+ 	printf("Number of user active handles: %" PRIu64  "\n", node_loader_impl_user_async_handles_count(node_impl)); 
45174534	uv_print_active_handles(node_impl->thread_loop, stdout); 
45184535	fflush(stdout); 
45194536	*/  
0 commit comments