Added semaphore methods for file contention.

This commit is contained in:
putterman%netscape.com 1999-03-23 23:19:58 +00:00
parent d914f058e8
commit 7abc08db97
5 changed files with 59 additions and 22 deletions

View File

@ -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

View File

@ -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);

View File

@ -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();
};

View File

@ -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();

View File

@ -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;