You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
3.3 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2006 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * This program is free software; you can redistribute it and/or modify *
  6. * it under the terms of the GNU General Public License as published by *
  7. * the Free Software Foundation; either version 2 of the License, or *
  8. * (at your option) any later version. *
  9. * *
  10. * This program is distributed in the hope that it will be useful, *
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  13. * GNU General Public License for more details. *
  14. * *
  15. * You should have received a copy of the GNU General Public License *
  16. * along with this program; if not, write to the *
  17. * Free Software Foundation, Inc., *
  18. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  19. ***************************************************************************/
  20. #ifdef HAVE_CONFIG_H
  21. #include "config.h"
  22. #endif
  23. #include "time_support.h"
  24. #include "log.h"
  25. #include <stdlib.h>
  26. #include <sys/time.h>
  27. #include <time.h>
  28. int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y);
  29. int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y);
  30. int timeval_add_time(struct timeval *result, int sec, int usec);
  31. /* calculate difference between two struct timeval values */
  32. int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y)
  33. {
  34. if (x->tv_usec < y->tv_usec)
  35. {
  36. int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
  37. y->tv_usec -= 1000000 * nsec;
  38. y->tv_sec += nsec;
  39. }
  40. if (x->tv_usec - y->tv_usec > 1000000) {
  41. int nsec = (x->tv_usec - y->tv_usec) / 1000000;
  42. y->tv_usec += 1000000 * nsec;
  43. y->tv_sec -= nsec;
  44. }
  45. result->tv_sec = x->tv_sec - y->tv_sec;
  46. result->tv_usec = x->tv_usec - y->tv_usec;
  47. /* Return 1 if result is negative. */
  48. return x->tv_sec < y->tv_sec;
  49. }
  50. /* add two struct timeval values */
  51. int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y)
  52. {
  53. result->tv_sec = x->tv_sec + y->tv_sec;
  54. result->tv_usec = x->tv_usec + y->tv_usec;
  55. while (result->tv_usec > 1000000)
  56. {
  57. result->tv_usec -= 1000000;
  58. result->tv_sec++;
  59. }
  60. return 0;
  61. }
  62. int timeval_add_time(struct timeval *result, int sec, int usec)
  63. {
  64. result->tv_sec += sec;
  65. result->tv_usec += usec;
  66. while (result->tv_usec > 1000000)
  67. {
  68. result->tv_usec -= 1000000;
  69. result->tv_sec++;
  70. }
  71. return 0;
  72. }
  73. int duration_start_measure(duration_t *duration)
  74. {
  75. gettimeofday(&duration->start, NULL);
  76. return ERROR_OK;
  77. }
  78. int duration_stop_measure(duration_t *duration, char **text)
  79. {
  80. struct timeval end;
  81. gettimeofday(&end, NULL);
  82. timeval_subtract(&duration->duration, &end, &duration->start);
  83. if (text)
  84. {
  85. *text = malloc(16);
  86. snprintf(*text, 16, "%lis %lius", duration->duration.tv_sec, duration->duration.tv_usec);
  87. }
  88. return ERROR_OK;
  89. }