genesis 1
genesis 2
genesis 3
genesis 4
genesis 5 #ifndef BITCOIN_UTIL_H
genesis 6 #define BITCOIN_UTIL_H
genesis 7
genesis 8 #include "uint256.h"
genesis 9
asciilifeform-kil... 10 #include <stdint.h>
genesis 11 #include <sys/types.h>
genesis 12 #include <sys/time.h>
genesis 13 #include <sys/resource.h>
genesis 14 #include <map>
genesis 15 #include <vector>
genesis 16 #include <string>
genesis 17
genesis 18 #include <boost/thread.hpp>
genesis 19 #include <boost/interprocess/sync/interprocess_recursive_mutex.hpp>
genesis 20 #include <boost/date_time/gregorian/gregorian_types.hpp>
genesis 21 #include <boost/date_time/posix_time/posix_time_types.hpp>
genesis 22
genesis 23 #include <openssl/sha.h>
genesis 24 #include <openssl/ripemd.h>
genesis 25
genesis 26
genesis 27 typedef long long int64;
genesis 28 typedef unsigned long long uint64;
bitcoin-asciilife... 29
genesis 30 #define __forceinline inline
genesis 31
genesis 32 #define loop for (;;)
genesis 33 #define BEGIN(a) ((char*)&(a))
genesis 34 #define END(a) ((char*)&((&(a))[1]))
genesis 35 #define UBEGIN(a) ((unsigned char*)&(a))
genesis 36 #define UEND(a) ((unsigned char*)&((&(a))[1]))
genesis 37 #define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0]))
genesis 38 #define printf OutputDebugStringF
genesis 39
genesis 40 #ifdef snprintf
genesis 41 #undef snprintf
genesis 42 #endif
genesis 43 #define snprintf my_snprintf
genesis 44
genesis 45 #ifndef PRI64d
genesis 46 #define PRI64d "lld"
genesis 47 #define PRI64u "llu"
genesis 48 #define PRI64x "llx"
genesis 49 #endif
genesis 50
genesis 51
genesis 52 #define PAIRTYPE(t1, t2) std::pair<t1, t2>
genesis 53
genesis 54
genesis 55 template <size_t nBytes, typename T>
genesis 56 T* alignup(T* p)
genesis 57 {
genesis 58 union
genesis 59 {
genesis 60 T* ptr;
genesis 61 size_t n;
genesis 62 } u;
genesis 63 u.ptr = p;
genesis 64 u.n = (u.n + (nBytes-1)) & ~(nBytes-1);
genesis 65 return u.ptr;
genesis 66 }
genesis 67
genesis 68 #define WSAGetLastError() errno
genesis 69 #define WSAEINVAL EINVAL
genesis 70 #define WSAEALREADY EALREADY
genesis 71 #define WSAEWOULDBLOCK EWOULDBLOCK
genesis 72 #define WSAEMSGSIZE EMSGSIZE
genesis 73 #define WSAEINTR EINTR
genesis 74 #define WSAEINPROGRESS EINPROGRESS
genesis 75 #define WSAEADDRINUSE EADDRINUSE
genesis 76 #define WSAENOTSOCK EBADF
genesis 77 #define INVALID_SOCKET (SOCKET)(~0)
genesis 78 #define SOCKET_ERROR -1
genesis 79 typedef u_int SOCKET;
genesis 80 #define _vsnprintf(a,b,c,d) vsnprintf(a,b,c,d)
genesis 81 #define strlwr(psz) to_lower(psz)
genesis 82 #define _strlwr(psz) to_lower(psz)
genesis 83 #define MAX_PATH 1024
genesis 84 #define Beep(n1,n2) (0)
genesis 85 inline void Sleep(int64 n)
genesis 86 {
genesis 87
genesis 88 So we clamp our sleeps here to 10 years and hope that boost is fixed by 2028.*/
genesis 89 boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(n>315576000000LL?315576000000LL:n));
genesis 90 }
bitcoin-asciilife... 91
genesis 92
genesis 93 inline int myclosesocket(SOCKET& hSocket)
genesis 94 {
genesis 95 if (hSocket == INVALID_SOCKET)
genesis 96 return WSAENOTSOCK;
genesis 97 int ret = close(hSocket);
genesis 98 hSocket = INVALID_SOCKET;
genesis 99 return ret;
genesis 100 }
genesis 101 #define closesocket(s) myclosesocket(s)
genesis 102 inline const char* _(const char* psz)
genesis 103 {
genesis 104 return psz;
genesis 105 }
bitcoin-asciilife... 106
genesis 107
genesis 108 extern std::map<std::string, std::string> mapArgs;
genesis 109 extern std::map<std::string, std::vector<std::string> > mapMultiArgs;
genesis 110 extern bool fDebug;
genesis 111 extern bool fPrintToConsole;
genesis 112 extern bool fPrintToDebugger;
asciilifeform_and... 113 extern bool fCanEat;
asciilifeform_add... 114 extern bool fVerifyAll;
genesis 115 extern char pszSetDataDir[MAX_PATH];
genesis 116 extern bool fRequestShutdown;
genesis 117 extern bool fShutdown;
genesis 118 extern bool fDaemon;
genesis 119 extern bool fServer;
genesis 120 extern bool fCommandLine;
genesis 121 extern std::string strMiscWarning;
genesis 122 extern bool fNoListen;
genesis 123 extern bool fLogTimestamps;
programmable-vers... 124 extern std::string CLIENT_NAME;
mod6_der_high_low_s 125 extern bool fLowS;
mod6_der_high_low_s 126 extern bool fHighS;
genesis 127
genesis 128 void RandAddSeed();
genesis 129 void RandAddSeedPerfmon();
genesis 130 int OutputDebugStringF(const char* pszFormat, ...);
genesis 131 int my_snprintf(char* buffer, size_t limit, const char* format, ...);
genesis 132 std::string strprintf(const std::string &format, ...);
genesis 133 bool error(const std::string &format, ...);
genesis 134 void LogException(std::exception* pex, const char* pszThread);
genesis 135 void PrintException(std::exception* pex, const char* pszThread);
genesis 136 void PrintExceptionContinue(std::exception* pex, const char* pszThread);
genesis 137 void ParseString(const std::string& str, char c, std::vector<std::string>& v);
genesis 138 std::string FormatMoney(int64 n, bool fPlus=false);
genesis 139 bool ParseMoney(const std::string& str, int64& nRet);
genesis 140 bool ParseMoney(const char* pszIn, int64& nRet);
genesis 141 std::vector<unsigned char> ParseHex(const char* psz);
genesis 142 std::vector<unsigned char> ParseHex(const std::string& str);
genesis 143 std::vector<unsigned char> DecodeBase64(const char* p, bool* pfInvalid = NULL);
genesis 144 std::string DecodeBase64(const std::string& str);
genesis 145 std::string EncodeBase64(const unsigned char* pch, size_t len);
genesis 146 std::string EncodeBase64(const std::string& str);
genesis 147 void ParseParameters(int argc, char* argv[]);
genesis 148 const char* wxGetTranslation(const char* psz);
genesis 149 bool WildcardMatch(const char* psz, const char* mask);
genesis 150 bool WildcardMatch(const std::string& str, const std::string& mask);
genesis 151 int GetFilesize(FILE* file);
genesis 152 void GetDataDir(char* pszDirRet);
genesis 153 std::string GetConfigFile();
genesis 154 std::string GetPidFile();
genesis 155 void CreatePidFile(std::string pidFile, pid_t pid);
genesis 156 void ReadConfigFile(std::map<std::string, std::string>& mapSettingsRet, std::map<std::string, std::vector<std::string> >& mapMultiSettingsRet);
genesis 157 std::string GetDefaultDataDir();
genesis 158 std::string GetDataDir();
genesis 159 void ShrinkDebugFile();
genesis 160 int GetRandInt(int nMax);
genesis 161 uint64 GetRand(uint64 nMax);
genesis 162 int64 GetTime();
genesis 163 void SetMockTime(int64 nMockTimeIn);
genesis 164 int64 GetAdjustedTime();
genesis 165 void AddTimeData(unsigned int ip, int64 nTime);
genesis 166 std::string FormatFullVersion();
programmable-vers... 167 std::string FormatSubVersion(const std::string& name, int nClientVersion);
genesis 168
genesis 169
genesis 170
genesis 171
genesis 172
genesis 173
genesis 174
genesis 175
genesis 176
genesis 177
genesis 178
genesis 179
genesis 180
genesis 181
genesis 182 class CCriticalSection
genesis 183 {
genesis 184 protected:
genesis 185 boost::interprocess::interprocess_recursive_mutex mutex;
genesis 186 public:
genesis 187 explicit CCriticalSection() { }
genesis 188 ~CCriticalSection() { }
genesis 189 void Enter(const char* pszName, const char* pszFile, int nLine);
genesis 190 void Leave();
genesis 191 bool TryEnter(const char* pszName, const char* pszFile, int nLine);
genesis 192 };
genesis 193
genesis 194
genesis 195 class CCriticalBlock
genesis 196 {
genesis 197 protected:
genesis 198 CCriticalSection* pcs;
genesis 199
genesis 200 public:
genesis 201 CCriticalBlock(CCriticalSection& csIn, const char* pszName, const char* pszFile, int nLine)
genesis 202 {
genesis 203 pcs = &csIn;
genesis 204 pcs->Enter(pszName, pszFile, nLine);
genesis 205 }
genesis 206
genesis 207 operator bool() const
genesis 208 {
genesis 209 return true;
genesis 210 }
genesis 211
genesis 212 ~CCriticalBlock()
genesis 213 {
genesis 214 pcs->Leave();
genesis 215 }
genesis 216 };
genesis 217
genesis 218 #define CRITICAL_BLOCK(cs) \
genesis 219 if (CCriticalBlock criticalblock = CCriticalBlock(cs, #cs, __FILE__, __LINE__))
genesis 220
genesis 221 #define ENTER_CRITICAL_SECTION(cs) \
genesis 222 (cs).Enter(#cs, __FILE__, __LINE__)
genesis 223
genesis 224 #define LEAVE_CRITICAL_SECTION(cs) \
genesis 225 (cs).Leave()
genesis 226
genesis 227 class CTryCriticalBlock
genesis 228 {
genesis 229 protected:
genesis 230 CCriticalSection* pcs;
genesis 231
genesis 232 public:
genesis 233 CTryCriticalBlock(CCriticalSection& csIn, const char* pszName, const char* pszFile, int nLine)
genesis 234 {
genesis 235 pcs = (csIn.TryEnter(pszName, pszFile, nLine) ? &csIn : NULL);
genesis 236 }
genesis 237
genesis 238 operator bool() const
genesis 239 {
genesis 240 return Entered();
genesis 241 }
genesis 242
genesis 243 ~CTryCriticalBlock()
genesis 244 {
genesis 245 if (pcs)
genesis 246 {
genesis 247 pcs->Leave();
genesis 248 }
genesis 249 }
genesis 250 bool Entered() const { return pcs != NULL; }
genesis 251 };
genesis 252
genesis 253 #define TRY_CRITICAL_BLOCK(cs) \
genesis 254 if (CTryCriticalBlock criticalblock = CTryCriticalBlock(cs, #cs, __FILE__, __LINE__))
genesis 255
genesis 256
genesis 257
genesis 258
genesis 259
genesis 260
genesis 261
genesis 262
genesis 263 typedef std::basic_string<char, std::char_traits<char>, secure_allocator<char> > SecureString;
genesis 264
genesis 265
genesis 266
genesis 267 typedef std::basic_string<char, std::char_traits<char>, secure_allocator<char> > SecureString;
genesis 268
genesis 269
genesis 270
genesis 271
genesis 272
genesis 273 inline std::string i64tostr(int64 n)
genesis 274 {
genesis 275 return strprintf("%"PRI64d, n);
genesis 276 }
genesis 277
genesis 278 inline std::string itostr(int n)
genesis 279 {
genesis 280 return strprintf("%d", n);
genesis 281 }
genesis 282
genesis 283 inline int64 atoi64(const char* psz)
genesis 284 {
genesis 285 return strtoll(psz, NULL, 10);
genesis 286 }
genesis 287
genesis 288 inline int64 atoi64(const std::string& str)
genesis 289 {
genesis 290 return strtoll(str.c_str(), NULL, 10);
genesis 291 }
genesis 292
genesis 293 inline int atoi(const std::string& str)
genesis 294 {
genesis 295 return atoi(str.c_str());
genesis 296 }
genesis 297
genesis 298 inline int roundint(double d)
genesis 299 {
genesis 300 return (int)(d > 0 ? d + 0.5 : d - 0.5);
genesis 301 }
genesis 302
genesis 303 inline int64 roundint64(double d)
genesis 304 {
genesis 305 return (int64)(d > 0 ? d + 0.5 : d - 0.5);
genesis 306 }
genesis 307
genesis 308 inline int64 abs64(int64 n)
genesis 309 {
genesis 310 return (n >= 0 ? n : -n);
genesis 311 }
genesis 312
genesis 313 template<typename T>
genesis 314 std::string HexStr(const T itbegin, const T itend, bool fSpaces=false)
genesis 315 {
genesis 316 if (itbegin == itend)
genesis 317 return "";
genesis 318 const unsigned char* pbegin = (const unsigned char*)&itbegin[0];
genesis 319 const unsigned char* pend = pbegin + (itend - itbegin) * sizeof(itbegin[0]);
genesis 320 std::string str;
genesis 321 str.reserve((pend-pbegin) * (fSpaces ? 3 : 2));
genesis 322 for (const unsigned char* p = pbegin; p != pend; p++)
genesis 323 str += strprintf((fSpaces && p != pend-1 ? "%02x " : "%02x"), *p);
genesis 324 return str;
genesis 325 }
genesis 326
genesis 327 inline std::string HexStr(const std::vector<unsigned char>& vch, bool fSpaces=false)
genesis 328 {
genesis 329 return HexStr(vch.begin(), vch.end(), fSpaces);
genesis 330 }
genesis 331
genesis 332 template<typename T>
genesis 333 std::string HexNumStr(const T itbegin, const T itend, bool f0x=true)
genesis 334 {
genesis 335 if (itbegin == itend)
genesis 336 return "";
genesis 337 const unsigned char* pbegin = (const unsigned char*)&itbegin[0];
genesis 338 const unsigned char* pend = pbegin + (itend - itbegin) * sizeof(itbegin[0]);
genesis 339 std::string str = (f0x ? "0x" : "");
genesis 340 str.reserve(str.size() + (pend-pbegin) * 2);
genesis 341 for (const unsigned char* p = pend-1; p >= pbegin; p--)
genesis 342 str += strprintf("%02x", *p);
genesis 343 return str;
genesis 344 }
genesis 345
genesis 346 inline std::string HexNumStr(const std::vector<unsigned char>& vch, bool f0x=true)
genesis 347 {
genesis 348 return HexNumStr(vch.begin(), vch.end(), f0x);
genesis 349 }
genesis 350
genesis 351 template<typename T>
genesis 352 void PrintHex(const T pbegin, const T pend, const char* pszFormat="%s", bool fSpaces=true)
genesis 353 {
genesis 354 printf(pszFormat, HexStr(pbegin, pend, fSpaces).c_str());
genesis 355 }
genesis 356
genesis 357 inline void PrintHex(const std::vector<unsigned char>& vch, const char* pszFormat="%s", bool fSpaces=true)
genesis 358 {
genesis 359 printf(pszFormat, HexStr(vch, fSpaces).c_str());
genesis 360 }
genesis 361
genesis 362 inline int64 GetPerformanceCounter()
genesis 363 {
genesis 364 int64 nCounter = 0;
genesis 365 timeval t;
genesis 366 gettimeofday(&t, NULL);
genesis 367 nCounter = t.tv_sec * 1000000 + t.tv_usec;
genesis 368 return nCounter;
genesis 369 }
genesis 370
genesis 371 inline int64 GetTimeMillis()
genesis 372 {
genesis 373 return (boost::posix_time::ptime(boost::posix_time::microsec_clock::universal_time()) -
genesis 374 boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds();
genesis 375 }
genesis 376
genesis 377 inline std::string DateTimeStrFormat(const char* pszFormat, int64 nTime)
genesis 378 {
genesis 379 time_t n = nTime;
genesis 380 struct tm* ptmTime = gmtime(&n);
genesis 381 char pszTime[200];
genesis 382 strftime(pszTime, sizeof(pszTime), pszFormat, ptmTime);
genesis 383 return pszTime;
genesis 384 }
genesis 385
genesis 386 template<typename T>
genesis 387 void skipspaces(T& it)
genesis 388 {
genesis 389 while (isspace(*it))
genesis 390 ++it;
genesis 391 }
genesis 392
genesis 393 inline bool IsSwitchChar(char c)
genesis 394 {
genesis 395 return c == '-';
genesis 396 }
genesis 397
genesis 398 inline std::string GetArg(const std::string& strArg, const std::string& strDefault)
genesis 399 {
genesis 400 if (mapArgs.count(strArg))
genesis 401 return mapArgs[strArg];
genesis 402 return strDefault;
genesis 403 }
genesis 404
genesis 405 inline int64 GetArg(const std::string& strArg, int64 nDefault)
genesis 406 {
genesis 407 if (mapArgs.count(strArg))
genesis 408 return atoi64(mapArgs[strArg]);
genesis 409 return nDefault;
genesis 410 }
genesis 411
genesis 412 inline bool GetBoolArg(const std::string& strArg, bool fDefault=false)
genesis 413 {
genesis 414 if (mapArgs.count(strArg))
genesis 415 {
genesis 416 if (mapArgs[strArg].empty())
genesis 417 return true;
genesis 418 return (atoi(mapArgs[strArg]) != 0);
genesis 419 }
genesis 420 return fDefault;
genesis 421 }
genesis 422
genesis 423
genesis 424 * Set an argument if it doesn't already have a value
genesis 425 *
genesis 426 * @param strArg Argument to set (e.g. "-foo")
genesis 427 * @param strValue Value (e.g. "1")
genesis 428 * @return true if argument gets set, false if it already had a value
genesis 429 */
genesis 430 bool SoftSetArg(const std::string& strArg, const std::string& strValue);
genesis 431
genesis 432
genesis 433 * Set a boolean argument if it doesn't already have a value
genesis 434 *
genesis 435 * @param strArg Argument to set (e.g. "-foo")
genesis 436 * @param fValue Value (e.g. false)
genesis 437 * @return true if argument gets set, false if it already had a value
genesis 438 */
genesis 439 bool SoftSetArg(const std::string& strArg, bool fValue);
genesis 440
genesis 441
genesis 442
genesis 443
genesis 444
genesis 445
genesis 446
genesis 447
genesis 448
genesis 449 inline void heapchk()
genesis 450 {
genesis 451 }
genesis 452
genesis 453
genesis 454 #define IMPLEMENT_RANDOMIZE_STACK(ThreadFn) \
genesis 455 { \
genesis 456 static char nLoops; \
genesis 457 if (nLoops <= 0) \
genesis 458 nLoops = GetRand(20) + 1; \
genesis 459 if (nLoops-- > 1) \
genesis 460 { \
genesis 461 ThreadFn; \
genesis 462 return; \
genesis 463 } \
genesis 464 }
genesis 465
genesis 466 #define CATCH_PRINT_EXCEPTION(pszFn) \
genesis 467 catch (std::exception& e) { \
genesis 468 PrintException(&e, (pszFn)); \
genesis 469 } catch (...) { \
genesis 470 PrintException(NULL, (pszFn)); \
genesis 471 }
genesis 472
genesis 473
genesis 474
genesis 475
genesis 476
genesis 477
genesis 478
genesis 479
genesis 480
genesis 481
genesis 482 template<typename T1>
genesis 483 inline uint256 Hash(const T1 pbegin, const T1 pend)
genesis 484 {
genesis 485 static unsigned char pblank[1];
genesis 486 uint256 hash1;
genesis 487 SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
genesis 488 uint256 hash2;
genesis 489 SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
genesis 490 return hash2;
genesis 491 }
genesis 492
genesis 493 template<typename T1, typename T2>
genesis 494 inline uint256 Hash(const T1 p1begin, const T1 p1end,
genesis 495 const T2 p2begin, const T2 p2end)
genesis 496 {
genesis 497 static unsigned char pblank[1];
genesis 498 uint256 hash1;
genesis 499 SHA256_CTX ctx;
genesis 500 SHA256_Init(&ctx);
genesis 501 SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
genesis 502 SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
genesis 503 SHA256_Final((unsigned char*)&hash1, &ctx);
genesis 504 uint256 hash2;
genesis 505 SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
genesis 506 return hash2;
genesis 507 }
genesis 508
genesis 509 template<typename T1, typename T2, typename T3>
genesis 510 inline uint256 Hash(const T1 p1begin, const T1 p1end,
genesis 511 const T2 p2begin, const T2 p2end,
genesis 512 const T3 p3begin, const T3 p3end)
genesis 513 {
genesis 514 static unsigned char pblank[1];
genesis 515 uint256 hash1;
genesis 516 SHA256_CTX ctx;
genesis 517 SHA256_Init(&ctx);
genesis 518 SHA256_Update(&ctx, (p1begin == p1end ? pblank : (unsigned char*)&p1begin[0]), (p1end - p1begin) * sizeof(p1begin[0]));
genesis 519 SHA256_Update(&ctx, (p2begin == p2end ? pblank : (unsigned char*)&p2begin[0]), (p2end - p2begin) * sizeof(p2begin[0]));
genesis 520 SHA256_Update(&ctx, (p3begin == p3end ? pblank : (unsigned char*)&p3begin[0]), (p3end - p3begin) * sizeof(p3begin[0]));
genesis 521 SHA256_Final((unsigned char*)&hash1, &ctx);
genesis 522 uint256 hash2;
genesis 523 SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
genesis 524 return hash2;
genesis 525 }
genesis 526
genesis 527 template<typename T>
genesis 528 uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=VERSION)
genesis 529 {
genesis 530
genesis 531
genesis 532
genesis 533 CDataStream ss(nType, nVersion);
genesis 534 ss.reserve(10000);
genesis 535 ss << obj;
genesis 536 return Hash(ss.begin(), ss.end());
genesis 537 }
genesis 538
genesis 539 inline uint160 Hash160(const std::vector<unsigned char>& vch)
genesis 540 {
genesis 541 uint256 hash1;
genesis 542 SHA256(&vch[0], vch.size(), (unsigned char*)&hash1);
genesis 543 uint160 hash2;
genesis 544 RIPEMD160((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
genesis 545 return hash2;
genesis 546 }
genesis 547
genesis 548
genesis 549
genesis 550
genesis 551 template <typename T> class CMedianFilter
genesis 552 {
genesis 553 private:
genesis 554 std::vector<T> vValues;
genesis 555 std::vector<T> vSorted;
genesis 556 int nSize;
genesis 557 public:
genesis 558 CMedianFilter(int size, T initial_value):
genesis 559 nSize(size)
genesis 560 {
genesis 561 vValues.reserve(size);
genesis 562 vValues.push_back(initial_value);
genesis 563 vSorted = vValues;
genesis 564 }
genesis 565
genesis 566 void input(T value)
genesis 567 {
genesis 568 if(vValues.size() == nSize)
genesis 569 {
genesis 570 vValues.erase(vValues.begin());
genesis 571 }
genesis 572 vValues.push_back(value);
genesis 573
genesis 574 vSorted.resize(vValues.size());
genesis 575 std::copy(vValues.begin(), vValues.end(), vSorted.begin());
genesis 576 std::sort(vSorted.begin(), vSorted.end());
genesis 577 }
genesis 578
genesis 579 T median() const
genesis 580 {
genesis 581 int size = vSorted.size();
genesis 582 assert(size>0);
genesis 583 if(size & 1)
genesis 584 {
genesis 585 return vSorted[size/2];
genesis 586 }
genesis 587 else
genesis 588 {
genesis 589 return (vSorted[size/2-1] + vSorted[size/2]) / 2;
genesis 590 }
genesis 591 }
genesis 592 };
genesis 593
genesis 594
genesis 595
genesis 596
genesis 597
genesis 598
genesis 599
genesis 600
genesis 601
genesis 602
genesis 603
genesis 604
genesis 605 inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
genesis 606 {
genesis 607 pthread_t hthread = 0;
genesis 608 int ret = pthread_create(&hthread, NULL, (void*(*)(void*))pfn, parg);
genesis 609 if (ret != 0)
genesis 610 {
genesis 611 printf("Error: pthread_create() returned %d\n", ret);
genesis 612 return (pthread_t)0;
genesis 613 }
genesis 614 if (!fWantHandle)
genesis 615 {
genesis 616 pthread_detach(hthread);
genesis 617 return (pthread_t)-1;
genesis 618 }
genesis 619 return hthread;
genesis 620 }
genesis 621
genesis 622 #define THREAD_PRIORITY_LOWEST PRIO_MAX
genesis 623 #define THREAD_PRIORITY_BELOW_NORMAL 2
genesis 624 #define THREAD_PRIORITY_NORMAL 0
genesis 625 #define THREAD_PRIORITY_ABOVE_NORMAL 0
genesis 626
genesis 627 inline void SetThreadPriority(int nPriority)
genesis 628 {
genesis 629
genesis 630
genesis 631 #ifdef PRIO_THREAD
genesis 632 setpriority(PRIO_THREAD, 0, nPriority);
genesis 633 #else
genesis 634 setpriority(PRIO_PROCESS, 0, nPriority);
genesis 635 #endif
genesis 636 }
genesis 637
genesis 638 inline bool TerminateThread(pthread_t hthread, unsigned int nExitCode)
genesis 639 {
genesis 640 return (pthread_cancel(hthread) == 0);
genesis 641 }
genesis 642
genesis 643 inline void ExitThread(size_t nExitCode)
genesis 644 {
genesis 645 pthread_exit((void*)nExitCode);
genesis 646 }
genesis 647
genesis 648
genesis 649
genesis 650 inline bool AffinityBugWorkaround(void(*pfn)(void*))
genesis 651 {
genesis 652 return false;
genesis 653 }
genesis 654
genesis 655 inline uint32_t ByteReverse(uint32_t value)
genesis 656 {
genesis 657 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
genesis 658 return (value<<16) | (value>>16);
genesis 659 }
genesis 660
genesis 661 #endif