new typedefs (INT64/QWORD),
authorAlex Kirhenshtein <alk@netxms.org>
Sat, 24 Apr 2004 23:29:29 +0000 (23:29 +0000)
committerAlex Kirhenshtein <alk@netxms.org>
Sat, 24 Apr 2004 23:29:29 +0000 (23:29 +0000)
threads/mutexes implemented, makefile for libnmsutils
conditions not implemented yet

include/nms_common.h
include/nms_threads.h
include/nms_util.h

index 9d4d76c..fc73334 100644 (file)
@@ -62,6 +62,10 @@ typedef unsigned __int64 QWORD;
 
 #else
 
+
+#include <sys/types.h>
+#include <netinet/in.h>
+
 typedef int BOOL;
 typedef long int LONG;
 typedef unsigned long DWORD;
@@ -69,18 +73,22 @@ typedef unsigned short WORD;
 typedef unsigned char BYTE;
 typedef void * HANDLE;
 typedef void * HMODULE;
+typedef int64_t __int64;
+typedef int64_t INT64;
+typedef u_int64_t QWORD;
+
 
 #define TRUE   1
 #define FALSE  0
 
 #define EXPORTABLE
 
-#include <netinet/in.h>
-
 #ifndef MAX_PATH
 #define MAX_PATH 256
 #endif
 
+typedef int SOCKET;
+
 #endif
 
 
@@ -179,4 +187,9 @@ typedef struct tagICMPHDR
                     (((toupper(x) >= 'A') && (toupper(x) <= 'F')) ? (toupper(x) - 'A' + 10) : 0))
 
 
+// choice minimal value
+#ifndef min
+# define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
 #endif   /* _nms_common_h_ */
index a2798d5..e7dfe3b 100644 (file)
@@ -110,11 +110,15 @@ inline BOOL ConditionWait(CONDITION hCond, DWORD dwTimeOut)
 // Related datatypes and constants
 //
 
-typedef MUTEX * pthread_mutex_t;
-#define THREAD HANDLE
+typedef pthread_t THREAD;
+typedef pthread_mutex_t * MUTEX;
+typedef pthread_cond_t * CONDITION;
 
 #define INVALID_MUTEX_HANDLE  NULL
 
+#ifndef INFINITE
+# define INFINITE 0
+#endif
 
 //
 // Inline functions
@@ -130,6 +134,22 @@ inline void ThreadSleepMs(DWORD dwMilliseconds)
    usleep(dwMilliseconds * 1000);   // Convert to microseconds
 }
 
+inline THREAD ThreadCreate(void * (*start_address )(void *), int stack_size, void *args)
+{
+       THREAD id;
+
+       if (pthread_create(&id, NULL, start_address, args) == 0) {
+               return id;
+       } else {
+               return 0;
+       }
+}
+
+inline void ThreadExit(void)
+{
+   pthread_kill(pthread_self(), 15); // 9?
+}
+
 inline MUTEX MutexCreate(void)
 {
    MUTEX mutex;
@@ -142,8 +162,7 @@ inline MUTEX MutexCreate(void)
 
 inline void MutexDestroy(MUTEX mutex)
 {
-   if (mutex != NULL)
-   {
+   if (mutex != NULL) {
       pthread_mutex_destroy(mutex);
       free(mutex);
    }
@@ -151,12 +170,68 @@ inline void MutexDestroy(MUTEX mutex)
 
 inline void MutexLock(MUTEX mutex, DWORD dwTimeOut)
 {
+   if (mutex != NULL) {
+      pthread_mutex_lock(mutex);
+       }
 }
 
 inline void MutexUnlock(MUTEX mutex)
 {
-   if (mutex != NULL)
+   if (mutex != NULL) {
       pthread_mutex_unlock(mutex);
+       }
+}
+
+inline CONDITION ConditionCreate(void)
+{
+       CONDITION cond;
+
+       abort(); // trap
+
+   cond = (CONDITION)malloc(sizeof(pthread_cond_t));
+   if (cond != NULL) {
+      pthread_cond_init(cond, NULL);
+       }
+   return cond;
+}
+
+inline void ConditionDestroy(CONDITION hCond)
+{
+       abort(); // trap
+
+       if (hCond != NULL) {
+               pthread_cond_destroy(hCond);
+               free(hCond);
+       }
+}
+
+inline void ConditionSet(CONDITION hCond)
+{
+       abort(); // trap
+}
+
+inline BOOL ConditionWait(CONDITION hCond, DWORD dwTimeOut)
+{
+       abort(); // trap
+
+       if (hCond != NULL) {
+/*             struct timeval now;
+               struct timespec timeout;
+               
+               pthread_mutex_lock(&hMutex);
+               gettimeofday(&now);
+               timeout.tv_sec = now.tv_sec + dwTimeOut; // TODO: dwTimeOut - in seconds?
+               timeout.tv_nsec = now.tv_usec * 1000;
+               retcode = 0;
+               while (retcode != ETIMEDOUT) {
+                       retcode = pthread_cond_timedwait(hCond, &hMutex, &timeout);
+               }
+               pthread_mutex_unlock(&hMutex);*/
+
+               return FALSE;
+       } else {
+               return FALSE;
+       }
 }
 
 #endif   /* _WIN32 */
index e2846b1..17a63ce 100644 (file)
@@ -135,7 +135,9 @@ public:
 
 extern "C"
 {
+#ifdef _WIN32
    QWORD EXPORTABLE __bswap_64(QWORD qwVal);
+#endif
    
    int EXPORTABLE RecvCSCPMessage(SOCKET hSocket, CSCP_MESSAGE *pMsg, CSCP_BUFFER *pBuffer);
    CSCP_MESSAGE EXPORTABLE *CreateRawCSCPMessage(WORD wCode, DWORD dwId, DWORD dwDataSize, void *pData, CSCP_MESSAGE *pBuffer);