* Ignore interrupt signals while handling an exception.
* Ignore EINTR in reads and writes.
This commit is contained in:
		
							parent
							
								
									a9858c9f26
								
							
						
					
					
						commit
						aea436503e
					
				
					 1 changed files with 15 additions and 4 deletions
				
			
		|  | @ -305,7 +305,10 @@ void readFull(int fd, unsigned char * buf, size_t count) | |||
|     while (count) { | ||||
|         checkInterrupt(); | ||||
|         ssize_t res = read(fd, (char *) buf, count); | ||||
|         if (res == -1) throw SysError("reading from file"); | ||||
|         if (res == -1) { | ||||
|             if (errno == EINTR) continue; | ||||
|             throw SysError("reading from file"); | ||||
|         } | ||||
|         if (res == 0) throw Error("unexpected end-of-file"); | ||||
|         count -= res; | ||||
|         buf += res; | ||||
|  | @ -318,7 +321,10 @@ void writeFull(int fd, const unsigned char * buf, size_t count) | |||
|     while (count) { | ||||
|         checkInterrupt(); | ||||
|         ssize_t res = write(fd, (char *) buf, count); | ||||
|         if (res == -1) throw SysError("writing to file"); | ||||
|         if (res == -1) { | ||||
|             if (errno == EINTR) continue; | ||||
|             throw SysError("writing to file"); | ||||
|         } | ||||
|         count -= res; | ||||
|         buf += res; | ||||
|     } | ||||
|  | @ -397,6 +403,11 @@ volatile sig_atomic_t _isInterrupted = 0; | |||
| 
 | ||||
| void _interrupted() | ||||
| { | ||||
|     _isInterrupted = 0; | ||||
|     throw Error("interrupted by the user"); | ||||
|     /* Block user interrupts while an exception is being handled.
 | ||||
|        Throwing an exception while another exception is being handled | ||||
|        kills the program! */ | ||||
|     if (!uncaught_exception()) { | ||||
|         _isInterrupted = 0; | ||||
|         throw Error("interrupted by the user"); | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue