void CacheFileOutputStream::NotifyListener() { mFile->AssertOwnsLock(); LOG(("CacheFileOutputStream::NotifyListener() [this=%p]", this)); MOZ_ASSERT(mCallback); if (!mCallbackTarget) { mCallbackTarget = CacheFileIOManager::IOTarget(); if (!mCallbackTarget) { LOG(("CacheFileOutputStream::NotifyListener() - Cannot get Cache I/O " "thread! Using main thread for callback.")); mCallbackTarget = do_GetMainThread(); } } nsCOMPtr<nsIOutputStreamCallback> asyncCallback = NS_NewOutputStreamReadyEvent(mCallback, mCallbackTarget); mCallback = nullptr; mCallbackTarget = nullptr; asyncCallback->OnOutputStreamReady(this); }
void CacheFileOutputStream::NotifyListener() { mFile->AssertOwnsLock(); LOG(("CacheFileOutputStream::NotifyListener() [this=%p]", this)); MOZ_ASSERT(mCallback); if (!mCallbackTarget) mCallbackTarget = NS_GetCurrentThread(); nsCOMPtr<nsIOutputStreamCallback> asyncCallback = NS_NewOutputStreamReadyEvent(mCallback, mCallbackTarget); mCallback = nullptr; mCallbackTarget = nullptr; asyncCallback->OnOutputStreamReady(this); }
NS_IMETHODIMP nsPipeOutputStream::AsyncWait(nsIOutputStreamCallback *callback, PRUint32 flags, PRUint32 requestedCount, nsIEventTarget *target) { LOG(("OOO AsyncWait [this=%x]\n", this)); nsPipeEvents pipeEvents; { nsAutoMonitor mon(mPipe->mMonitor); // replace a pending callback mCallback = 0; mCallbackFlags = 0; if (!callback) return NS_OK; nsCOMPtr<nsIOutputStreamCallback> proxy; if (target) { nsresult rv = NS_NewOutputStreamReadyEvent(getter_AddRefs(proxy), callback, target); if (NS_FAILED(rv)) return rv; callback = proxy; } if (NS_FAILED(mPipe->mStatus) || (mWritable && !(flags & WAIT_CLOSURE_ONLY))) { // stream is already closed or writable; post event. pipeEvents.NotifyOutputReady(this, callback); } else { // queue up callback object to be notified when data becomes available mCallback = callback; mCallbackFlags = flags; } } return NS_OK; }