commit 8638b9c4966f2697f9f4fb65891768da7df8814e
parent 67c81db102aa328c8488ca9d93367f8714ce4120
Author: Simon Kornblith <simon@simonster.com>
Date: Sun, 3 Jul 2011 04:15:49 +0000
Fixes #1844, Fix connector switching hangs with Firefox 3.6 on Windows. Standalone will just take an extra 5 seconds to start if started while Firefox 3.6 is running.
Diffstat:
1 file changed, 38 insertions(+), 17 deletions(-)
diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
@@ -175,6 +175,11 @@ if(appInfo.platformVersion[0] >= 2) {
*/
this.suppressUIUpdates = false;
+ /**
+ * @property {Boolean} closing True if the application is closing.
+ */
+ this.closing = false;
+
var _startupErrorHandler;
var _zoteroDirectory = false;
var _localizedStringBundle;
@@ -420,6 +425,15 @@ if(appInfo.platformVersion[0] >= 2) {
}
}
+ // Register shutdown handler to call Zotero.shutdown()
+ var _shutdownObserver = {observe:Zotero.shutdown};
+ observerService.addObserver(_shutdownObserver, "quit-application", false);
+
+ // Add shutdown listerner to remove observer
+ this.addShutdownListener(function() {
+ observerService.removeObserver(_shutdownObserver, "quit-application", false);
+ });
+
Zotero.IPC.init();
// Load additional info for connector or not
@@ -428,10 +442,14 @@ if(appInfo.platformVersion[0] >= 2) {
Zotero.Connector_Types.init();
if(!Zotero.isFirstLoadThisSession) {
- // wait for initComplete message if we switched to connector because standalone was
- // started
+ // Wait for initComplete message if we switched to connector because standalone was
+ // started. This shouldn't loop indefinitely, but even if it does, it won't hang
+ // anything (since it will stop looping on shutdown).
_waitingForInitComplete = true;
- while(_waitingForInitComplete) Zotero.mainThread.processNextEvent(true);
+ while(_waitingForInitComplete && !Zotero.closing) {
+ Zotero.mainThread.processNextEvent(true);
+ }
+ if(Zotero.closing) return;
}
Zotero.Repo.init();
@@ -442,15 +460,6 @@ if(appInfo.platformVersion[0] >= 2) {
this.initialized = true;
- // Register shutdown handler to call Zotero.shutdown()
- var _shutdownObserver = {observe:Zotero.shutdown};
- observerService.addObserver(_shutdownObserver, "quit-application", false);
-
- // Add shutdown listerner to remove observer
- this.addShutdownListener(function() {
- observerService.removeObserver(_shutdownObserver, "quit-application", false);
- });
-
Zotero.debug("Initialized in "+((new Date()).getTime() - start)+" ms");
if(!Zotero.isFirstLoadThisSession) {
@@ -645,7 +654,7 @@ if(appInfo.platformVersion[0] >= 2) {
/**
* Initializes the DB connection
*/
- function _initDB() {
+ function _initDB(haveReleasedLock) {
try {
// Test read access
Zotero.DB.test();
@@ -685,12 +694,21 @@ if(appInfo.platformVersion[0] >= 2) {
} else if(e.name == "NS_ERROR_STORAGE_BUSY" || e.result == 2153971713) {
if(Zotero.isStandalone) {
// Standalone should force Fx to release lock
- if(Zotero.IPC.broadcast("releaseLock")) {
+ if(!haveReleasedLock && Zotero.IPC.broadcast("releaseLock")) {
_waitingForDBLock = true;
- while(_waitingForDBLock) Zotero.mainThread.processNextEvent(true);
- // we will want to broadcast when initialization completes
+
+ var timeout = Date.now() + 5000; // 5 second timeout
+ while(_waitingForDBLock && !Zotero.closing && Date.now() < timeout) {
+ Zotero.mainThread.processNextEvent(true);
+ }
+ if(Zotero.closing) return;
+
+ // We will want to broadcast when initialization completes
_broadcastInitComplete = true;
- return _initDB();
+
+ // Run a second init with haveReleasedLock = true, so that
+ // if we still can't acquire a DB lock, we will give up
+ return _initDB(true);
}
} else {
// Fx should start as connector if Standalone is running
@@ -754,6 +772,9 @@ if(appInfo.platformVersion[0] >= 2) {
Zotero.debug("Shutting down Zotero");
try {
+ // set closing to true
+ Zotero.closing = true;
+
// run shutdown listener
for each(var listener in _shutdownListeners) listener();