bool LLPidLockFile::requestLock(LLNameTable<void *> *name_table, bool autosave, bool force_immediate, F32 timeout) { bool readyToSave = FALSE; if (mSaving) return FALSE; //Bail out if we're currently saving. Will not queue another save. if (!mWaiting){ mNameTable=name_table; mAutosave = autosave; } LLSD out_pids; out_pids.append( (LLSD::Integer)mPID ); llifstream ifile(mLockName); if (ifile.is_open()) { //If file exists, we need to decide whether or not to continue. if ( force_immediate || mTimer.hasExpired() ) //Only deserialize if we REALLY need to. { LLSD in_pids; LLSDSerialize::fromXML(in_pids, ifile); //Clean up any dead PIDS that might be in there. for (LLSD::array_iterator i=in_pids.beginArray(); i !=in_pids.endArray(); ++i) { U32 stored_pid=(*i).asInteger(); if (isProcessAlive(stored_pid)) { out_pids.append( (*i) ); } } readyToSave=TRUE; } ifile.close(); } else { readyToSave=TRUE; } if (!mWaiting) //Not presently waiting to save. Queue up. { mTimer.resetWithExpiry(timeout); mWaiting=TRUE; } if (readyToSave) { //Potential race condition won't kill us. Ignore it. writeLockFile(out_pids); mSaving=TRUE; } return readyToSave; }