#include <x/lockpool.H> typedef x::mutexpool<> blocklock_t; blocklock_t mutexpool(blocklock_t::create()); blocklock_t::lockentry usagelock(mutexpool->addLockSet(false, x::eventfd::create()); blocklock_t::lockentry blocklock(mutexpool->addLockSet(true x::eventfd::create());
      x::mutexpool
      is a specialization of a lock pool
      that implements the semantics of a “mutually-exclusive”
      lock.
      The mutually-exclusive lock poool allows only one value to be locked at
      the same time, but the same value may be locked multiple times.
      Attempts to place another lock value into the lock pool get blocked,
      until all existing locks, of the same value, are released.
    
      The above example, using bool
      for a block value is convenient implementation of a "blocking lock" for
      some unspecified resource. The contract is that using this resource
      requires obtaining a false lock value. This allows multiple concurrent
      usage. Concurrent existence of multiple false values is allowed.
    
      Acquiring a true lock value, in this example, effectively blocks usage
      of the protected resource. The true lock value gets acquired only after
      all existing false values no longer exist, and future false lock
      values won't get acquired until the true lock values are gone. Multiple
      true lock values may exist, blocking access to the resource, and
      false lock values won't get acquired until the last true lock is gone.
    
      In this example, the true and false lock values are symmetric. Each
      one blocks the other lock value. The first parameter to this template
      class can be something other than a
      bool, resulting in the same
      semantics: once the first lock value is acquired, only same lock values
      may be acquired additionally; all other lock values are blocked until
      all existing lock values are gone.