add docu and prototype for find_value()
[libfirm] / ir / ana2 / timing.c
1 /* -*- c -*- */
2
3 /*
4  * Time-stamp: <26.10.2004 11:57:13h liekweg>
5  * Project:     libFIRM
6  * File name:   ir/ana2/timing.c
7  * Purpose:     generic timing routines
8  * Author:      Florian
9  * Modified by:
10  * Created:     Mon 18 Oct 2004
11  * CVS-ID:      $Id$
12  * Copyright:   (c) 1999-2004 Universität Karlsruhe
13  * Licence:     This file is protected by GPL -  GNU GENERAL PUBLIC LICENSE.
14  */
15
16 /*
17   Timing stuff.  Not really part of ana2, but where else should it go.
18 */
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include "timing.h"
27 #include "xmalloc.h"
28
29 struct timing_env
30 {
31   struct timeval *start;
32   struct timeval *end;
33 };
34
35 #ifdef _WIN32
36 /* no support yet */
37 timing_t *start_timing (void) {}
38 int end_timing (timing_t *t) {}
39
40 #else
41 #include <sys/time.h>
42
43
44 /*
45 Helpers
46 */
47 static int
48 timeval_subtract (struct timeval *x, struct timeval *y)
49 {
50   /* Perform the carry for the later subtraction by updating Y. */
51   if (x->tv_usec < y->tv_usec) {
52     int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
53     y->tv_usec -= 1000000 * nsec;
54     y->tv_sec += nsec;
55   }
56
57   if (x->tv_usec - y->tv_usec > 1000000) {
58     int nsec = (x->tv_usec - y->tv_usec) / 1000000;
59     y->tv_usec += 1000000 * nsec;
60     y->tv_sec -= nsec;
61   }
62
63   return ((x->tv_sec - y->tv_sec) * 1000000 + (x->tv_usec - y->tv_usec));
64 }
65
66
67 /*
68   Public Interface
69 */
70 timing_t *
71 start_timing (void)
72 {
73   timing_t *t = (timing_t*) xmalloc (sizeof (timing_t));
74
75   t->start = (struct timeval*) xmalloc (sizeof (struct timeval));
76   t->end   = (struct timeval*) xmalloc (sizeof (struct timeval));
77
78   gettimeofday (t->start, NULL);
79
80   return (t);
81 }
82
83 int
84 end_timing (timing_t *t)
85 {
86   int time;
87
88   gettimeofday (t->end, NULL);
89
90   time = timeval_subtract (t->end, t->start);
91
92   memset (t->start, 0x0, sizeof (struct timeval));
93   free (t->start);
94
95   memset (t->end,   0x0, sizeof (struct timeval));
96   free (t->end);
97
98   memset (t, 0x00, sizeof (timing_t));
99   free (t);
100
101   return (time);
102 }
103 #endif /* _WIN32 */
104
105
106 /*
107   $Log$
108   Revision 1.5  2006/09/12 12:17:37  matze
109   more warning fixes
110
111   Revision 1.4  2006/06/06 12:06:27  beck
112   use xmalloc instead of malloc
113
114   Revision 1.3  2005/01/05 14:25:38  beck
115   added Win32 "support"
116
117   Revision 1.2  2004/12/21 15:52:23  beck
118   moved struct timing_env to .c file, added config.h
119
120   Revision 1.1  2004/10/29 18:55:52  liekweg
121   (mostly) generic timimg
122 */