mirror of
				https://github.com/jart/cosmopolitan.git
				synced 2025-10-28 03:44:33 +00:00 
			
		
		
		
	
							parent
							
								
									335d158ab6
								
							
						
					
					
						commit
						ec6e0fa5f4
					
				
					 8 changed files with 93 additions and 10 deletions
				
			
		|  | @ -229,6 +229,7 @@ i64 sys_pwritev(i32, const struct iovec *, i32, i64, i64) hidden; | |||
| i64 sys_read(i32, void *, u64) hidden; | ||||
| i64 sys_readlink(const char *, char *, u64) hidden; | ||||
| i64 sys_readlinkat(int, const char *, char *, u64) hidden; | ||||
| i64 sys_sched_getaffinity(i32, u64, void *) hidden; | ||||
| i64 sys_sendfile(i32, i32, i64 *, u64) hidden; | ||||
| i64 sys_splice(i32, i64 *, i32, i64 *, u64, u32) hidden; | ||||
| i64 sys_vmsplice(i32, const struct iovec *, i64, u32) hidden; | ||||
|  |  | |||
							
								
								
									
										45
									
								
								libc/calls/sched_getaffinity.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								libc/calls/sched_getaffinity.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | |||
| /*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
 | ||||
| │vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8                                :vi│ | ||||
| ╞══════════════════════════════════════════════════════════════════════════════╡ | ||||
| │ Copyright 2022 Justine Alexandra Roberts Tunney                              │ | ||||
| │                                                                              │ | ||||
| │ Permission to use, copy, modify, and/or distribute this software for         │ | ||||
| │ any purpose with or without fee is hereby granted, provided that the         │ | ||||
| │ above copyright notice and this permission notice appear in all copies.      │ | ||||
| │                                                                              │ | ||||
| │ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL                │ | ||||
| │ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED                │ | ||||
| │ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE             │ | ||||
| │ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL         │ | ||||
| │ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR        │ | ||||
| │ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER               │ | ||||
| │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR             │ | ||||
| │ PERFORMANCE OF THIS SOFTWARE.                                                │ | ||||
| ╚─────────────────────────────────────────────────────────────────────────────*/ | ||||
| #include "libc/calls/calls.h" | ||||
| #include "libc/calls/internal.h" | ||||
| #include "libc/calls/strace.internal.h" | ||||
| #include "libc/str/str.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Gets kernel scheduling for particular CPUs. | ||||
|  * | ||||
|  * @param pid is the process or thread id (or 0 for caller) | ||||
|  * @param size is byte length of bitset | ||||
|  * @param bitset receives bitset and should be uint64_t[16] in order to | ||||
|  *     work on older versions of Linux | ||||
|  * @return 0 on success, or -1 w/ errno | ||||
|  * @raise ENOSYS on non-Linux | ||||
|  */ | ||||
| int sched_getaffinity(int tid, size_t size, void *bitset) { | ||||
|   long rc; | ||||
|   rc = sys_sched_getaffinity(tid, size, bitset); | ||||
|   if (rc != -1) { | ||||
|     if (rc < size) { | ||||
|       memset((char *)bitset + rc, 0, size - rc); | ||||
|     } | ||||
|     rc = 0; | ||||
|   } | ||||
|   STRACE("sched_getaffinity(%d, %'zu, %p) → %d% m", tid, size, bitset); | ||||
|   return rc; | ||||
| } | ||||
|  | @ -19,6 +19,7 @@ | |||
| #include "libc/bits/safemacros.internal.h" | ||||
| #include "libc/calls/calls.h" | ||||
| #include "libc/calls/internal.h" | ||||
| #include "libc/calls/strace.internal.h" | ||||
| #include "libc/dce.h" | ||||
| #include "libc/limits.h" | ||||
| #include "libc/nt/enum/processaccess.h" | ||||
|  | @ -63,14 +64,18 @@ static textwindows dontinline int sys_sched_setaffinity_nt(int pid, | |||
| /**
 | ||||
|  * Asks kernel to only schedule process on particular CPUs. | ||||
|  * | ||||
|  * @param pid is the process or thread id (or 0 for caller) | ||||
|  * @param tid is the process or thread id (or 0 for caller) | ||||
|  * @param bitsetsize is byte length of bitset | ||||
|  * @return 0 on success, or -1 w/ errno | ||||
|  * @raise ENOSYS if not Linux or Windows | ||||
|  */ | ||||
| int sched_setaffinity(int pid, uint64_t bitsetsize, const void *bitset) { | ||||
| int sched_setaffinity(int tid, uint64_t bitsetsize, const void *bitset) { | ||||
|   int rc; | ||||
|   if (!IsWindows()) { | ||||
|     return sys_sched_setaffinity(pid, bitsetsize, bitset); | ||||
|     rc = sys_sched_setaffinity(tid, bitsetsize, bitset); | ||||
|   } else { | ||||
|     return sys_sched_setaffinity_nt(pid, bitsetsize, bitset); | ||||
|     rc = sys_sched_setaffinity_nt(tid, bitsetsize, bitset); | ||||
|   } | ||||
|   STRACE("sched_setaffinity(%d, %'zu, %p) → %d% m", tid, bitsetsize, bitset); | ||||
|   return rc; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue