mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-03 20:49:27 +00:00
Added semaphore methods for file contention.
This commit is contained in:
parent
d914f058e8
commit
7abc08db97
@ -89,6 +89,8 @@ NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_MAILNEWS, value)
|
||||
#define NS_MSG_MESSAGE_NOT_FOUND NS_MSG_GENERATE_FAILURE(8)
|
||||
#define NS_MSG_NOT_A_MAIL_FOLDER NS_MSG_GENERATE_FAILURE(9)
|
||||
|
||||
#define NS_MSG_FOLDER_BUSY NS_MSG_GENERATE_FAILURE(10)
|
||||
|
||||
#ifdef XP_MAC
|
||||
# define LINEBREAK "\015"
|
||||
# define LINEBREAK_LEN 1
|
||||
|
@ -189,6 +189,18 @@ class nsIMsgFolder : public nsIFolder {
|
||||
/* void DeleteMessage (in nsIMessage message); */
|
||||
NS_IMETHOD DeleteMessage(nsIMessage *message) = 0;
|
||||
|
||||
/* void AcquireSemaphore (in nsISupports semHolder); */
|
||||
NS_IMETHOD AcquireSemaphore(nsISupports *semHolder) = 0;
|
||||
|
||||
/* void ReleaseSemaphore (in nsISupports semHolder); */
|
||||
NS_IMETHOD ReleaseSemaphore(nsISupports *semHolder) = 0;
|
||||
|
||||
/* boolean TestSemaphore (in nsISupports semHolder); */
|
||||
NS_IMETHOD TestSemaphore(nsISupports *semHolder, PRBool *_retval) = 0;
|
||||
|
||||
/* boolean IsLocked (); */
|
||||
NS_IMETHOD IsLocked(PRBool *_retval) = 0;
|
||||
|
||||
#ifdef XPIDL_JS_STUBS
|
||||
static NS_EXPORT_(JSObject *) InitJSClass(JSContext *cx);
|
||||
static NS_EXPORT_(JSObject *) GetJSObject(JSContext *cx, nsIMsgFolder *priv);
|
||||
|
@ -112,6 +112,12 @@ interface nsIMsgFolder : nsIFolder {
|
||||
|
||||
void DeleteMessage(in nsIMessage message);
|
||||
|
||||
void AcquireSemaphore (in nsISupports semHolder);
|
||||
void ReleaseSemaphore (in nsISupports semHolder);
|
||||
boolean TestSemaphore (in nsISupports semHolder);
|
||||
boolean IsLocked();
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -48,9 +48,7 @@ nsMsgFolder::nsMsgFolder(void)
|
||||
mMaster = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SEMAPHORE
|
||||
mSemaphoreHolder = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DB
|
||||
mLastMessageLoaded = nsMsgKey_None;
|
||||
@ -1203,11 +1201,12 @@ NS_IMETHODIMP nsMsgFolder::ReadDBFolderInfo(PRBool force)
|
||||
|
||||
folderInfo->GetNumMessages(&mNumTotalMessages);
|
||||
folderInfo->GetNumNewMessages(&mNumUnreadMessages);
|
||||
|
||||
mNumPendingTotalMessages = folderInfo->GetImapTotalPendingMessages();
|
||||
mNumPendingUnreadMessages = folderInfo->GetImapUnreadPendingMessages();
|
||||
|
||||
//These should be put in IMAP folder only.
|
||||
// mNumPendingTotalMessages = folderInfo->GetImapTotalPendingMessages();
|
||||
// mNumPendingUnreadMessages = folderInfo->GetImapUnreadPendingMessages();
|
||||
|
||||
mCsid = folderInfo->GetCSID();
|
||||
// mCsid = folderInfo->GetCSID();
|
||||
if (db && !db->HasNew() && mNumPendingUnreadMessages <= 0)
|
||||
ClearFlag(MSG_FOLDER_FLAG_GOT_NEW);
|
||||
}
|
||||
@ -1220,27 +1219,48 @@ NS_IMETHODIMP nsMsgFolder::ReadDBFolderInfo(PRBool force)
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_SEMAPHORE
|
||||
NS_IMETHODIMP nsMsgFolder::AcquireSemaphore(void *semHolder)
|
||||
NS_IMETHODIMP nsMsgFolder::AcquireSemaphore(nsISupports *semHolder)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (mSemaphoreHolder == NULL)
|
||||
{
|
||||
mSemaphoreHolder = semHolder;
|
||||
mSemaphoreHolder->AddRef();
|
||||
}
|
||||
else
|
||||
rv = NS_MSG_FOLDER_BUSY;
|
||||
|
||||
return rv;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsMsgFolder::ReleaseSemaphore(void *semHolder)
|
||||
NS_IMETHODIMP nsMsgFolder::ReleaseSemaphore(nsISupports *semHolder)
|
||||
{
|
||||
|
||||
if (!mSemaphoreHolder || mSemaphoreHolder == semHolder)
|
||||
{
|
||||
if(mSemaphoreHolder)
|
||||
mSemaphoreHolder->Release();
|
||||
mSemaphoreHolder = NULL;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsMsgFolder::TestSemaphore(void *semHolder, PRBool *result)
|
||||
NS_IMETHODIMP nsMsgFolder::TestSemaphore(nsISupports *semHolder, PRBool *result)
|
||||
{
|
||||
if(!result)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*result = (mSemaphoreHolder == semHolder);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsMsgFolder::IsLocked(PRBool *isLocked)
|
||||
{
|
||||
*isLocked = mSemaphoreHolder != NULL;
|
||||
}
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PANE
|
||||
MWContext *GetFolderPaneContext();
|
||||
|
@ -233,12 +233,11 @@ public:
|
||||
NS_IMETHOD ReadDBFolderInfo(PRBool force);
|
||||
|
||||
|
||||
#ifdef HAVE_SEMAPHORE
|
||||
nsresult AcquireSemaphore(void *semHolder);
|
||||
void ReleaseSemaphore(void *semHolder);
|
||||
PRBool TestSemaphore(void *semHolder);
|
||||
PRBool IsLocked() { return m_semaphoreHolder != NULL; }
|
||||
#endif
|
||||
//For file contention
|
||||
NS_IMETHOD AcquireSemaphore (nsISupports *semHolder);
|
||||
NS_IMETHOD ReleaseSemaphore (nsISupports *semHolder);
|
||||
NS_IMETHOD TestSemaphore (nsISupports *semHolder, PRBool *isSemaphoreHolder);
|
||||
NS_IMETHOD IsLocked(PRBool *isLocked);
|
||||
|
||||
#ifdef HAVE_PANE
|
||||
MWContext *GetFolderPaneContext();
|
||||
@ -295,9 +294,7 @@ protected:
|
||||
PRInt16 mCsid; // default csid for folder/newsgroup - maintained by fe.
|
||||
PRUint8 mDepth;
|
||||
PRInt32 mPrefFlags; // prefs like MSG_PREF_OFFLINE, MSG_PREF_ONE_PANE, etc
|
||||
#ifdef HAVE_SEMAPHORE
|
||||
void *mSemaphoreHolder; // set when the folder is being written to
|
||||
#endif
|
||||
nsISupports *mSemaphoreHolder; // set when the folder is being written to
|
||||
|
||||
#ifdef HAVE_DB
|
||||
nsMsgKey m_lastMessageLoaded;
|
||||
|
Loading…
x
Reference in New Issue
Block a user