mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:52:45 +00:00 
			
		
		
		
	Kernel: Add getrusage() syscall
Only the two timeval fields are maintained, as required by the POSIX standard.
This commit is contained in:
		
							parent
							
								
									39bfc48ea7
								
							
						
					
					
						commit
						839d3d9f74
					
				
					 5 changed files with 83 additions and 2 deletions
				
			
		
							
								
								
									
										40
									
								
								Kernel/API/POSIX/sys/resource.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								Kernel/API/POSIX/sys/resource.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2022, Lucas Chollet <lucas.chollet@free.fr> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <Kernel/API/POSIX/sys/time.h> | ||||
| #include <Kernel/API/POSIX/sys/types.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| struct rusage { | ||||
|     struct timeval ru_utime; | ||||
|     struct timeval ru_stime; | ||||
|     long ru_maxrss; | ||||
|     long ru_ixrss; | ||||
|     long ru_idrss; | ||||
|     long ru_isrss; | ||||
|     long ru_minflt; | ||||
|     long ru_majflt; | ||||
|     long ru_nswap; | ||||
|     long ru_inblock; | ||||
|     long ru_oublock; | ||||
|     long ru_msgsnd; | ||||
|     long ru_msgrcv; | ||||
|     long ru_nsignals; | ||||
|     long ru_nvcsw; | ||||
|     long ru_nivcsw; | ||||
| }; | ||||
| 
 | ||||
| #define RUSAGE_SELF 1 | ||||
| #define RUSAGE_CHILDREN 2 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | @ -100,6 +100,7 @@ enum class NeedsBigProcessLock { | |||
|     S(getrandom, NeedsBigProcessLock::No)                   \ | ||||
|     S(getresgid, NeedsBigProcessLock::Yes)                  \ | ||||
|     S(getresuid, NeedsBigProcessLock::Yes)                  \ | ||||
|     S(getrusage, NeedsBigProcessLock::Yes)                  \ | ||||
|     S(getsid, NeedsBigProcessLock::Yes)                     \ | ||||
|     S(getsockname, NeedsBigProcessLock::Yes)                \ | ||||
|     S(getsockopt, NeedsBigProcessLock::Yes)                 \ | ||||
|  |  | |||
|  | @ -249,6 +249,7 @@ set(KERNEL_SOURCES | |||
|     Syscalls/readlink.cpp | ||||
|     Syscalls/realpath.cpp | ||||
|     Syscalls/rename.cpp | ||||
|     Syscalls/resource.cpp | ||||
|     Syscalls/rmdir.cpp | ||||
|     Syscalls/sched.cpp | ||||
|     Syscalls/sendfd.cpp | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| #include <AK/Variant.h> | ||||
| #include <AK/WeakPtr.h> | ||||
| #include <AK/Weakable.h> | ||||
| #include <Kernel/API/POSIX/sys/resource.h> | ||||
| #include <Kernel/API/Syscall.h> | ||||
| #include <Kernel/Assertions.h> | ||||
| #include <Kernel/AtomicEdgeAction.h> | ||||
|  | @ -286,6 +287,7 @@ public: | |||
|     ErrorOr<FlatPtr> sys$getppid(); | ||||
|     ErrorOr<FlatPtr> sys$getresuid(Userspace<UserID*>, Userspace<UserID*>, Userspace<UserID*>); | ||||
|     ErrorOr<FlatPtr> sys$getresgid(Userspace<GroupID*>, Userspace<GroupID*>, Userspace<GroupID*>); | ||||
|     ErrorOr<FlatPtr> sys$getrusage(int, Userspace<rusage*>); | ||||
|     ErrorOr<FlatPtr> sys$umask(mode_t); | ||||
|     ErrorOr<FlatPtr> sys$open(Userspace<const Syscall::SC_open_params*>); | ||||
|     ErrorOr<FlatPtr> sys$close(int fd); | ||||
|  |  | |||
							
								
								
									
										37
									
								
								Kernel/Syscalls/resource.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Kernel/Syscalls/resource.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2022, Lucas Chollet <lucas.chollet@free.org> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #include <Kernel/Process.h> | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| ErrorOr<FlatPtr> Process::sys$getrusage(int who, Userspace<rusage*> user_usage) | ||||
| { | ||||
|     VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) | ||||
| 
 | ||||
|     rusage usage {}; | ||||
| 
 | ||||
|     auto const ticks_per_second = TimeManagement::the().ticks_per_second(); | ||||
| 
 | ||||
|     switch (who) { | ||||
|     case RUSAGE_SELF: | ||||
|         usage.ru_utime = Time::from_ticks(m_ticks_in_user, ticks_per_second).to_timeval(); | ||||
|         usage.ru_stime = Time::from_ticks(m_ticks_in_kernel, ticks_per_second).to_timeval(); | ||||
|         break; | ||||
|     case RUSAGE_CHILDREN: | ||||
|         usage.ru_utime = Time::from_ticks(m_ticks_in_user_for_dead_children, ticks_per_second).to_timeval(); | ||||
|         usage.ru_stime = Time::from_ticks(m_ticks_in_kernel_for_dead_children, ticks_per_second).to_timeval(); | ||||
|         break; | ||||
|     default: | ||||
|         return EINVAL; | ||||
|     } | ||||
| 
 | ||||
|     TRY(copy_to_user(user_usage, &usage)); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lucas CHOLLET
						Lucas CHOLLET