Bläddra i källkod

Preparations for higher resolution timer were made for POSIX and WIN32 platform.

getMicroseconds() function now implements 64-bit microsecond timer from Windows'
		  QueryPerformanceCounter & QueryPerformanceFrequency. POSIX
		  gettimeofday is already in microsecond resolution.
MILLISECONDS is now unsigned long (modular arithmetics 1-x<2^32 returns correct
	     results)
new type MICROSECONDS unsigned long long
getmilliseconds() is now just an wrapper, which does division by 1000 of
	 	  getMicroseconds function result
Jakub Korbel 12 år sedan
förälder
incheckning
af3532613c
3 ändrade filer med 39 tillägg och 14 borttagningar
  1. 1 0
      .gitignore
  2. 19 7
      source/src/ports/POSIX/networkhandler.c
  3. 19 7
      source/src/ports/WIN32/networkhandler.c

+ 1 - 0
.gitignore

@@ -5,5 +5,6 @@ source/src/cip_objects/
 !source/src/cip_objects/CMakeLists.txt
 .project
 .cproject
+.settings/
 *.*~
 *~

+ 19 - 7
source/src/ports/POSIX/networkhandler.c

@@ -25,7 +25,8 @@ extern S_CIP_ConnectionObject *g_pstActiveConnectionList;
 
 #define MAX_NO_OF_TCP_SOCKETS 10
 
-typedef long MILLISECONDS;
+typedef unsigned long MILLISECONDS;
+typedef unsigned long long MICROSECONDS;
 fd_set master;
 fd_set read_fds;
 /* temporary file descriptor for select() */
@@ -69,20 +70,30 @@ checkSocketSet(int pa_nSocket);
 EIP_STATUS
 handleDataOnTCPSocket(int pa_nSocket);
 
-static MILLISECONDS
-getmilliseconds(void)
+static MICROSECONDS
+getMicroseconds()
 {
 #ifdef WIN32
-  SYSTEMTIME tt;
-  GetSystemTime(&tt);
-  return (MILLISECONDS) tt.wSecond * 1000 + (MILLISECONDS) tt.wMilliseconds;
+    LARGE_INTEGER lPerformanceCouner;
+    LARGE_INTEGER lPerformanceFrequency;
+
+    QueryPerformanceCounter(&lPerformanceCouner);
+    QueryPerformanceFrequency(&lPerformanceFrequency);
+
+    return (MICROSECONDS) (lPerformanceCouner.QuadPart * 1000000LL / lPerformanceFrequency.QuadPart);
 #else
   struct timeval tv;
   gettimeofday(&tv, 0);
-  return (MILLISECONDS) tv.tv_sec * 1000 + (MILLISECONDS) tv.tv_usec / 1000;
+  return (MICROSECONDS) tv.tv_sec * 1000000ULL + (MICROSECONDS) tv.tv_usec;
 #endif
 }
 
+static MILLISECONDS
+getmilliseconds(void)
+{
+    return (MILLISECONDS) ( getMicroseconds() / 1000ULL );
+}
+
 /* INT8 Start_NetworkHandler()
  * 	start a TCP listening socket, accept connections, receive data in select loop, call manageConnections periodically.
  * 	return status
@@ -212,6 +223,7 @@ NetworkHandler_ProcessOnce(void)
           0) * 1000; /* 10 ms */
 
   res = select(fdmax + 1, &read_fds, 0, 0, &tv);
+
   if (res == -1)
     {
       if (EINTR == errno) /* we have somehow been interrupted. The default behavior is to go back into the select loop. */

+ 19 - 7
source/src/ports/WIN32/networkhandler.c

@@ -32,6 +32,7 @@ extern S_CIP_ConnectionObject *g_pstActiveConnectionList;
 #define MAX_NO_OF_TCP_SOCKETS 10
 
 typedef long MILLISECONDS;
+typedef unsigned long long MICROSECONDS;
 fd_set master;
 fd_set read_fds;
 /* temporary file descriptor for select() */
@@ -75,20 +76,30 @@ checkSocketSet(int pa_nSocket);
 EIP_STATUS
 handleDataOnTCPSocket(int pa_nSocket);
 
-static MILLISECONDS
-getmilliseconds(void)
+static MICROSECONDS
+getMicroseconds()
 {
 #ifdef WIN32
-  SYSTEMTIME tt;
-  GetSystemTime(&tt);
-  return (MILLISECONDS) tt.wSecond * 1000 + (MILLISECONDS) tt.wMilliseconds;
+    LARGE_INTEGER lPerformanceCouner;
+    LARGE_INTEGER lPerformanceFrequency;
+
+    QueryPerformanceCounter(&lPerformanceCouner);
+    QueryPerformanceFrequency(&lPerformanceFrequency);
+
+    return (MICROSECONDS) (lPerformanceCouner.QuadPart * 1000000LL / lPerformanceFrequency.QuadPart);
 #else
   struct timeval tv;
   gettimeofday(&tv, 0);
-  return (MILLISECONDS) tv.tv_sec * 1000 + (MILLISECONDS) tv.tv_usec / 1000;
+  return (MICROSECONDS) tv.tv_sec * 1000000ULL + (MICROSECONDS) tv.tv_usec;
 #endif
 }
 
+static MILLISECONDS
+getmilliseconds(void)
+{
+    return (MILLISECONDS) ( getMicroseconds() / 1000ULL );
+}
+
 /* INT8 Start_NetworkHandler()
  * 	start a TCP listening socket, accept connections, receive data in select loop, call manageConnections periodically.
  * 	return status
@@ -217,7 +228,8 @@ NetworkHandler_ProcessOnce(void)
           - TheNetworkStatus.elapsedtime :
           0) * 1000; /* 10 ms */
 
-  res = select(fdmax + 1, &read_fds, 0, 0, &tv);
+  printf("elapsed: %d\n", TheNetworkStatus.elapsedtime);
+
   if (res == -1)
     {
       if (EINTR == errno) /* we have somehow been interrupted. The default behavior is to go back into the select loop. */