mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	In order to make things clearer, we: - Use already_AddRefed for Get and GetOrCreate's return, ensuring the AddRef happens under the locked mutex and expecting that callers hold a strong reference until they need it. - Make mThread const, such that there can never be a situation where we cannot use it as long as we have our RemoteLazyInputStreamThread instance. - Add thread safety annotions for gRemoteLazyThreadMutex. We can rely on mThread refusing to work after shutdown, in particular to dispatch runnables, such that we can just delegate most calls without additional checks. We also remove the previous explicit observer implementation in favor of the simpler RunOnShutdown. Differential Revision: https://phabricator.services.mozilla.com/D227036
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | 
						|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | 
						|
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
#include "RemoteLazyInputStreamChild.h"
 | 
						|
#include "RemoteLazyInputStreamThread.h"
 | 
						|
 | 
						|
namespace mozilla {
 | 
						|
 | 
						|
extern mozilla::LazyLogModule gRemoteLazyStreamLog;
 | 
						|
 | 
						|
RemoteLazyInputStreamChild::RemoteLazyInputStreamChild(const nsID& aID)
 | 
						|
    : mID(aID) {}
 | 
						|
 | 
						|
RemoteLazyInputStreamChild::~RemoteLazyInputStreamChild() = default;
 | 
						|
 | 
						|
void RemoteLazyInputStreamChild::StreamCreated() {
 | 
						|
  size_t count = ++mStreamCount;
 | 
						|
  MOZ_LOG(gRemoteLazyStreamLog, LogLevel::Verbose,
 | 
						|
          ("Child::StreamCreated %s = %zu", nsIDToCString(mID).get(), count));
 | 
						|
}
 | 
						|
 | 
						|
void RemoteLazyInputStreamChild::StreamConsumed() {
 | 
						|
  size_t count = --mStreamCount;
 | 
						|
  MOZ_LOG(gRemoteLazyStreamLog, LogLevel::Verbose,
 | 
						|
          ("Child::StreamConsumed %s = %zu", nsIDToCString(mID).get(), count));
 | 
						|
 | 
						|
  // When the count reaches zero, close the underlying actor.
 | 
						|
  if (count == 0) {
 | 
						|
    RefPtr<RemoteLazyInputStreamThread> t = RemoteLazyInputStreamThread::Get();
 | 
						|
    if (t) {
 | 
						|
      t->Dispatch(
 | 
						|
          NS_NewRunnableFunction("RemoteLazyInputStreamChild::StreamConsumed",
 | 
						|
                                 [self = RefPtr{this}]() {
 | 
						|
                                   if (self->CanSend()) {
 | 
						|
                                     self->SendGoodbye();
 | 
						|
                                   }
 | 
						|
                                 }));
 | 
						|
    }  // else the xpcom thread shutdown has already started.
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void RemoteLazyInputStreamChild::ActorDestroy(ActorDestroyReason aReason) {
 | 
						|
  if (mStreamCount != 0) {
 | 
						|
    NS_WARNING(
 | 
						|
        nsPrintfCString("RemoteLazyInputStreamChild disconnected unexpectedly "
 | 
						|
                        "(%zu streams remaining)! %p %s",
 | 
						|
                        size_t(mStreamCount), this, nsIDToCString(mID).get())
 | 
						|
            .get());
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace mozilla
 |