Merge pull request #1872 from shlevy/macOS-poll-fix
monitor-fds: Fix on macOS.
This commit is contained in:
		
						commit
						d26b71fda6
					
				
					 1 changed files with 23 additions and 7 deletions
				
			
		|  | @ -21,13 +21,29 @@ public: | |||
|     MonitorFdHup(int fd) | ||||
|     { | ||||
|         thread = std::thread([fd]() { | ||||
|             while (true) { | ||||
|               /* Wait indefinitely until a POLLHUP occurs. */ | ||||
|               struct pollfd fds[1]; | ||||
|               fds[0].fd = fd; | ||||
|             fds[0].events = 0; | ||||
|             if (poll(fds, 1, -1) == -1) abort(); // can't happen
 | ||||
|               /* This shouldn't be necessary, but macOS doesn't seem to
 | ||||
|                  like a zeroed out events field. | ||||
|                  See rdar://37537852.
 | ||||
|               */ | ||||
|               fds[0].events = POLLHUP; | ||||
|               auto count = poll(fds, 1, -1); | ||||
|               if (count == -1) abort(); // can't happen
 | ||||
|               /* This shouldn't happen, but can on macOS due to a bug.
 | ||||
|                  See rdar://37550628.
 | ||||
| 
 | ||||
|                  This may eventually need a delay or further | ||||
|                  coordination with the main thread if spinning proves | ||||
|                  too harmful. | ||||
|                */ | ||||
|               if (count == 0) continue; | ||||
|               assert(fds[0].revents & POLLHUP); | ||||
|               triggerInterrupt(); | ||||
|               break; | ||||
|             } | ||||
|         }); | ||||
|     }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue