root/maint/gnulib/tests/test-getrusage.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /* Test of getting resource utilization.
   2    Copyright (C) 2012-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 3 of the License, or
   7    (at your option) any later version.
   8 
   9    This program is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Bruno Haible <bruno@clisp.org>, 2012.  */
  18 
  19 #include <config.h>
  20 
  21 #include <sys/resource.h>
  22 
  23 #include "signature.h"
  24 SIGNATURE_CHECK (getrusage, int, (int, struct rusage *));
  25 
  26 #include <sys/time.h>
  27 
  28 #include "macros.h"
  29 
  30 volatile unsigned int counter;
  31 
  32 int
  33 main (void)
     /* [previous][next][first][last][top][bottom][index][help] */
  34 {
  35   struct rusage before;
  36   struct rusage after;
  37   int ret;
  38 
  39   ret = getrusage (RUSAGE_SELF, &before);
  40   ASSERT (ret == 0);
  41 
  42   /* Busy-loop for one second.  */
  43   {
  44     struct timeval t0;
  45     ASSERT (gettimeofday (&t0, NULL) == 0);
  46 
  47     for (;;)
  48       {
  49         struct timeval t;
  50         int i;
  51 
  52         for (i = 0; i < 1000000; i++)
  53           counter++;
  54 
  55         ASSERT (gettimeofday (&t, NULL) == 0);
  56         if (t.tv_sec - t0.tv_sec > 1
  57             || (t.tv_sec - t0.tv_sec == 1 && t.tv_usec >= t0.tv_usec))
  58           break;
  59       }
  60   }
  61 
  62   ret = getrusage (RUSAGE_SELF, &after);
  63   ASSERT (ret == 0);
  64 
  65   ASSERT (after.ru_utime.tv_sec >= before.ru_utime.tv_sec);
  66   ASSERT (after.ru_stime.tv_sec >= before.ru_stime.tv_sec);
  67   {
  68     /* Compute time spent during busy-looping (in usec).  */
  69     unsigned int spent_utime =
  70       (after.ru_utime.tv_sec > before.ru_utime.tv_sec
  71        ? (after.ru_utime.tv_sec - before.ru_utime.tv_sec - 1) * 1000000U
  72          + after.ru_utime.tv_usec + (1000000U - before.ru_utime.tv_usec)
  73        : after.ru_utime.tv_usec - before.ru_utime.tv_usec);
  74     unsigned int spent_stime =
  75       (after.ru_stime.tv_sec > before.ru_stime.tv_sec
  76        ? (after.ru_stime.tv_sec - before.ru_stime.tv_sec - 1) * 1000000U
  77          + after.ru_stime.tv_usec + (1000000U - before.ru_stime.tv_usec)
  78        : after.ru_stime.tv_usec - before.ru_stime.tv_usec);
  79 
  80     ASSERT (spent_utime + spent_stime <= 2 * 1000000U);
  81     /* Assume that the load during this busy-looping was less than 100.  */
  82     ASSERT (spent_utime + spent_stime > 10000U);
  83   }
  84 
  85   return 0;
  86 }

/* [previous][next][first][last][top][bottom][index][help] */