common.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef __UDT_COMMON_H__
00042 #define __UDT_COMMON_H__
00043
00044
00045 #ifndef WIN32
00046 #include <sys/time.h>
00047 #include <sys/uio.h>
00048 #include <pthread.h>
00049 #else
00050 #ifdef __MINGW__
00051 #include <stdint.h>
00052 #include <ws2tcpip.h>
00053 #endif
00054 #include <windows.h>
00055 #endif
00056 #include <cstdlib>
00057 #include "udt.h"
00058
00059
00060 #ifdef WIN32
00061
00062 typedef HANDLE pthread_t;
00063 typedef HANDLE pthread_mutex_t;
00064 typedef HANDLE pthread_cond_t;
00065 typedef DWORD pthread_key_t;
00066 #endif
00067
00068
00070
00071 class CTimer
00072 {
00073 public:
00074 CTimer();
00075 ~CTimer();
00076
00077 public:
00078
00079
00080
00081
00082
00083
00084
00085
00086 void sleep(uint64_t interval);
00087
00088
00089
00090
00091
00092
00093
00094
00095 void sleepto(uint64_t nexttime);
00096
00097
00098
00099
00100
00101
00102
00103
00104 void interrupt();
00105
00106
00107
00108
00109
00110
00111
00112
00113 void tick();
00114
00115 public:
00116
00117
00118
00119
00120
00121
00122
00123
00124 static void rdtsc(uint64_t &x);
00125
00126
00127
00128
00129
00130
00131
00132
00133 static uint64_t getCPUFrequency();
00134
00135
00136
00137
00138
00139
00140
00141
00142 static uint64_t getTime();
00143
00144
00145
00146
00147
00148
00149
00150
00151 static void triggerEvent();
00152
00153
00154
00155
00156
00157
00158
00159
00160 static void waitForEvent();
00161
00162
00163
00164
00165
00166
00167
00168
00169 static void sleep();
00170
00171 private:
00172 uint64_t getTimeInMicroSec();
00173
00174 private:
00175 uint64_t m_ullSchedTime;
00176
00177 pthread_cond_t m_TickCond;
00178 pthread_mutex_t m_TickLock;
00179
00180 static pthread_cond_t m_EventCond;
00181 static pthread_mutex_t m_EventLock;
00182
00183 private:
00184 static uint64_t s_ullCPUFrequency;
00185 static uint64_t readCPUFrequency();
00186 static bool m_bUseMicroSecond;
00187 };
00188
00190
00191 class CGuard
00192 {
00193 public:
00194 CGuard(pthread_mutex_t& lock);
00195 ~CGuard();
00196
00197 public:
00198 static void enterCS(pthread_mutex_t& lock);
00199 static void leaveCS(pthread_mutex_t& lock);
00200
00201 static void createMutex(pthread_mutex_t& lock);
00202 static void releaseMutex(pthread_mutex_t& lock);
00203
00204 static void createCond(pthread_cond_t& cond);
00205 static void releaseCond(pthread_cond_t& cond);
00206
00207 private:
00208 pthread_mutex_t& m_Mutex;
00209 int m_iLocked;
00210
00211 CGuard& operator=(const CGuard&);
00212 };
00213
00214
00215
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 class CSeqNo
00228 {
00229 public:
00230 inline static int seqcmp(int32_t seq1, int32_t seq2)
00231 {return (abs(seq1 - seq2) < m_iSeqNoTH) ? (seq1 - seq2) : (seq2 - seq1);}
00232
00233 inline static int seqlen(int32_t seq1, int32_t seq2)
00234 {return (seq1 <= seq2) ? (seq2 - seq1 + 1) : (seq2 - seq1 + m_iMaxSeqNo + 2);}
00235
00236 inline static int seqoff(int32_t seq1, int32_t seq2)
00237 {
00238 if (abs(seq1 - seq2) < m_iSeqNoTH)
00239 return seq2 - seq1;
00240
00241 if (seq1 < seq2)
00242 return seq2 - seq1 - m_iMaxSeqNo - 1;
00243
00244 return seq2 - seq1 + m_iMaxSeqNo + 1;
00245 }
00246
00247 inline static int32_t incseq(int32_t seq)
00248 {return (seq == m_iMaxSeqNo) ? 0 : seq + 1;}
00249
00250 inline static int32_t decseq(int32_t seq)
00251 {return (seq == 0) ? m_iMaxSeqNo : seq - 1;}
00252
00253 inline static int32_t incseq(int32_t seq, int32_t inc)
00254 {return (m_iMaxSeqNo - seq >= inc) ? seq + inc : seq - m_iMaxSeqNo + inc - 1;}
00255
00256 public:
00257 static const int32_t m_iSeqNoTH;
00258 static const int32_t m_iMaxSeqNo;
00259 };
00260
00262
00263
00264
00265 class CAckNo
00266 {
00267 public:
00268 inline static int32_t incack(int32_t ackno)
00269 {return (ackno == m_iMaxAckSeqNo) ? 0 : ackno + 1;}
00270
00271 public:
00272 static const int32_t m_iMaxAckSeqNo;
00273 };
00274
00276
00277
00278
00279 class CMsgNo
00280 {
00281 public:
00282 inline static int msgcmp(int32_t msgno1, int32_t msgno2)
00283 {return (abs(msgno1 - msgno2) < m_iMsgNoTH) ? (msgno1 - msgno2) : (msgno2 - msgno1);}
00284
00285 inline static int msglen(int32_t msgno1, int32_t msgno2)
00286 {return (msgno1 <= msgno2) ? (msgno2 - msgno1 + 1) : (msgno2 - msgno1 + m_iMaxMsgNo + 2);}
00287
00288 inline static int msgoff(int32_t msgno1, int32_t msgno2)
00289 {
00290 if (abs(msgno1 - msgno2) < m_iMsgNoTH)
00291 return msgno2 - msgno1;
00292
00293 if (msgno1 < msgno2)
00294 return msgno2 - msgno1 - m_iMaxMsgNo - 1;
00295
00296 return msgno2 - msgno1 + m_iMaxMsgNo + 1;
00297 }
00298
00299 inline static int32_t incmsg(int32_t msgno)
00300 {return (msgno == m_iMaxMsgNo) ? 0 : msgno + 1;}
00301
00302 public:
00303 static const int32_t m_iMsgNoTH;
00304 static const int32_t m_iMaxMsgNo;
00305 };
00306
00308
00309 struct CIPAddress
00310 {
00311 static bool ipcmp(const sockaddr* addr1, const sockaddr* addr2, int ver = AF_INET);
00312 static void ntop(const sockaddr* addr, uint32_t ip[4], int ver = AF_INET);
00313 static void pton(sockaddr* addr, const uint32_t ip[4], int ver = AF_INET);
00314 };
00315
00317
00318 struct CMD5
00319 {
00320 static void compute(const char* input, unsigned char result[16]);
00321 };
00322
00323
00324 #endif