diff options
author | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2019-02-02 12:30:56 +0100 |
---|---|---|
committer | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2019-02-02 12:30:56 +0100 |
commit | d9298a35b6741a918e21e5d04e742f05b784e3ea (patch) | |
tree | 973cba3d696fc5233b5c5d379ea3655eb966b1ff /src/blogc/rusage.c | |
parent | 0325a15690b47c181bb4a39bd058de8a62fffc63 (diff) | |
download | blogc-d9298a35b6741a918e21e5d04e742f05b784e3ea.tar.gz blogc-d9298a35b6741a918e21e5d04e742f05b784e3ea.tar.bz2 blogc-d9298a35b6741a918e21e5d04e742f05b784e3ea.zip |
blogc: added template variables for memory and cpu time resource usage
this include infrastructure required to have variables evaluated as lazy
function calls.
missing tests, docs and improvements.
Diffstat (limited to 'src/blogc/rusage.c')
-rw-r--r-- | src/blogc/rusage.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/blogc/rusage.c b/src/blogc/rusage.c new file mode 100644 index 0000000..b04938e --- /dev/null +++ b/src/blogc/rusage.c @@ -0,0 +1,87 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2014-2019 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif /* HAVE_CONFIG_H */ + +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif /* HAVE_SYS_TIME_H */ + +#ifdef HAVE_SYS_RESOURCE_H +#include <sys/resource.h> +#endif /* HAVE_SYS_RESOURCE_H */ + +#include "../common/utils.h" +#include "rusage.h" + +// FIXME: optimize to use a single syscall for both cpu time and memory? + + +#include <stdio.h> +long long +blogc_rusage_get_cpu_time(void) +{ + struct rusage usage; + if (0 != getrusage(RUSAGE_SELF, &usage)) + return 0; + return ( + (usage.ru_utime.tv_sec * 1000000) + usage.ru_utime.tv_usec + + (usage.ru_stime.tv_sec * 1000000) + usage.ru_stime.tv_usec); +} + + +char* +blogc_rusage_format_cpu_time(long long time) +{ + if (time > 1000000) + return bc_strdup_printf("%.3s", ((float) time) / 1000000.0); + + // this is a special case: some systems may report the cpu time rounded up to the + // milisecond. it is useless to show ".000" in this case. + if (time > 1000) + return bc_strdup_printf("%.*fms", time % 1000 ? 3 : 0, ((float) time) / 1000.0); + + return bc_strdup_printf("%dus", time); +} + + +char* +blogc_rusage_cpu_time(void) +{ + return blogc_rusage_format_cpu_time(blogc_rusage_get_cpu_time()); +} + + +long +blogc_rusage_get_memory(void) +{ + struct rusage usage; + if (0 != getrusage(RUSAGE_SELF, &usage)) + return 0; + return usage.ru_maxrss; +} + + +char* +blogc_rusage_format_memory(long mem) +{ + if (mem > 1048576) + return bc_strdup_printf("%.3fGB", ((float) mem) / 1048576.0); + if (mem > 1024) + return bc_strdup_printf("%.3fMB", ((float) mem) / 1024.0); + return bc_strdup_printf("%dKB", mem); +} + + +char* +blogc_rusage_memory(void) +{ + return blogc_rusage_format_memory(blogc_rusage_get_memory()); +} |