portability: replace signalfd with self-pipe
This commit is contained in:
		
							parent
							
								
									7da9aad117
								
							
						
					
					
						commit
						97176b3a10
					
				| @ -40,6 +40,7 @@ extern wl_shm* shm; | |||||||
| extern zwlr_layer_shell_v1* wlrLayerShell; | extern zwlr_layer_shell_v1* wlrLayerShell; | ||||||
| 
 | 
 | ||||||
| void spawn(Monitor&, const Arg& arg); | void spawn(Monitor&, const Arg& arg); | ||||||
|  | void setCloexec(int fd); | ||||||
| [[noreturn]] void die(const char* why); | [[noreturn]] void die(const char* why); | ||||||
| 
 | 
 | ||||||
| // wayland smart pointers
 | // wayland smart pointers
 | ||||||
|  | |||||||
							
								
								
									
										50
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								src/main.cpp
									
									
									
									
									
								
							| @ -12,7 +12,6 @@ | |||||||
| #include <signal.h> | #include <signal.h> | ||||||
| #include <sys/epoll.h> | #include <sys/epoll.h> | ||||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||||
| #include <sys/signalfd.h> |  | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| @ -81,6 +80,7 @@ static Monitor* selmon; | |||||||
| static std::string lastStatus; | static std::string lastStatus; | ||||||
| static std::string statusFifoName; | static std::string statusFifoName; | ||||||
| static int epoll {-1}; | static int epoll {-1}; | ||||||
|  | static std::array<int, 2> signalSelfPipe; | ||||||
| static int displayFd {-1}; | static int displayFd {-1}; | ||||||
| static int statusFifoFd {-1}; | static int statusFifoFd {-1}; | ||||||
| static int statusFifoWriter {-1}; | static int statusFifoWriter {-1}; | ||||||
| @ -452,11 +452,25 @@ int main(int argc, char* argv[]) | |||||||
| 				exit(0); | 				exit(0); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	static sigset_t blockedsigs; | 	 | ||||||
| 	sigemptyset(&blockedsigs); | 	if (pipe(signalSelfPipe.data()) < 0) { | ||||||
| 	sigaddset(&blockedsigs, SIGINT); | 		diesys("pipe"); | ||||||
| 	sigaddset(&blockedsigs, SIGTERM); | 	} | ||||||
| 	sigprocmask(SIG_BLOCK, &blockedsigs, nullptr); | 	setCloexec(signalSelfPipe[0]); | ||||||
|  | 	setCloexec(signalSelfPipe[1]); | ||||||
|  | 
 | ||||||
|  | 	struct sigaction sighandler = {}; | ||||||
|  | 	sighandler.sa_handler = [](int) { | ||||||
|  | 		if (write(signalSelfPipe[1], "0", 1) < 0) { | ||||||
|  | 			diesys("write"); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 	if (sigaction(SIGTERM, &sighandler, nullptr) < 0) { | ||||||
|  | 		diesys("sigaction"); | ||||||
|  | 	} | ||||||
|  | 	if (sigaction(SIGINT, &sighandler, nullptr) < 0) { | ||||||
|  | 		diesys("sigaction"); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	epoll_event epollEv = {0}; | 	epoll_event epollEv = {0}; | ||||||
| 	std::array<epoll_event, 5> epollEvents; | 	std::array<epoll_event, 5> epollEvents; | ||||||
| @ -464,14 +478,11 @@ int main(int argc, char* argv[]) | |||||||
| 	if (epoll < 0) { | 	if (epoll < 0) { | ||||||
| 		diesys("epoll_create1"); | 		diesys("epoll_create1"); | ||||||
| 	} | 	} | ||||||
| 	int sfd = signalfd(-1, &blockedsigs, SFD_CLOEXEC | SFD_NONBLOCK); | 
 | ||||||
| 	if (sfd < 0) { |  | ||||||
| 		diesys("signalfd"); |  | ||||||
| 	} |  | ||||||
| 	epollEv.events = EPOLLIN; | 	epollEv.events = EPOLLIN; | ||||||
| 	epollEv.data.fd = sfd; | 	epollEv.data.fd = signalSelfPipe[0]; | ||||||
| 	if (epoll_ctl(epoll, EPOLL_CTL_ADD, sfd, &epollEv) < 0) { | 	if (epoll_ctl(epoll, EPOLL_CTL_ADD, signalSelfPipe[0], &epollEv) < 0) { | ||||||
| 		diesys("epoll_ctl add signalfd"); | 		diesys("epoll_ctl add signal pipe"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	display = wl_display_connect(nullptr); | 	display = wl_display_connect(nullptr); | ||||||
| @ -525,7 +536,7 @@ int main(int argc, char* argv[]) | |||||||
| 					onStdin(); | 					onStdin(); | ||||||
| 				} else if (ev.data.fd == statusFifoFd) { | 				} else if (ev.data.fd == statusFifoFd) { | ||||||
| 					onStatus(); | 					onStatus(); | ||||||
| 				} else if (ev.data.fd == sfd) { | 				} else if (ev.data.fd == signalSelfPipe[0]) { | ||||||
| 					quitting = true; | 					quitting = true; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| @ -555,6 +566,17 @@ void waylandFlush() | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void setCloexec(int fd) | ||||||
|  | { | ||||||
|  | 	int flags = fcntl(fd, F_GETFD); | ||||||
|  | 	if (flags == -1) { | ||||||
|  | 		diesys("fcntl FD_GETFD"); | ||||||
|  | 	} | ||||||
|  | 	if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { | ||||||
|  | 		diesys("fcntl FD_SETFD"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void cleanup() { | void cleanup() { | ||||||
| 	if (!statusFifoName.empty()) { | 	if (!statusFifoName.empty()) { | ||||||
| 		unlink(statusFifoName.c_str()); | 		unlink(statusFifoName.c_str()); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user