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) |     MonitorFdHup(int fd) | ||||||
|     { |     { | ||||||
|         thread = std::thread([fd]() { |         thread = std::thread([fd]() { | ||||||
|             /* Wait indefinitely until a POLLHUP occurs. */ |             while (true) { | ||||||
|             struct pollfd fds[1]; |               /* Wait indefinitely until a POLLHUP occurs. */ | ||||||
|             fds[0].fd = fd; |               struct pollfd fds[1]; | ||||||
|             fds[0].events = 0; |               fds[0].fd = fd; | ||||||
|             if (poll(fds, 1, -1) == -1) abort(); // can't happen
 |               /* This shouldn't be necessary, but macOS doesn't seem to
 | ||||||
|             assert(fds[0].revents & POLLHUP); |                  like a zeroed out events field. | ||||||
|             triggerInterrupt(); |                  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