mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 04:32:44 +00:00 
			
		
		
		
	 f2c0e55070
			
		
	
	
		f2c0e55070
		
	
	
	
	
		
			
			Add a trivial CSafeSyscall template that calls a callback until it stops returning EINTR, and use it everywhere we use select() now. Thanks to Andreas for the suggestion of using a template parameter for the syscall function to invoke.
		
			
				
	
	
		
			25 lines
		
	
	
	
		
			556 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			25 lines
		
	
	
	
		
			556 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <errno.h>
 | |
| #include <unistd.h>
 | |
| #include <sys/types.h>
 | |
| #include <AK/StdLibExtras.h>
 | |
| 
 | |
| namespace CSyscallUtils {
 | |
| 
 | |
| template <typename Syscall, class... Args>
 | |
| inline int safe_syscall(Syscall syscall, Args&& ... args) {
 | |
|     for (;;) {
 | |
|         int sysret = syscall(forward<Args>(args)...);
 | |
|         if (sysret == -1) {
 | |
|             dbgprintf("CSafeSyscall: %d (%d: %s)\n", sysret, errno, strerror(errno));
 | |
|             if (errno == EINTR)
 | |
|                 continue;
 | |
|             ASSERT_NOT_REACHED();
 | |
|         }
 | |
|         return sysret;
 | |
|     }
 | |
| }
 | |
| 
 | |
| }
 | |
| 
 |