Merge branch '0.5.x' into 0.6.0.x
authorLuke Dashjr <luke-jr+git@utopios.org>
Thu, 14 Jun 2012 18:13:46 +0000 (18:13 +0000)
committerLuke Dashjr <luke-jr+git@utopios.org>
Thu, 14 Jun 2012 18:13:46 +0000 (18:13 +0000)
Conflicts:
src/main.h
src/net.cpp
src/serialize.h

18 files changed:
.gitignore
contrib/debian/control
contrib/gitian-downloader/linux-download-config
contrib/gitian-downloader/win32-download-config
doc/build-unix.txt
doc/release-process.txt
src/bitcoinrpc.cpp
src/init.cpp
src/init.h
src/main.cpp
src/net.cpp
src/qt/addressbookpage.cpp
src/qt/bitcoin.cpp
src/qt/bitcoingui.cpp
src/qt/forms/overviewpage.ui
src/qtui.h
src/test/test_bitcoin.cpp
src/util.cpp

index 6ed527d..95152ce 100644 (file)
@@ -1,6 +1,7 @@
 src/*.exe
 src/bitcoin
 src/bitcoind
+src/test_bitcoin
 .*.swp
 *.*~*
 *.bak
index 745fd71..b81c02e 100644 (file)
@@ -35,7 +35,7 @@ Description: peer-to-peer network based digital currency - daemon
  By default connects to an IRC network to discover other peers.
  .
  Full transaction history is stored locally at each client.  This
- requires 150+ MB of space, slowly growing.
+ requires 2+ GB of space, slowly growing.
  .
  This package provides bitcoind, a combined daemon and CLI tool to
  interact with the daemon.
@@ -53,6 +53,6 @@ Description: peer-to-peer network based digital currency - QT GUI
  By default connects to an IRC network to discover other peers.
  .
  Full transaction history is stored locally at each client.  This
- requires 150+ MB of space, slowly growing.
+ requires 2+ GB of space, slowly growing.
  .
  This package provides bitcoin-qt, a GUI for Bitcoin based on QT.
index 88e48e2..aef614d 100644 (file)
@@ -31,7 +31,7 @@ signers:
     weight: 40
     name: "Gavin Andresen"
     key: gavinandresen
-  71A3B16735405025D447E8F274810B012346C9A6
+  71A3B16735405025D447E8F274810B012346C9A6:
     weight: 40
     name: "Wladimir J. van der Laan"
     key: laanwj
index 595626f..0f7032e 100644 (file)
@@ -31,7 +31,7 @@ signers:
     weight: 40
     name: "Gavin Andresen"
     key: gavinandresen
-  71A3B16735405025D447E8F274810B012346C9A6
+  71A3B16735405025D447E8F274810B012346C9A6:
     weight: 40
     name: "Wladimir J. van der Laan"
     key: laanwj
index a9bc551..f93ddcd 100644 (file)
@@ -33,7 +33,7 @@ Dependencies
 miniupnpc may be used for UPnP port mapping.  It can be downloaded from
 http://miniupnp.tuxfamily.org/files/.  UPnP support is compiled in and
 turned off by default.  Set USE_UPNP to a different value to control this:
- USE_UPNP=     No UPnP support - miniupnp not required
+ USE_UPNP=-    No UPnP support - miniupnp not required
  USE_UPNP=0    (the default) UPnP support turned off by default at runtime
  USE_UPNP=1    UPnP support turned on by default at runtime
 
index 05db17e..0bd75fa 100644 (file)
@@ -98,6 +98,8 @@
 
 * update wiki download links
 
+* update wiki changelog: https://en.bitcoin.it/wiki/Changelog
+
 * Commit your signature to gitian.sigs:
   pushd gitian.sigs
   git add ${VERSION}/${SIGNER}
index 71725ac..78812ba 100644 (file)
@@ -223,7 +223,8 @@ Value stop(const Array& params, bool fHelp)
             "Stop bitcoin server.");
 #ifndef QT_GUI
     // Shutdown will take long enough that the response should get back
-    CreateThread(Shutdown, NULL);
+    // NOTE: This should actually work with Bitcoin-Qt too now, but 0.6.0 didn't allow it
+    StartShutdown();
     return "bitcoin server stopping";
 #else
     throw runtime_error("NYI: cannot shut down GUI with RPC command");
@@ -1713,7 +1714,7 @@ Value encryptwallet(const Array& params, bool fHelp)
     // BDB seems to have a bad habit of writing old data into
     // slack space in .dat files; that is bad if the old data is
     // unencrypted private keys.  So:
-    CreateThread(Shutdown, NULL);
+    StartShutdown();
     return "wallet encrypted; bitcoin server stopping, restart to run with encrypted wallet";
 }
 
@@ -2372,10 +2373,6 @@ void ThreadRPCServer(void* parg)
     printf("ThreadRPCServer exiting\n");
 }
 
-#ifdef QT_GUI
-extern bool HACK_SHUTDOWN;
-#endif
-
 void ThreadRPCServer2(void* parg)
 {
     printf("ThreadRPCServer started\n");
@@ -2402,7 +2399,7 @@ void ThreadRPCServer2(void* parg)
                 EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32).c_str()),
             _("Error"), wxOK | wxMODAL);
 #ifndef QT_GUI
-        CreateThread(Shutdown, NULL);
+        StartShutdown();
 #endif
         return;
     }
@@ -2427,9 +2424,9 @@ void ThreadRPCServer2(void* parg)
     }
     catch(boost::system::system_error &e)
     {
-        HACK_SHUTDOWN = true;
         ThreadSafeMessageBox(strprintf(_("An error occured while setting up the RPC port %i for listening: %s"), endpoint.port(), e.what()),
                              _("Error"), wxOK | wxMODAL);
+        StartShutdown();
         return;
     }
 #endif
index 8d8ce8f..586e3da 100644 (file)
@@ -42,6 +42,17 @@ void ExitTimeout(void* parg)
 #endif
 }
 
+void StartShutdown()
+{
+#ifdef QT_GUI
+    // ensure we leave the Qt main loop for a clean GUI exit (Shutdown() is called in bitcoin.cpp afterwards)
+    QueueShutdown();
+#else
+    // Without UI, Shutdown() can simply be started in a new thread
+    CreateThread(Shutdown, NULL);
+#endif
+}
+
 void Shutdown(void* parg)
 {
     static CCriticalSection cs_Shutdown;
@@ -67,7 +78,10 @@ void Shutdown(void* parg)
         Sleep(50);
         printf("Bitcoin exiting\n\n");
         fExit = true;
+#ifndef QT_GUI
+        // ensure non UI client get's exited here, but let Bitcoin-Qt reach return 0; in bitcoin.cpp
         exit(0);
+#endif
     }
     else
     {
index 8089482..f038d7b 100644 (file)
@@ -7,6 +7,7 @@
 
 extern CWallet* pwalletMain;
 
+void StartShutdown();
 void Shutdown(void* parg);
 bool AppInit(int argc, char* argv[]);
 bool AppInit2(int argc, char* argv[]);
index 7ffecaf..a4b0a1d 100644 (file)
@@ -1840,7 +1840,7 @@ bool CheckDiskSpace(uint64 nAdditionalBytes)
         strMiscWarning = strMessage;
         printf("*** %s\n", strMessage.c_str());
         ThreadSafeMessageBox(strMessage, "Bitcoin", wxOK | wxICON_EXCLAMATION);
-        CreateThread(Shutdown, NULL);
+        StartShutdown();
         return false;
     }
     return true;
index 6707d79..d927c50 100644 (file)
@@ -693,7 +693,7 @@ void ThreadSocketHandler2(void* parg)
         if (nSelect == SOCKET_ERROR)
         {
             int nErr = WSAGetLastError();
-            if (hSocketMax > -1)
+            if (hSocketMax != INVALID_SOCKET)
             {
                 printf("socket select error %d\n", nErr);
                 for (unsigned int i = 0; i <= hSocketMax; i++)
@@ -1535,7 +1535,7 @@ void ThreadMessageHandler2(void* parg)
         vnThreadsRunning[THREAD_MESSAGEHANDLER]--;
         Sleep(100);
         if (fRequestShutdown)
-            Shutdown(NULL);
+            StartShutdown();
         vnThreadsRunning[THREAD_MESSAGEHANDLER]++;
         if (fShutdown)
             return;
index 387043a..32d0505 100644 (file)
@@ -121,11 +121,6 @@ void AddressBookPage::setModel(AddressTableModel *model)
     connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
             this, SLOT(selectionChanged()));
 
-    if(mode == ForSending)
-    {
-        // Auto-select first row when in sending mode
-        ui->tableView->selectRow(0);
-    }
     selectionChanged();
 }
 
index 9fea2c1..58070d4 100644 (file)
@@ -123,6 +123,11 @@ void InitMessage(const std::string &message)
     }
 }
 
+void QueueShutdown()
+{
+    QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection);
+}
+
 /*
    Translate string to current locale using Qt.
  */
