Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

_timer.c File Reference

#include "rcs_defs.hh"
#include "rcs_prnt.hh"
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "_timer.h"
#include "_sem.h"

Include dependency graph for _timer.c:

Include dependency graph

Go to the source code of this file.

Defines

#define NO_SCCS_IDS

Functions

double clk_tck ()
double etime ()
void esleep (double seconds_to_sleep)
void print_etime ()

Variables

int etime_disabled = 0
double etime_disable_time = 0.0
int esleep_use_yield = 0


Define Documentation

#define NO_SCCS_IDS
 

Definition at line 20 of file _timer.c.


Function Documentation

double clk_tck void   
 

Definition at line 114 of file _timer.c.

Referenced by UDPMEM::cancel_subscription(), esleep(), main(), nml_perf_combined_test(), nml_perf_read_test(), nml_perf_write_test(), rcs_sem_wait(), CMS_SERVER_REMOTE_UDP_PORT::recalculate_polling_interval(), CMS_SERVER_REMOTE_TCP_PORT::remove_subscription_client(), RCS_TIMER::set_timeout(), UDPMEM::setup_subscription(), and RCS_TIMER::zero_timer().

00115 {
00116 #ifdef VXWORKS
00117 #ifndef POWERPC
00118   if (global_timer_available)
00119     {
00120       return (1E-6);
00121     }
00122 #endif
00123   return 1.0 / (double) sysClkRateGet ();
00124 #define CLK_TCK_RETURNED
00125 #endif
00126 
00127 #ifdef LYNX
00128   return 1.0 / (double) CLK_TCK;
00129 #define CLK_TCK_RETURNED
00130 #endif
00131 
00132 #if defined(SUN) || defined(SGI) || defined(LINUX) || defined(darwin) || defined(qnx)
00133   return 1.0 / (double) sysconf (_SC_CLK_TCK);
00134 #define CLK_TCK_RETURNED
00135 #endif
00136 
00137 #ifdef _Windows
00138   return (0.001);
00139 #define CLK_TCK_RETURNED
00140 #endif
00141 
00142 #ifdef __MSDOS__
00143   return (1.0 / (double) CLK_TCK);
00144 #define CLK_TCK_RETURNED
00145 #endif
00146 
00147 #ifndef CLK_TCK_RETURNED
00148 #error No definition for clk tck for this platform.
00149 #endif
00150 }

double etime void   
 

Definition at line 164 of file _timer.c.

Referenced by RCS_TIMER::RCS_TIMER(), STCPMEM::STCPMEM(), CMS_SERVER_REMOTE_UDP_PORT::add_subscription_client(), UDPMEM::blocking_read(), NML::blocking_read(), NML::blocking_read_extended(), CMS::calculate_and_store_diag_info(), UDPMEM::call_on_server(), NML_MODULE::check_cycle_time_end(), NML_MODULE::check_cycle_time_start(), NODE::check_timer(), esleep(), GLOBMEM::get_access(), TCPMEM::get_diagnostics_info(), CMS_SERVER::get_user_keys(), NML_MODULE::loadDclock(), STCPMEM::login(), main(), GLOBMEM::main_access(), mem_get_access(), nml_perf_combined_test(), nml_perf_read_test(), nml_perf_write_test(), nml_watch(), STCPMEM::peek(), rcs_sem_wait(), STCPMEM::read(), RTLMEM::read(), FILEMEM::read(), TCPMEM::reconnect(), recvline(), recvn(), sendn(), RCS_TIMER::sync(), CMS_SERVER_REMOTE_UDP_PORT::update_subscriptions(), RCS_TIMER::wait(), NODE::wait_for_timer(), FILEMEM::write(), and RCS_TIMER::zero_timer().

