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.
 
 
 
 
 
 

109 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 <sys/time.h>
  26. #include <time.h>
  27. int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y);
  28. int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y);
  29. int timeval_add_time(struct timeval *result, int sec, int usec);
  30. /* calculate difference between two struct timeval values */
  31. int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y)
  32. {
  33. if (x->tv_usec < y->tv_usec)
  34. {
  35. int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
  36. y->tv_usec -= 1000000 * nsec;
  37. y->tv_sec += nsec;
  38. }
  39. if (x->tv_usec - y->tv_usec > 1000000) {
  40. int nsec = (x->tv_usec - y->tv_usec) / 1000000;
  41. y->tv_usec += 1000000 * nsec;
  42. y->tv_sec -= nsec;
  43. }
  44. result->tv_sec = x->tv_sec - y->tv_sec;
  45. result->tv_usec = x->tv_usec - y->tv_usec;
  46. /* Return 1 if result is negative. */
  47. return x->tv_sec < y->tv_sec;
  48. }
  49. /* add two struct timeval values */
  50. int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y)
  51. {
  52. result->tv_sec = x->tv_sec + y->tv_sec;
  53. result->tv_usec = x->tv_usec + y->tv_usec;
  54. while (result->tv_usec > 1000000)
  55. {
  56. result->tv_usec -= 1000000;
  57. result->tv_sec++;
  58. }
  59. return 0;
  60. }
  61. int timeval_add_time(struct timeval *result, int sec, int usec)
  62. {
  63. result->tv_sec += sec;
  64. result->tv_usec += usec;
  65. while (result->tv_usec > 1000000)
  66. {
  67. result->tv_usec -= 1000000;
  68. result->tv_sec++;
  69. }
  70. return 0;
  71. }
  72. int duration_start_measure(duration_t *duration)
  73. {
  74. gettimeofday(&duration->start, NULL);
  75. return ERROR_OK;
  76. }
  77. int duration_stop_measure(duration_t *duration, char **text)
  78. {
  79. struct timeval end;
  80. gettimeofday(&end, NULL);
  81. timeval_subtract(&duration->duration, &end, &duration->start);
  82. if (text)
  83. {
  84. *text = malloc(16);
  85. snprintf(*text, 16, "%is %ius", duration->duration.tv_sec, duration->duration.tv_usec);
  86. }
  87. return ERROR_OK;
  88. }