@@ -290,6 +295,7 @@ int main(int argc, char *argv[])
                 window.hide();
                 guiref = 0;
             }
+            // Shutdown the core and it's threads, but don't exit Bitcoin-Qt here
             Shutdown(NULL);
         }
         else
index 175fc4f..4918ddd 100644 (file)
@@ -552,16 +552,12 @@ void BitcoinGUI::refreshStatusBar()
     setNumBlocks(clientModel->getNumBlocks());
 }
 
-bool HACK_SHUTDOWN = false;
-
 void BitcoinGUI::error(const QString &title, const QString &message, bool modal)
 {
     // Report errors from network/worker thread
     if (modal)
     {
         QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok);
-        if (HACK_SHUTDOWN)
-            QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection);
     } else {
         notificator->notify(Notificator::Critical, title, message);
     }
index 3cf7dd0..10e470e 100644 (file)
@@ -44,7 +44,7 @@
         <item row="2" column="1">
          <widget class="QLabel" name="labelBalance">
           <property name="text">
-           <string>123.456 BTC</string>
+           <string notr="true">0 BTC</string>
           </property>
          </widget>
         </item>
@@ -72,7 +72,7 @@
         <item row="3" column="1">
          <widget class="QLabel" name="labelUnconfirmed">
           <property name="text">
