forte: new package
[vuplus_openembedded] / packages / forte / forte-0.3.5 / forte-0.3.5_timer.patch
1 diff -Naur FORTE-0.3.5.orig/src/arch/pc/pctimeha.cpp FORTE-0.3.5/src/arch/pc/pctimeha.cpp
2 --- FORTE-0.3.5.orig/src/arch/pc/pctimeha.cpp   2009-01-13 16:17:18.000000000 +0000
3 +++ FORTE-0.3.5/src/arch/pc/pctimeha.cpp        2009-02-16 10:16:37.000000000 +0000
4 @@ -11,6 +11,7 @@
5  #include "pctimeha.h"\r
6  #include "../../core/devexec.h"\r
7  #include <time.h>\r
8 +#include <sys/time.h>\r
9  \r
10  const TINT32 CPCTimerHandler::csm_nTicksPerSecond = 1000;\r
11  \r
12 @@ -28,14 +29,34 @@
13    disableHandler();\r
14  }\r
15  \r
16 +static inline unsigned long long GetTicks(struct timeval* stTmVal, TINT32 ticksPerSecond)\r
17 +{\r
18 +  unsigned long long ret = stTmVal->tv_sec * 1000LL;// sec -> ms\r
19 +  ret += stTmVal->tv_usec/1000;// + us -> ms\r
20 +  ret /= 1000/ticksPerSecond; // ms -> ticks\r
21 +  return ret;\r
22 +}\r
23 +\r
24  bool CPCTimerHandler::run(){\r
25    struct timespec stReq;\r
26 +  struct timeval stTmNow;\r
27 +  unsigned long long tickStart;\r
28 +  unsigned long long tickNow;\r
29 +  unsigned long long tickCalled = 0;\r
30    stReq.tv_sec = 0;\r
31 -  stReq.tv_nsec = 1000000 / (csm_nTicksPerSecond / 1000);\r
32 +  stReq.tv_nsec = 1000000000 / (csm_nTicksPerSecond);\r
33 +\r
34 +  gettimeofday(&stTmNow, NULL);\r
35 +  tickNow = tickStart = GetTicks(&stTmNow, csm_nTicksPerSecond);\r
36    \r
37    while(m_bAlive){\r
38 -    nanosleep(&stReq, NULL);\r
39 +    if( (tickNow-tickStart) <= (tickCalled+1) ) {\r
40 +      nanosleep(&stReq, NULL);\r
41 +    }\r
42      nextTick(); \r
43 +    ++tickCalled;\r
44 +    gettimeofday(&stTmNow, NULL);\r
45 +    tickNow = GetTicks(&stTmNow, csm_nTicksPerSecond);\r
46    } \r
47    return true;\r
48  }\r