Home » U++ Library support » U++ Library : Other (not classified elsewhere) » thread bug....and fix 
	
		
		
			| thread bug....and fix [message #52160] | 
			Tue, 30 July 2019 14:53   | 
		 
		
			
				
				
				
					
						  
						aftershock
						 Messages: 143 Registered: May 2008 
						
					 | 
					Experienced Member  | 
					 | 
		 
		 
	 | 
 
	
		Hi, 
Bug report. 
It seems that 
handle can be 0 at unexpected places, 
So I added additional checks for that to fix. 
See added lines. 
Wait function got stuck at WaitForSingleObject when handle was 0. 
int Thread::Wait()
{
	if(!IsOpen())
		return -1;
	int out;
#ifdef PLATFORM_WIN32
	dword exit;
	if(!GetExitCodeThread(handle, &exit))
		return -1;
	if(exit != STILL_ACTIVE)
		out = (int)exit;
	else
	{
		if (!IsOpen())  // ADDED THIS LINE
		   return Null;	
		if(WaitForSingleObject(handle, INFINITE) != WAIT_OBJECT_0)
			return Null;
		if (!IsOpen()) // ADDED THIS LINE
		   return Null;	
		out = GetExitCodeThread(handle, &exit) ? int(exit) : int(Null);
	}
	Detach();
#endif
#ifdef PLATFORM_POSIX
	void *thread_return;
	if(pthread_join(handle, &thread_return))
		out = Null;
	else
		out = (int)(intptr_t)thread_return;
	handle = 0;
#endif
	return out;
} 
		
		
		[Updated on: Wed, 31 July 2019 12:55] Report message to a moderator  
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	| 
		
 |  
	
		
		
			| Re: thread bug....and fix [message #52177 is a reply to message #52169] | 
			Fri, 02 August 2019 11:34    | 
		 
		
			
				
				
				  | 
					
						  
						mirek
						 Messages: 14271 Registered: November 2005 
						
					 | 
					Ultimate Member  | 
					 | 
		 
		 
	 | 
 
	
		aftershock wrote on Wed, 31 July 2019 12:57It is where I added the lines. 
 GetExitCodeThread(handle.... 
handle was 0 in the debugger. 
Application Verifier... detected those things. 
 
  
 
I mean, what is your code? 
 
Somehow I fail to grasp how calling Wait with NULL handle could have happened. 
 
To be more specific, as long as there is no catastrophic failure of client code, handle can get 0 in 3 ways: 
 
- thread creation fails. Why do you call Wait in that case? 
- Detach is called. Why do you call Wait in that case? 
- no attempt to start thread (default constructor). Why do you call Wait in that case? 
 
So I am really curious what has happened here. In other words, if above patch is really fixing something, then this requires much more careful investigation because it would mean many things are not what they should be..... 
 
(Ideally, testcase package demonstrating the problem would be welcome). 
 
 
Mirek
		
		
		[Updated on: Fri, 02 August 2019 11:40] Report message to a moderator  
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	| 
		
 |   
Goto Forum:
 
 Current Time: Tue Nov 04 03:44:13 CET 2025 
 Total time taken to generate the page: 0.07385 seconds 
 |