-           <string>0 BTC</string>
+           <string notr="true">0 BTC</string>
           </property>
          </widget>
         </item>
index c25abf5..e6ca0cb 100644 (file)
@@ -46,6 +46,7 @@ extern void ThreadSafeHandleURI(const std::string& strURI);
 extern void CalledSetStatusBar(const std::string& strText, int nField);
 extern void UIThreadCall(boost::function0<void> fn);
 extern void MainFrameRepaint();
+extern void QueueShutdown();
 extern void InitMessage(const std::string &message);
 extern std::string _(const char* psz);
 
index 7ff7545..c7e4bdd 100644 (file)
@@ -26,3 +26,9 @@ void Shutdown(void* parg)
 {
   exit(0);
 }
+
+void StartShutdown()
+{
+  exit(0);
+}
+
index 393f927..94bdba6 100644 (file)
@@ -23,6 +23,7 @@ namespace boost {
 #include <boost/interprocess/sync/interprocess_mutex.hpp>
 #include <boost/interprocess/sync/interprocess_recursive_mutex.hpp>
 #include <boost/foreach.hpp>
+#include <boost/thread.hpp>
 
 using namespace std;
 using namespace boost;
@@ -194,6 +195,8 @@ inline int OutputDebugStringF(const char* pszFormat, ...)
         if (fileout)
         {
             static bool fStartedNewLine = true;
+            static boost::mutex mutexDebugLog;
+            boost::mutex::scoped_lock scoped_lock(mutexDebugLog);
 
             // Debug print useful for profiling
             if (fLogTimestamps && fStartedNewLine)