Program Listing for File ThreadSafeIbarrierRequest.hpp

Return to documentation for file (include/uitsl/concurrent/ThreadSafeIbarrierRequest.hpp)

#pragma once
#ifndef UITSL_CONCURRENT_THREADSAFEIBARRIERREQUEST_HPP_INCLUDE
#define UITSL_CONCURRENT_THREADSAFEIBARRIERREQUEST_HPP_INCLUDE

#include <mutex>

#include <mpi.h>

#include "../../../third-party/Empirical/source/base/optional.h"

#include "../distributed/IbarrierRequest.hpp"

namespace uitsl {

class ThreadSafeIbarrierRequest {

  emp::optional<uitsl::IbarrierRequest> request{ std::nullopt };

  static inline std::mutex mutex{};

public:

  ThreadSafeIbarrierRequest(const MPI_Comm comm=MPI_COMM_WORLD) {
    const std::lock_guard guard{ mutex };
    request.emplace(comm);
  }

  bool IsComplete() const {
    const std::lock_guard guard{ mutex };
    return request->IsComplete();
  }

};

} // namespace uitsl

#endif // #ifndef UITSL_CONCURRENT_THREADSAFEIBARRIERREQUEST_HPP_INCLUDE