simplify AddAddress,

readcompactsize limit, 
fixed a 64-bit compile error in serialize.h, 
change status "# blocks" to "# confirmations" and widen the column.
This commit is contained in:
s_nakamoto 2010-01-28 00:31:00 +00:00
parent 95d839f15c
commit 80264be428
11 changed files with 129 additions and 117 deletions

4
db.cpp
View File

@ -134,8 +134,6 @@ void CDB::Close()
CRITICAL_BLOCK(cs_db) CRITICAL_BLOCK(cs_db)
--mapFileUseCount[strFile]; --mapFileUseCount[strFile];
RandAddSeed();
} }
void CloseDb(const string& strFile) void CloseDb(const string& strFile)
@ -456,7 +454,7 @@ bool CAddrDB::LoadAddresses()
CAddress addr(psz, NODE_NETWORK); CAddress addr(psz, NODE_NETWORK);
addr.nTime = 0; // so it won't relay unless successfully connected addr.nTime = 0; // so it won't relay unless successfully connected
if (addr.IsValid()) if (addr.IsValid())
AddAddress(*this, addr); AddAddress(addr);
} }
} }
catch (...) { } catch (...) { }

View File

@ -265,8 +265,7 @@ void ThreadIRCSeed(void* parg)
if (DecodeAddress(pszName, addr)) if (DecodeAddress(pszName, addr))
{ {
addr.nTime = GetAdjustedTime() - 51 * 60; addr.nTime = GetAdjustedTime() - 51 * 60;
CAddrDB addrdb; if (AddAddress(addr))
if (AddAddress(addrdb, addr))
printf("IRC got new address\n"); printf("IRC got new address\n");
nGotIRCAddresses++; nGotIRCAddresses++;
} }

View File

@ -1734,6 +1734,11 @@ bool ProcessMessages(CNode* pfrom)
// Allow exceptions from underlength message on vRecv // Allow exceptions from underlength message on vRecv
printf("ProcessMessage(%s, %d bytes) : Exception '%s' caught, normally caused by a message being shorter than its stated length\n", strCommand.c_str(), nMessageSize, e.what()); printf("ProcessMessage(%s, %d bytes) : Exception '%s' caught, normally caused by a message being shorter than its stated length\n", strCommand.c_str(), nMessageSize, e.what());
} }
else if (strstr(e.what(), ": size too large"))
{
// Allow exceptions from overlong size
printf("ProcessMessage(%s, %d bytes) : Exception '%s' caught\n", strCommand.c_str(), nMessageSize, e.what());
}
else else
{ {
PrintException(&e, "ProcessMessage()"); PrintException(&e, "ProcessMessage()");
@ -1840,7 +1845,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
return error("message addr size() = %d", vAddr.size()); return error("message addr size() = %d", vAddr.size());
// Store the new addresses // Store the new addresses
CAddrDB addrdb;
foreach(CAddress& addr, vAddr) foreach(CAddress& addr, vAddr)
{ {
if (fShutdown) if (fShutdown)
@ -1848,7 +1852,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
addr.nTime = GetAdjustedTime() - 2 * 60 * 60; addr.nTime = GetAdjustedTime() - 2 * 60 * 60;
if (pfrom->fGetAddr) if (pfrom->fGetAddr)
addr.nTime -= 5 * 24 * 60 * 60; addr.nTime -= 5 * 24 * 60 * 60;
AddAddress(addrdb, addr, false); AddAddress(addr, false);
pfrom->AddAddressKnown(addr); pfrom->AddAddressKnown(addr);
if (!pfrom->fGetAddr && addr.IsRoutable()) if (!pfrom->fGetAddr && addr.IsRoutable())
{ {

10
net.cpp
View File

@ -223,7 +223,7 @@ bool GetMyExternalIP(unsigned int& ipRet)
bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline) bool AddAddress(CAddress addr, bool fCurrentlyOnline)
{ {
if (!addr.IsRoutable()) if (!addr.IsRoutable())
return false; return false;
@ -239,7 +239,7 @@ bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline)
// New address // New address
printf("AddAddress(%s)\n", addr.ToStringLog().c_str()); printf("AddAddress(%s)\n", addr.ToStringLog().c_str());
mapAddresses.insert(make_pair(addr.GetKey(), addr)); mapAddresses.insert(make_pair(addr.GetKey(), addr));
addrdb.WriteAddress(addr); CAddrDB().WriteAddress(addr);
return true; return true;
} }
else else
@ -260,7 +260,7 @@ bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline)
fUpdated = true; fUpdated = true;
} }
if (fUpdated) if (fUpdated)
addrdb.WriteAddress(addrFound); CAddrDB().WriteAddress(addrFound);
} }
} }
return false; return false;
@ -881,11 +881,11 @@ void ThreadOpenConnections2(void* parg)
vnThreadsRunning[1]--; vnThreadsRunning[1]--;
Sleep(500); Sleep(500);
const int nMaxConnections = 15; const int nMaxConnections = 15;
while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size()) while (vNodes.size() >= nMaxConnections)
{ {
Sleep(2000);
if (fShutdown) if (fShutdown)
return; return;
Sleep(2000);
} }
vnThreadsRunning[1]++; vnThreadsRunning[1]++;
if (fShutdown) if (fShutdown)

