/**************************************************************************/ /* */ /* OCaml */ /* */ /* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 1996 Institut National de Recherche en Informatique et */ /* en Automatique. */ /* */ /* All rights reserved. This file is distributed under the terms of */ /* the GNU Lesser General Public License version 2.1, with the */ /* special exception on linking described in the file LICENSE. */ /* */ /**************************************************************************/ #define CAML_INTERNALS #include #include #include #include "caml/unixsupport.h" #include #include #include #ifdef HAS_GETRUSAGE #include #include #endif CAMLprim value caml_unix_times(value unit) { #ifdef HAS_GETRUSAGE value res; struct rusage ru; res = caml_alloc_small(4 * Double_wosize, Double_array_tag); getrusage (RUSAGE_SELF, &ru); Store_double_flat_field(res, 0, ru.ru_utime.tv_sec + (double) ru.ru_utime.tv_usec / USEC_PER_SEC); Store_double_flat_field(res, 1, ru.ru_stime.tv_sec + (double) ru.ru_stime.tv_usec / USEC_PER_SEC); getrusage (RUSAGE_CHILDREN, &ru); Store_double_flat_field(res, 2, ru.ru_utime.tv_sec + (double) ru.ru_utime.tv_usec / USEC_PER_SEC); Store_double_flat_field(res, 3, ru.ru_stime.tv_sec + (double) ru.ru_stime.tv_usec / USEC_PER_SEC); return res; #else #ifndef CLK_TCK #ifdef HZ #define CLK_TCK HZ #else #define CLK_TCK 60 #endif #endif value res; struct tms buffer; times(&buffer); res = caml_alloc_small(4 * Double_wosize, Double_array_tag); Store_double_flat_field(res, 0, (double) buffer.tms_utime / CLK_TCK); Store_double_flat_field(res, 1, (double) buffer.tms_stime / CLK_TCK); Store_double_flat_field(res, 2, (double) buffer.tms_cutime / CLK_TCK); Store_double_flat_field(res, 3, (double) buffer.tms_cstime / CLK_TCK); return res; #endif }