libjf API reference guide

Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

jf_timer.c

Go to the documentation of this file.
00001 /* 00002 * Copyright 2005 Tiian 00003 * {In real life Tiian is Christian Ferrari} 00004 * This file is part of "libjf" package. 00005 * 00006 * "libjf" is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU Lesser General Public License as published by 00008 * the Free Software Foundation; either version 2.1 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * "libjf" is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public License 00017 * along with ; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 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 /* set module trace flag */ 00031 #ifdef JF_TRACE_MODULE 00032 # undef JF_TRACE_MODULE 00033 #endif /* JF_TRACE_MODULE */ 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 /* JF_TIMER_AVAILABLE */ 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 } /* switch (excp) */ 00080 } /* TRY-CATCH */ 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 /* JF_TIMER_AVAILABLE */ 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 } /* switch (excp) */ 00140 } /* TRY-CATCH */ 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 /* JF_TIMER_AVAILABLE */ 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 } /* switch (excp) */ 00206 } /* TRY-CATCH */ 00207 JF_TRACE(("jf_timer_stop/excp=%d/" 00208 "ret_cod=%d/errno=%d\n", excp, ret_cod, errno)); 00209 return ret_cod; 00210 }

Copyright 2005 © Tiian