2
net.h
View File

@ -23,7 +23,7 @@ enum
bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet); bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet);
bool GetMyExternalIP(unsigned int& ipRet); bool GetMyExternalIP(unsigned int& ipRet);
bool AddAddress(CAddrDB& addrdb, CAddress addr, bool fCurrentlyOnline=true); bool AddAddress(CAddress addr, bool fCurrentlyOnline=true);
void AddressCurrentlyConnected(const CAddress& addr); void AddressCurrentlyConnected(const CAddress& addr);
CNode* FindNode(unsigned int ip); CNode* FindNode(unsigned int ip);
CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0); CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0);

View File

@ -20,7 +20,7 @@ class CDataStream;
class CAutoFile; class CAutoFile;
static const int VERSION = 200; static const int VERSION = 200;
static const char* pszSubVer = " rc2"; static const char* pszSubVer = " test1";
@ -194,28 +194,32 @@ uint64 ReadCompactSize(Stream& is)
{ {
unsigned char chSize; unsigned char chSize;
READDATA(is, chSize); READDATA(is, chSize);
uint64 nSizeRet = 0;
if (chSize < UCHAR_MAX-2) if (chSize < UCHAR_MAX-2)
{ {
return chSize; nSizeRet = chSize;
} }
else if (chSize == UCHAR_MAX-2) else if (chSize == UCHAR_MAX-2)
{ {
unsigned short nSize; unsigned short nSize;
READDATA(is, nSize); READDATA(is, nSize);
return nSize; nSizeRet = nSize;
} }
else if (chSize == UCHAR_MAX-1) else if (chSize == UCHAR_MAX-1)
{ {
unsigned int nSize; unsigned int nSize;
READDATA(is, nSize); READDATA(is, nSize);
return nSize; nSizeRet = nSize;
} }
else else
{ {
uint64 nSize; uint64 nSize;
READDATA(is, nSize); READDATA(is, nSize);
return nSize; nSizeRet = nSize;
} }
if (nSizeRet > (uint64)INT_MAX)
throw std::ios_base::failure("ReadCompactSize() : size too large");
return nSizeRet;
} }
@ -460,7 +464,7 @@ void Unserialize_impl(Stream& is, std::vector<T, A>& v, int nType, int nVersion,
unsigned int i = 0; unsigned int i = 0;
while (i < nSize) while (i < nSize)
{ {
unsigned int blk = min(nSize - i, 1 + 4999999 / sizeof(T)); unsigned int blk = min(nSize - i, (unsigned int)(1 + 4999999 / sizeof(T)));
v.resize(i + blk); v.resize(i + blk);
is.read((char*)&v[i], blk * sizeof(T)); is.read((char*)&v[i], blk * sizeof(T));
i += blk; i += blk;

17
ui.cpp
View File

@ -349,7 +349,7 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent)
nDateWidth += 12; nDateWidth += 12;
m_listCtrl->InsertColumn(0, "", wxLIST_FORMAT_LEFT, dResize * 0); m_listCtrl->InsertColumn(0, "", wxLIST_FORMAT_LEFT, dResize * 0);
m_listCtrl->InsertColumn(1, "", wxLIST_FORMAT_LEFT, dResize * 0); m_listCtrl->InsertColumn(1, "", wxLIST_FORMAT_LEFT, dResize * 0);
m_listCtrl->InsertColumn(2, "Status", wxLIST_FORMAT_LEFT, dResize * 90); m_listCtrl->InsertColumn(2, "Status", wxLIST_FORMAT_LEFT, dResize * 110);
m_listCtrl->InsertColumn(3, "Date", wxLIST_FORMAT_LEFT, dResize * nDateWidth); m_listCtrl->InsertColumn(3, "Date", wxLIST_FORMAT_LEFT, dResize * nDateWidth);
m_listCtrl->InsertColumn(4, "Description", wxLIST_FORMAT_LEFT, dResize * 409 - nDateWidth); m_listCtrl->InsertColumn(4, "Description", wxLIST_FORMAT_LEFT, dResize * 409 - nDateWidth);
m_listCtrl->InsertColumn(5, "Debit", wxLIST_FORMAT_RIGHT, dResize * 79); m_listCtrl->InsertColumn(5, "Debit", wxLIST_FORMAT_RIGHT, dResize * 79);
@ -579,7 +579,7 @@ string FormatTxStatus(const CWalletTx& wtx)
else if (nDepth < 6) else if (nDepth < 6)
return strprintf("%d/unconfirmed", nDepth); return strprintf("%d/unconfirmed", nDepth);
else else
return strprintf("%d blocks", nDepth); return strprintf("%d confirmations", nDepth);
} }
} }
@ -3706,13 +3706,12 @@ bool CMyApp::OnInit2()
if (mapArgs.count("-addnode")) if (mapArgs.count("-addnode"))
{ {
CAddrDB addrdb;
foreach(string strAddr, mapMultiArgs["-addnode"]) foreach(string strAddr, mapMultiArgs["-addnode"])
{ {
CAddress addr(strAddr, NODE_NETWORK); CAddress addr(strAddr, NODE_NETWORK);
addr.nTime = 0; // so it won't relay unless successfully connected addr.nTime = 0; // so it won't relay unless successfully connected
if (addr.IsValid()) if (addr.IsValid())
AddAddress(addrdb, addr); AddAddress(addr);
} }
} }
@ -3934,3 +3933,13 @@ void SetStartOnSystemStartup(bool fAutoStart)
bool GetStartOnSystemStartup() { return false; } bool GetStartOnSystemStartup() { return false; }
void SetStartOnSystemStartup(bool fAutoStart) { } void SetStartOnSystemStartup(bool fAutoStart) { }
#endif #endif