00165 {
00166 #ifdef VXWORKS
00167 #ifdef USE_CLOCK_GETTIME
00168   double retval;
00169   struct timespec ts;
00170 #endif
00171 #ifndef POWERPC
00172   if (etime_disabled)
00173     {
00174       return (etime_disable_time);
00175     }
00176   if (global_timer_available)
00177     {
00178       return (((double) get_Global_time ()) * (1E-6));
00179     }
00180 #endif
00181 
00182 #ifdef USE_CLOCK_GETTIME
00183   if (etime_disabled)
00184     {
00185       return (etime_disable_time);
00186     }
00187   if (clock_gettime (CLOCK_REALTIME, &ts))
00188     {
00189       /* rcs_print_error("clock_gettime: errno = %d %s\n", errno, strerror(errno)); */
00190     }
00191   retval = ((double) ts.tv_sec) + ((double) ts.tv_nsec) * 1e-9;
00192   return retval;
00193 #else
00194   if (etime_disabled)
00195     {
00196       return (etime_disable_time);
00197     }
00198   return ((double) tickGet ()) / ((double) sysClkRateGet ());
00199 #endif
00200 #define ETIME_RETURNED
00201 #endif
00202 
00203 #if defined (sunos4) || defined (LYNX) || defined(irix5) || defined(sparcworks_sun4)
00204   double retval = 0.0;
00205   static double last_retval = 0.0;
00206   static struct timeval last_tp;
00207 
00208   struct timeval tp;
00209   if (etime_disabled)
00210     {
00211       return (etime_disable_time);
00212     }
00213   if (gettimeofday (&tp, NULL) == -1)
00214     {
00215       rcs_print_error ("gettimeofday failed: (errno = %d) %s\n", errno,
00216                        strerror (errno));
00217       return 0.0;
00218     }
00219   retval = ((double) tp.tv_sec) + (((double) tp.tv_usec) / 1000000.0);
00220   return (retval);
00221 #define ETIME_RETURNED
00222 #endif
00223 
00224 #if defined(sunos5) || (defined(os5) && defined(sparc))  || defined(irix6) || defined(irix64)
00225   double retval;
00226   struct timespec ts;
00227 
00228   if (etime_disabled)
00229     {
00230       return (etime_disable_time);
00231     }
00232   if (clock_gettime (CLOCK_REALTIME, &ts))
00233     {
00234       rcs_print_error ("clock_gettime: errno = %d %s\n", errno,
00235                        strerror (errno));
00236     }
00237   retval = ((double) ts.tv_sec) + ((double) ts.tv_nsec) * 1e-9;
00238   return retval;
00239 #define ETIME_RETURNED
00240 #endif
00241 
00242 #if defined(LINUX) || defined(darwin) || defined(qnx)
00243 
00244   struct timeval tp;
00245   double retval;
00246 #if 0
00247   static double last_retval = 0.0;
00248 #endif
00249 
00250   if (0 != gettimeofday (&tp, NULL))
00251     {
00252       rcs_print_error ("etime: can't get time\n");
00253       return 0.0;
00254     }
00255 
00256   retval = ((double) tp.tv_sec) + ((double) tp.tv_usec) / 1000000.0;
00257 #if 0
00258   if (retval < last_retval)
00259     {
00260       rcs_print_error ("etime: negative time interval\n");
00261       return 0.0;
00262     }
00263   last_retval = retval;
00264 #endif
00265   return retval;
00266 
00267 #define ETIME_RETURNED
00268 #endif /* LINUX */
00269 
00270 #ifdef _Windows
00271 #ifdef USE_TOOL_HELP
00272 /* The TimerCount function is more accurate than the GetTickCount() function
00273 but you need toolhelp.dll which comes with Windows 3.1 but not Windows 3.0 or
00274 Windows NT */
00275   TIMERINFO timer_info;
00276   if (etime_disabled)
00277     {
00278       return (etime_disable_time);
00279     }
00280   if (TimerCount (&timer_info))
00281     {
00282       return ((double) timer_info.dwmsSinceStart / 1000.0);
00283     }
00284   else
00285     {
00286       rcs_print_error ("etime: TimerCount returned false.\n");
00287       return (0);
00288     }
00289 #define ETIME_RETURNED
00290 #else /* defined(_Windows) && defined(USE_TOOL_HELP) */
00291 #if defined(WIN32) && !defined(UNDER_CE)
00292   BOOL frequency_ok = 0;
00293   BOOL counter_ok = 0;
00294   LARGE_INTEGER frequency;
00295   LARGE_INTEGER counter;
00296   double dfreq;
00297   double dcount;
00298 #define TWO_TO_THIRTYTWO  (4294967296.00)
00299 #endif
00300 
00301   if (etime_disabled)
00302     {
00303       return (etime_disable_time);
00304     }
00305 #if defined(WIN32) && !defined(UNDER_CE)
00306   frequency_ok = QueryPerformanceFrequency (&frequency);
00307   counter_ok = QueryPerformanceCounter (&counter);
00308   if (frequency_ok && counter_ok)
00309     {
00310       dfreq = frequency.HighPart * TWO_TO_THIRTYTWO + frequency.LowPart;
00311       dcount = counter.HighPart * TWO_TO_THIRTYTWO + counter.LowPart;
00312       if (dfreq > 0.0 && dcount > 0.0)
00313         {
00314           return (dcount / dfreq);
00315         }
00316     }
00317 #endif
00318   return ((double) GetTickCount () / 1000.0);
00319 #define ETIME_RETURNED
00320 #endif /* defined(_Windows) && defined(USE_TOOL_HELP) */
00321 #endif
00322 
00323 #if  defined(__MSDOS__) && !defined(_Windows)
00324 #ifndef CLOCKS_PER_SECOND
00325 #define CLOCKS_PER_SECOND CLK_TCK
00326 #endif
00327   if (etime_disabled)
00328     {
00329       return (etime_disable_time);
00330     }
00331   return clock () / CLOCKS_PER_SECOND;
00332 #define ETIME_RETURNED
00333 
00334 #endif /* __MSDOS__ */
00335 
00336 #ifndef ETIME_RETURNED
00337 #error NO definition for etime for this platform
00338 #endif
00339 }

