diff --git a/cryptopp/secblock.h b/cryptopp/secblock.h index 5e388291..2025757d 100644 --- a/cryptopp/secblock.h +++ b/cryptopp/secblock.h @@ -184,8 +184,8 @@ public: void deallocate(void *p, size_type n) { - //// Bitcoin: can't figure out why this is tripping on a few compiles. - //assert(false); + //// Bitcoin: don't know why this trips, probably a false alarm, depends on the compiler used. + //assert(false); } size_type max_size() const {return 0;} diff --git a/headers.h b/headers.h index 682f7ab1..31e67120 100644 --- a/headers.h +++ b/headers.h @@ -99,6 +99,7 @@ #include #include #include +#include #endif #ifdef BSD #include diff --git a/init.cpp b/init.cpp index 43a672f5..95204ad3 100644 --- a/init.cpp +++ b/init.cpp @@ -10,7 +10,6 @@ - ////////////////////////////////////////////////////////////////////////////// // // Shutdown @@ -57,6 +56,11 @@ void Shutdown(void* parg) } } +void HandleSIGTERM(int) +{ + fRequestShutdown = true; +} + @@ -130,6 +134,14 @@ bool AppInit2(int argc, char* argv[]) #ifndef __WXMSW__ umask(077); #endif +#ifndef __WXMSW__ + // Clean shutdown on SIGTERM + struct sigaction sa; + sa.sa_handler = HandleSIGTERM; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sigaction(SIGTERM, &sa, NULL); +#endif // // Parameters diff --git a/main.cpp b/main.cpp index 835b7c7a..e3c44145 100644 --- a/main.cpp +++ b/main.cpp @@ -2767,6 +2767,68 @@ inline void SHA256Transform(void* pstate, void* pinput, const void* pinit) static const int NPAR = 32; extern void Double_BlockSHA256(const void* pin, void* pout, const void* pinit, unsigned int hash[8][NPAR], const void* init2); +#ifdef __GNUC__ +void CallCPUID(int in, int& aret, int& cret) +{ + int a, c; + asm ( + "mov %2, %%eax; " // in into eax + "cpuid;" + "mov %%eax, %0;" // eax into ret + "mov %%ecx, %1;" // eax into ret + :"=r"(a),"=r"(c) /* output */ + :"r"(in) /* input */ + :"%eax","%ecx" /* clobbered register */ + ); + aret = a; + cret = c; +} + +bool Detect128BitSSE2() +{ + int a, c, nBrand; + CallCPUID(0, a, nBrand); + bool fIntel = (nBrand == 0x6c65746e); // ntel + bool fAMD = (nBrand == 0x444d4163); // cAMD + + struct + { + unsigned int nStepping : 4; + unsigned int nModel : 4; + unsigned int nFamily : 4; + unsigned int nProcessorType : 2; + unsigned int nUnused : 2; + unsigned int nExtendedModel : 4; + unsigned int nExtendedFamily : 8; + } + cpu; + CallCPUID(1, a, c); + memcpy(&cpu, &a, sizeof(cpu)); + int nFamily = cpu.nExtendedFamily + cpu.nFamily; + int nModel = cpu.nExtendedModel*16 + cpu.nModel; + + // We need Intel Nehalem or AMD K10 or better for 128bit SSE2 + // Nehalem = i3/i5/i7 and some Xeon + // K10 = Opterons with 4 or more cores, Phenom, Phenom II, Athlon II + // Intel Core i5 family 6, model 26 or 30 + // Intel Core i7 family 6, model 26 or 30 + // Intel Core i3 family 6, model 37 + // AMD Phenom family 16, model 10 + bool fUseSSE2 = ((fIntel && nFamily * 10000 + nModel >= 60026) || + (fAMD && nFamily * 10000 + nModel >= 160010)); + + static bool fPrinted; + if (!fPrinted) + { + fPrinted = true; + printf("CPUID %08x family %d, model %d, stepping %d, fUseSSE2=%d\n", nBrand, nFamily, nModel, cpu.nStepping, fUseSSE2); + } + return fUseSSE2; +} +#else +bool Detect128BitSSE2() { return false; } +#endif + @@ -2774,6 +2836,9 @@ void BitcoinMiner() { printf("BitcoinMiner started\n"); SetThreadPriority(THREAD_PRIORITY_LOWEST); + bool f4WaySSE2 = Detect128BitSSE2(); + if (mapArgs.count("-4way")) + f4WaySSE2 = (mapArgs["-4way"] != "0"); CKey key; key.MakeNewKey(); @@ -2913,7 +2978,6 @@ void BitcoinMiner() // // Search // - bool f4WaySSE2 = mapArgs.count("-4way"); int64 nStart = GetTime(); uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256(); uint256 hashbuf[2]; diff --git a/net.cpp b/net.cpp index d1fdd241..82b3ffb1 100644 --- a/net.cpp +++ b/net.cpp @@ -1160,9 +1160,13 @@ void ThreadMessageHandler2(void* parg) pnode->Release(); } - // Wait and allow messages to bunch up + // Wait and allow messages to bunch up. + // Reduce vnThreadsRunning so StopNode has permission to exit while + // we're sleeping, but we must always check fShutdown after doing this. vnThreadsRunning[2]--; Sleep(100); + if (fRequestShutdown) + Shutdown(NULL); vnThreadsRunning[2]++; if (fShutdown) return; diff --git a/serialize.h b/serialize.h index 5ded6bf0..2b88d353 100644 --- a/serialize.h +++ b/serialize.h @@ -23,7 +23,7 @@ class CAutoFile; static const unsigned int MAX_SIZE = 0x02000000; static const int VERSION = 312; -static const char* pszSubVer = ".1"; +static const char* pszSubVer = ".2"; diff --git a/util.cpp b/util.cpp index ef2e6834..9efa20ed 100644 --- a/util.cpp +++ b/util.cpp @@ -11,6 +11,7 @@ bool fDebug = false; bool fPrintToConsole = false; bool fPrintToDebugger = false; char pszSetDataDir[MAX_PATH] = ""; +bool fRequestShutdown = false; bool fShutdown = false; bool fDaemon = false; bool fCommandLine = false; diff --git a/util.h b/util.h index 22ace616..42d1fe46 100644 --- a/util.h +++ b/util.h @@ -140,6 +140,7 @@ extern bool fDebug; extern bool fPrintToConsole; extern bool fPrintToDebugger; extern char pszSetDataDir[MAX_PATH]; +extern bool fRequestShutdown; extern bool fShutdown; extern bool fDaemon; extern bool fCommandLine;