View File

@ -158,7 +158,7 @@ class CMainFrameBase : public wxFrame
wxListCtrl* m_listCtrlOrdersSent; wxListCtrl* m_listCtrlOrdersSent;
wxListCtrl* m_listCtrlProductsSent; wxListCtrl* m_listCtrlProductsSent;
wxListCtrl* m_listCtrlOrdersReceived; wxListCtrl* m_listCtrlOrdersReceived;
CMainFrameBase( wxWindow* parent, wxWindowID id = wxID_MAINFRAME, const wxString& title = wxT("Bitcoin"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 705,484 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL ); CMainFrameBase( wxWindow* parent, wxWindowID id = wxID_MAINFRAME, const wxString& title = wxT("Bitcoin"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 725,484 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL );
~CMainFrameBase(); ~CMainFrameBase();
}; };

View File

@ -32,7 +32,7 @@
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">CMainFrameBase</property> <property name="name">CMainFrameBase</property>
<property name="pos"></property> <property name="pos"></property>
<property name="size">705,484</property> <property name="size">725,484</property>
<property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property> <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="title">Bitcoin</property> <property name="title">Bitcoin</property>
@ -1737,7 +1737,7 @@
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnUpdateUI"></event> <event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1"> <object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">bSizer55</property> <property name="name">bSizer55</property>
<property name="orient">wxVERTICAL</property> <property name="orient">wxVERTICAL</property>

