00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include <jf/jf_config.h>
00021
00022
00023
00024
#include <jf/jf_errors.h>
00025
#include <jf/jf_timer.h>
00026
#include <jf/jf_trace.h>
00027
00028
00029
00030
00031
#ifdef JF_TRACE_MODULE
00032
# undef JF_TRACE_MODULE
00033
#endif
00034 #define JF_TRACE_MODULE JF_TRACE_MOD_LIB_TIMER
00035
00036
00037
00038 const char *
jf_feature_timer =
"feature/timer = " JF_FEATURE_TIMER_ACTIVE;
00039
00040
00041
00042 int jf_timer_reset(
jf_timer_t *t)
00043 {
00044
enum Exception { SYSCONF_ERROR
00045 , NONE
00046 , UNSUPPORTED_FUNCTION} excp;
00047
int ret_cod =
JF_RC_INTERNAL_ERROR;
00048
00049
JF_TRACE((
"jf_timer_reset\n"));
00050 TRY {
00051 t->
started =
FALSE;
00052
#ifdef JF_TIMER_AVAILABLE
00053
if (-1 == (t->
ticks_per_sec = sysconf(_SC_CLK_TCK)))
00054
THROW(SYSCONF_ERROR);
00055 t->
base_usr_time = t->
base_sys_time = t->
usr_time =
00056 t->
sys_time = 0;
00057
00058 t->
tz.tz_minuteswest = t->
tz.tz_dsttime = 0;
00059 t->
base_ela_time.tv_sec = t->
ela_time.tv_sec = 0;
00060 t->
base_ela_time.tv_usec = t->
ela_time.tv_usec = 0;
00061
00062
THROW(NONE);
00063
#else
00064
THROW(UNSUPPORTED_FUNCTION);
00065
#endif
00066 }
CATCH {
00067
switch (excp) {
00068
case SYSCONF_ERROR:
00069 ret_cod =
JF_RC_SYSCONF_ERROR;
00070
break;
00071
case NONE:
00072 ret_cod =
JF_RC_OK;
00073
break;
00074
case UNSUPPORTED_FUNCTION:
00075 ret_cod =
JF_RC_UNSUPPORTED_FUNCTION;
00076
break;
00077
default:
00078 ret_cod =
JF_RC_INTERNAL_ERROR;
00079 }
00080 }
00081
JF_TRACE((
"jf_timer_reset/excp=%d/"
00082
"ret_cod=%d/errno=%d\n", excp, ret_cod, errno));
00083
return ret_cod;
00084 }
00085
00086
00087
00088 int jf_timer_start(
jf_timer_t *t)
00089 {
00090
enum Exception { INVALID_STATUS
00091 , TIMES_ERROR
00092 , GETTIMEOFDAY_ERROR
00093 , NONE
00094 , UNSUPPORTED_FUNCTION } excp;
00095
int ret_cod =
JF_RC_INTERNAL_ERROR;
00096
00097
JF_TRACE((
"jf_timer_start\n"));
00098 TRY {
00099
#ifdef JF_TIMER_AVAILABLE
00100
struct tms tmp_tms;
00101 clock_t result;
00102
00103
if (t->
started)
00104
THROW(INVALID_STATUS);
00105
00106
if ((clock_t)-1 == (result = times(&tmp_tms)))
00107
THROW(TIMES_ERROR);
00108 t->
base_usr_time = tmp_tms.tms_utime;
00109 t->
base_sys_time = tmp_tms.tms_stime;
00110
00111
if (-1 == gettimeofday(&(t->
base_ela_time), &(t->
tz)))
00112
THROW(GETTIMEOFDAY_ERROR);
00113
00114 t->
started =
TRUE;
00115
00116
THROW(NONE);
00117
#else
00118
THROW(UNSUPPORTED_FUNCTION);
00119
#endif
00120 }
CATCH {
00121
switch (excp) {
00122
case INVALID_STATUS:
00123 ret_cod =
JF_RC_INVALID_STATUS;
00124
break;
00125
case TIMES_ERROR:
00126 ret_cod =
JF_RC_TIMES_ERROR;
00127
break;
00128
case GETTIMEOFDAY_ERROR:
00129 ret_cod =
JF_RC_GETTIMEOFDAY_ERROR;
00130
break;
00131
case UNSUPPORTED_FUNCTION:
00132 ret_cod =
JF_RC_UNSUPPORTED_FUNCTION;
00133
break;
00134
case NONE:
00135 ret_cod =
JF_RC_OK;
00136
break;
00137
default:
00138 ret_cod =
JF_RC_INTERNAL_ERROR;
00139 }
00140 }
00141
JF_TRACE((
"jf_timer_start/excp=%d/"
00142
"ret_cod=%d/errno=%d\n", excp, ret_cod, errno));
00143
return ret_cod;
00144 }
00145
00146
00147
00148 int jf_timer_stop(
jf_timer_t *t)
00149 {
00150
enum Exception { INVALID_STATUS
00151 , TIMES_ERROR
00152 , GETTIMEOFDAY_ERROR
00153 , NONE
00154 , UNSUPPORTED_FUNCTION } excp;
00155
int ret_cod =
JF_RC_INTERNAL_ERROR;
00156
00157
JF_TRACE((
"jf_timer_stop\n"));
00158 TRY {
00159
#ifdef JF_TIMER_AVAILABLE
00160
struct tms tmp_tms;
00161
struct timeval tmp_timeval;
00162 clock_t result = times(&tmp_tms);
00163
00164
if (!t->
started)
00165
THROW(INVALID_STATUS);
00166
00167
if ((clock_t)-1 == result)
00168
THROW(TIMES_ERROR);
00169 t->
usr_time += tmp_tms.tms_utime - t->
base_usr_time;
00170 t->
sys_time += tmp_tms.tms_stime - t->
base_sys_time;
00171
00172
if (-1 == gettimeofday(&tmp_timeval, &(t->
tz)))
00173
THROW(GETTIMEOFDAY_ERROR);
00174
00175 t->
ela_time.tv_sec +=
00176 tmp_timeval.tv_sec - t->
base_ela_time.tv_sec;
00177 t->
ela_time.tv_usec +=
00178 tmp_timeval.tv_usec - t->
base_ela_time.tv_usec;
00179
00180 t->
started =
FALSE;
00181
00182
THROW(NONE);
00183
#else
00184
THROW(UNSUPPORTED_FUNCTION);
00185
#endif
00186 }
CATCH {
00187
switch (excp) {
00188
case INVALID_STATUS:
00189 ret_cod =
JF_RC_INVALID_STATUS;
00190
break;
00191
case TIMES_ERROR:
00192 ret_cod =
JF_RC_TIMES_ERROR;
00193
break;
00194
case GETTIMEOFDAY_ERROR:
00195 ret_cod =
JF_RC_GETTIMEOFDAY_ERROR;
00196
break;
00197
case NONE:
00198 ret_cod =
JF_RC_OK;
00199
break;
00200
case UNSUPPORTED_FUNCTION:
00201 ret_cod =
JF_RC_UNSUPPORTED_FUNCTION;
00202
break;
00203
default:
00204 ret_cod =
JF_RC_INTERNAL_ERROR;
00205 }
00206 }
00207
JF_TRACE((
"jf_timer_stop/excp=%d/"
00208
"ret_cod=%d/errno=%d\n", excp, ret_cod, errno));
00209
return ret_cod;
00210 }