XPCOM Thread Synchronization

This is an archived page. It's not actively maintained.

XPCOM thread synchronization primitives have the same semantics as those in NSPR, and each method of these synchronization objects (e.g. Mutex::Lock()) has a matching function in NSPR (PR_Lock()). This is no accident, as mozilla:: primitives are merely bare-minimum wrappers around NSPR's.

This article covers the API of Mozilla synchronization only. For a higher-level introduction to thread synchronization, see Introduction_to_NSPR.

Quick reference: Difference between nsAutoLock API and new API

Old construction

 

Note: This is deprecated code that is shown only to compare with approved code.
  PRLock* mLock;
  PRMonitor* mMonitor;
  PRCondVar* mCvar;

  FooConstructor() {
  }
  nsresult Init() {
      mLock = nsAutoLock::NewLock("Foo lock");
      // check for null

      mMonitor = nsAutoMonitor::NewMonitor("Foo monitor");
      // check for null

      mCvar = PR_NewCondVar(mRawLock);
      // check for null

      // ...
  }

 

New Construction

 

  using namespace mozilla;

  Mutex mLock;
  Monitor mMonitor;
  CondVar mCvar;

  FooConstructor()
      : mLock("Foo lock"),
        mMonitor("Foo monitor"),
        mCvar(mLock, "Foo condvar") {
  }
  nsresult Init() {
      // ...
  }

 

Old Usage

 

Note: This is deprecated code that is shown only to compare with approved code.
  ConcurrentMethod() {
      nsAutoLock al(mLock);
      nsAutoMonitor am(mMonitor);
      if (needExpensiveComputation()) {
          nsAutoUnlock au(mLock);
      }
      am.Wait();
      PR_NotifyCondVar(mCvar);
  }

 

New Usage

 

  using namespace mozilla;

  ConcurrentMethod() {
      MutexAutoLock al(mLock);
      MonitorAutoEnter am(mMonitor);
      if (needExpensiveComputation()) {
          MutexAutoUnlock au(mLock);
      }
      am.Wait();
      mCvar->Notify();
  }

 

Mozilla Synchronization API reference

The mozilla:: namespace exports the following synchronization primitives.