View File

@ -8,8 +8,8 @@
map<string, string> mapArgs; map<string, string> mapArgs;
map<string, vector<string> > mapMultiArgs; map<string, vector<string> > mapMultiArgs;
bool fDebug = false; bool fDebug = false;
bool fPrintToDebugger = false;
bool fPrintToConsole = false; bool fPrintToConsole = false;
bool fPrintToDebugger = false;
char pszSetDataDir[MAX_PATH] = ""; char pszSetDataDir[MAX_PATH] = "";
bool fShutdown = false; bool fShutdown = false;
@ -75,6 +75,8 @@ void RandAddSeed()
void RandAddSeedPerfmon() void RandAddSeedPerfmon()
{ {
RandAddSeed();
// This can take up to 2 seconds, so only do it every 10 minutes // This can take up to 2 seconds, so only do it every 10 minutes
static int64 nLastPerfmon; static int64 nLastPerfmon;
if (GetTime() < nLastPerfmon + 10 * 60) if (GetTime() < nLastPerfmon + 10 * 60)
@ -129,6 +131,79 @@ uint64 GetRand(uint64 nMax)
inline int OutputDebugStringF(const char* pszFormat, ...)
{
int ret = 0;
if (fPrintToConsole || wxTheApp == NULL)
{
// print to console
va_list arg_ptr;
va_start(arg_ptr, pszFormat);
ret = vprintf(pszFormat, arg_ptr);
va_end(arg_ptr);
}
else
{
// print to debug.log
char pszFile[MAX_PATH+100];
GetDataDir(pszFile);
strlcat(pszFile, "/debug.log", sizeof(pszFile));
FILE* fileout = fopen(pszFile, "a");
if (fileout)
{
//// Debug print useful for profiling
//fprintf(fileout, " %"PRI64d" ", wxGetLocalTimeMillis().GetValue());
va_list arg_ptr;
va_start(arg_ptr, pszFormat);
ret = vfprintf(fileout, pszFormat, arg_ptr);
va_end(arg_ptr);
fclose(fileout);
}
}
#ifdef __WXMSW__
if (fPrintToDebugger)
{
// accumulate a line at a time
static CCriticalSection cs_OutputDebugStringF;
CRITICAL_BLOCK(cs_OutputDebugStringF)
{
static char pszBuffer[50000];
static char* pend;
if (pend == NULL)
pend = pszBuffer;
va_list arg_ptr;
va_start(arg_ptr, pszFormat);
int limit = END(pszBuffer) - pend - 2;
int ret = _vsnprintf(pend, limit, pszFormat, arg_ptr);
va_end(arg_ptr);
if (ret < 0 || ret >= limit)
{
pend = END(pszBuffer) - 2;
*pend++ = '\n';
}
else
pend += ret;
*pend = '\0';
char* p1 = pszBuffer;
char* p2;
while (p2 = strchr(p1, '\n'))
{
p2++;
char c = *p2;
*p2 = '\0';
OutputDebugString(p1);
*p2 = c;
p1 = p2;
}
if (p1 != pszBuffer)
memmove(pszBuffer, p1, pend - p1 + 1);
pend -= (p1 - pszBuffer);
}
}
#endif
return ret;
}
// Safer snprintf // Safer snprintf

101
util.h
View File

@ -112,13 +112,14 @@ inline int myclosesocket(SOCKET& hSocket)
extern map<string, string> mapArgs; extern map<string, string> mapArgs;
extern map<string, vector<string> > mapMultiArgs; extern map<string, vector<string> > mapMultiArgs;
extern bool fDebug; extern bool fDebug;
extern bool fPrintToDebugger;
extern bool fPrintToConsole; extern bool fPrintToConsole;
extern bool fPrintToDebugger;
extern char pszSetDataDir[MAX_PATH]; extern char pszSetDataDir[MAX_PATH];
extern bool fShutdown; extern bool fShutdown;
void RandAddSeed(); void RandAddSeed();
void RandAddSeedPerfmon(); void RandAddSeedPerfmon();
int OutputDebugStringF(const char* pszFormat, ...);
int my_snprintf(char* buffer, size_t limit, const char* format, ...); int my_snprintf(char* buffer, size_t limit, const char* format, ...);
string strprintf(const char* format, ...); string strprintf(const char* format, ...);
bool error(const char* format, ...); bool error(const char* format, ...);
@ -219,92 +220,6 @@ public:
inline int OutputDebugStringF(const char* pszFormat, ...)
{
int ret = 0;
#ifdef __WXDEBUG__
if (!fPrintToConsole)
{
// print to debug.log
char pszFile[MAX_PATH+100];
GetDataDir(pszFile);
strlcat(pszFile, "/debug.log", sizeof(pszFile));
FILE* fileout = fopen(pszFile, "a");
if (fileout)
{
//// Debug print useful for profiling
//fprintf(fileout, " %"PRI64d" ", wxGetLocalTimeMillis().GetValue());
va_list arg_ptr;
va_start(arg_ptr, pszFormat);
ret = vfprintf(fileout, pszFormat, arg_ptr);
va_end(arg_ptr);
fclose(fileout);
}
}
#ifdef __WXMSW__
if (fPrintToDebugger)
{
// accumulate a line at a time
static CCriticalSection cs_OutputDebugStringF;
CRITICAL_BLOCK(cs_OutputDebugStringF)
{
static char pszBuffer[50000];
static char* pend;
if (pend == NULL)
pend = pszBuffer;
va_list arg_ptr;
va_start(arg_ptr, pszFormat);
int limit = END(pszBuffer) - pend - 2;
int ret = _vsnprintf(pend, limit, pszFormat, arg_ptr);
va_end(arg_ptr);
if (ret < 0 || ret >= limit)
{
pend = END(pszBuffer) - 2;
*pend++ = '\n';
}
else
pend += ret;
*pend = '\0';
char* p1 = pszBuffer;
char* p2;
while (p2 = strchr(p1, '\n'))
{
p2++;
char c = *p2;
*p2 = '\0';
OutputDebugString(p1);
*p2 = c;
p1 = p2;
}
if (p1 != pszBuffer)
memmove(pszBuffer, p1, pend - p1 + 1);
pend -= (p1 - pszBuffer);
}
}
#endif
#endif
if (fPrintToConsole)
{
// print to console
va_list arg_ptr;
va_start(arg_ptr, pszFormat);
ret = vprintf(pszFormat, arg_ptr);
va_end(arg_ptr);
}
return ret;
}
inline string i64tostr(int64 n) inline string i64tostr(int64 n)
{ {
return strprintf("%"PRI64d, n); return strprintf("%"PRI64d, n);
@ -415,11 +330,19 @@ inline string DateTimeStrFormat(const char* pszFormat, int64 nTime)
inline void heapchk() inline void heapchk()
{ {
#ifdef __WXMSW__ #ifdef __WXMSW__
if (_heapchk() != _HEAPOK) /// for debugging
DebugBreak(); //if (_heapchk() != _HEAPOK)
// DebugBreak();
#endif #endif
} }