void esleep double    secs
 

Definition at line 345 of file _timer.c.

00346 {
00347 #ifdef VXWORKS
00348 #if 1
00349   int t = (int) (seconds_to_sleep * (double) sysClkRateGet ());
00350 
00351   taskDelay (t <= 0 ? 1 : t);   /* at least sleep a tick */
00352 #else
00353   struct timespec nantime;
00354   nantime.tv_sec = (time_t) seconds_to_sleep;
00355   nantime.tv_nsec = ((double) (seconds_to_sleep - nantime.tv_sec) * 1e9);
00356   return nanosleep (&nantime, NULL);
00357 #endif
00358   return;
00359 #define ESLEEP_RETURNED
00360 
00361 #endif
00362 
00363 #if defined (SUN) || defined (LYNX) || defined(irix5) || defined(irix6) || defined(irix64) || defined(LINUX) || defined(darwin) || defined(qnx)
00364 #ifndef VXWORKS
00365 #if defined(sunos5) || defined(LINUX_KERNEL_2_2_OR_LATER)
00366   struct timeval tval;
00367   static double clk_tck_val = 0;
00368   double total = seconds_to_sleep;      /* total sleep asked for */
00369   double started = etime ();    /* time when called */
00370   double left = total;
00371   if (seconds_to_sleep <= 0.0)
00372     return;
00373   if (clk_tck_val <= 0)
00374     {
00375       clk_tck_val = clk_tck ();
00376     }
00377   do
00378     {
00379       if (left < clk_tck_val && esleep_use_yield)
00380         {
00381 #ifdef linux
00382           sched_yield ();
00383 #else
00384           yield ();
00385 #endif
00386         }
00387       else
00388         {
00389           tval.tv_sec = (long) left;    /* double->long truncates, ANSI */
00390           tval.tv_usec = (long) ((left - (double) tval.tv_sec) * 1000000.0);
00391           if (tval.tv_sec == 0 && tval.tv_usec == 0)
00392             {
00393               tval.tv_usec = 1;
00394             }
00395           if (select (0, NULL, NULL, NULL, &tval) < 0)
00396             {
00397               if (errno != EINTR)
00398                 {
00399                   break;
00400                 }
00401             }
00402         }
00403       left = total - etime () + started;
00404     }
00405   while (left > 0 && (left > clk_tck_val && esleep_use_yield));
00406   return;
00407 #define ESLEEP_RETURNED
00408 
00409 #else
00410   unsigned int whole_seconds = (int) (seconds_to_sleep);
00411   unsigned int useconds =
00412     (int) ((seconds_to_sleep - ((double) whole_seconds)) * 1e6);
00413   if (seconds_to_sleep <= 1e-6)
00414     return;
00415   if (whole_seconds > 0)
00416     {
00417       sleep (whole_seconds);
00418     }
00419   if (useconds > 0)
00420     {
00421       usleep (useconds);
00422     }
00423   return;
00424 #define ESLEEP_RETURNED
00425 
00426 #endif
00427 #if 0
00428   struct timespec rqtp, rmtp;
00429   rqtp.tv_sec = seconds_to_sleep;
00430   rqtp.tv_nsec = seconds_to_sleep * 1E9;
00431   if (seconds_to_sleep <= 0.0)
00432     return;
00433   if (nanosleep (&rqtp, NULL) < 0)
00434     {
00435       rcs_print_error ("nanosleep error %d %s\n", errno, strerror (errno));
00436     }
00437   return;
00438 #define ESLEEP_RETURNED
00439 
00440 #endif
00441 
00442 #endif
00443 
00444 #endif
00445 
00446 #ifdef WIN32
00447   if (seconds_to_sleep <= 0.0)
00448     return;
00449 #ifndef UNDER_CE
00450   SleepEx (((unsigned long) (seconds_to_sleep * 1000)), FALSE);
00451 #else
00452   Sleep (seconds_to_sleep * 1000);
00453 #endif
00454   return;
00455 #define ESLEEP_RETURNED
00456 
00457 #else
00458 
00459 #if defined(WIN16) || defined(_MSC_VER)
00460   double t0, tf;
00461   if (seconds_to_sleep <= 0.0)
00462     return;
00463   t0 = etime ();
00464   tf = etime ();
00465   while ((tf - t0) < seconds_to_sleep)
00466     {
00467 #ifdef WINDOWS
00468       Yeild ();
00469 #endif
00470       tf = etime ();
00471     }
00472   return;
00473 
00474 #define ESLEEP_RETURNED
00475 
00476 #else
00477 #if defined(__MSDOS__) && !defined(_Windows)
00478   if (seconds_to_sleep <= 0.0)
00479     return;
00480   delay ((unsigned int) (seconds_to_sleep * 1000.0));
00481   return;
00482 #define ESLEEP_RETURNED
00483 
00484 #endif
00485 #endif
00486 #endif
00487 
00488 #ifndef ESLEEP_RETURNED
00489 #error No definition for esleep for this platform.
00490 #endif
00491 
00492 }

void print_etime void   
 

Definition at line 498 of file _timer.c.

Referenced by NO_DBG_MEM(), and rcsinfo().

00499 {
00500   printf ("etime = %f\n", etime ());
00501 }


Variable Documentation

int etime_disabled = 0
 

Definition at line 159 of file _timer.c.

double etime_disable_time = 0.0
 

Definition at line 160 of file _timer.c.

int esleep_use_yield = 0
 

Definition at line 341 of file _timer.c.


Generated on Sun Dec 2 15:56:56 2001 for rcslib by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001