diff --git a/libc/Makefile b/libc/Makefile index ee386fa3..4bb4859b 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -310,6 +310,7 @@ sys/mman/munmap.o \ sys/readdirents/readdirents.o \ sys/resource/getpriority.o \ sys/resource/getrlimit.o \ +sys/resource/getrusage.o \ sys/resource/prlimit.o \ sys/resource/setpriority.o \ sys/resource/setrlimit.o \ diff --git a/libc/include/sys/resource.h b/libc/include/sys/resource.h index 36b5782b..18025da4 100644 --- a/libc/include/sys/resource.h +++ b/libc/include/sys/resource.h @@ -32,9 +32,22 @@ __BEGIN_DECLS @include(id_t.h) @include(pid_t.h) +@include(time_t.h) +@include(suseconds_t.h) +@include(timeval.h) + +#define RUSAGE_SELF 0 +#define RUSAGE_CHILDREN 1 + +struct rusage +{ + struct timeval ru_utime; + struct timeval ru_stime; +}; int getpriority(int, id_t); int getrlimit(int, struct rlimit*); +int getrusage(int, struct rusage*); int prlimit(pid_t, int, const struct rlimit*, struct rlimit*); int setpriority(int, id_t, int); int setrlimit(int, const struct rlimit*); diff --git a/libc/sys/resource/getrusage.cpp b/libc/sys/resource/getrusage.cpp new file mode 100644 index 00000000..08646228 --- /dev/null +++ b/libc/sys/resource/getrusage.cpp @@ -0,0 +1,58 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + sys/resource/getrusage.cpp + Get resource usage statistics. + +*******************************************************************************/ + +#include +#include + +#include +#include +#include + +static struct timeval timeval_of_timespec(struct timespec ts) +{ + struct timeval tv; + tv.tv_sec = ts.tv_sec; + tv.tv_usec = ts.tv_nsec / 1000; + return tv; +} + +extern "C" int getrusage(int who, struct rusage* usage) +{ + struct tmns tmns; + if ( timens(&tmns) != 0 ) + return -1; + if ( who == RUSAGE_SELF ) + { + usage->ru_utime = timeval_of_timespec(tmns.tmns_utime); + usage->ru_stime = timeval_of_timespec(tmns.tmns_stime); + } + else if ( who == RUSAGE_CHILDREN ) + { + usage->ru_utime = timeval_of_timespec(tmns.tmns_cutime); + usage->ru_stime = timeval_of_timespec(tmns.tmns_cstime); + } + else + return errno = EINVAL, -1; + return 0; +}