Commit 52e45c01 authored by gbalduzz's avatar gbalduzz
Browse files

Use weak_ptr inside the signal handler.

parent b6d05d40
Loading
Loading
Loading
Loading
+21 −19
Original line number Diff line number Diff line
@@ -111,7 +111,7 @@ private:
  update_chemical_potential_type update_chemical_potential_obj;

  std::string file_name_;
  io::HDF5Writer output_file_;
  std::shared_ptr<io::HDF5Writer> output_file_;

  unsigned dca_iteration_ = 0;

@@ -137,11 +137,12 @@ DcaLoop<ParametersType, DcaDataType, MCIntegratorType>::DcaLoop(ParametersType&

      update_chemical_potential_obj(parameters, MOMS, cluster_mapping_obj),

      output_file_(false),

      monte_carlo_integrator_(parameters_ref, MOMS_ref) {
  if (concurrency.id() == concurrency.first()) {
    file_name_ = parameters.get_directory() + parameters.get_filename_dca();

    output_file_ = std::make_shared<io::HDF5Writer>(false);

    dca::util::SignalHandler::registerFile(output_file_);

    std::cout << "\n\n\t" << __FUNCTION__ << " has started \t" << dca::util::print_time() << "\n\n";
@@ -153,14 +154,15 @@ void DcaLoop<ParametersType, DcaDataType, MCIntegratorType>::write() {
  if (concurrency.id() == concurrency.first()) {
    std::cout << "\n\n\t\t start writing " << file_name_ << "\t" << dca::util::print_time() << "\n\n";

    output_file_.set_verbose(true);
    output_file_->set_verbose(true);

    parameters.write(output_file_);
    MOMS.write(output_file_);
    monte_carlo_integrator_.write(output_file_);
    DCA_info_struct.write(output_file_);
    parameters.write(*output_file_);
    MOMS.write(*output_file_);
    monte_carlo_integrator_.write(*output_file_);
    DCA_info_struct.write(*output_file_);

    output_file_.close_file();
    output_file_->close_file();
    output_file_.reset();

    std::error_code code;
    std::filesystem::rename(file_name_ + ".tmp", file_name_, code);
@@ -192,7 +194,7 @@ void DcaLoop<ParametersType, DcaDataType, MCIntegratorType>::initialize() {
  }

  if (concurrency.id() == concurrency.first()) {
    output_file_.open_file(file_name_ + ".tmp", parameters.autoresume() ? false : true);
    output_file_->open_file(file_name_ + ".tmp", parameters.autoresume() ? false : true);
  }
}

@@ -378,17 +380,17 @@ void DcaLoop<ParametersType, DcaDataType, MCIntegratorType>::logSelfEnergy(int i
  DCA_info_struct.last_completed_iteration = i;

  if (output_file_) {
    output_file_.open_group("functions");
    output_file_.execute(MOMS.Sigma);
    output_file_.close_group();
    output_file_->open_group("functions");
    output_file_->execute(MOMS.Sigma);
    output_file_->close_group();

    output_file_.open_group("parameters");
    output_file_.open_group("physics");
    output_file_.execute("chemical-potential", parameters.get_chemical_potential());
    output_file_.close_group();
    output_file_.close_group();
    output_file_->open_group("parameters");
    output_file_->open_group("physics");
    output_file_->execute("chemical-potential", parameters.get_chemical_potential());
    output_file_->close_group();
    output_file_->close_group();

    DCA_info_struct.write(output_file_);
    DCA_info_struct.write(*output_file_);
  }
}

+3 −2
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#ifndef DCA_UTIL_SIGNAL_HANDLER_HPP
#define DCA_UTIL_SIGNAL_HANDLER_HPP

#include <memory>
#include <vector>

#include "dca/io/hdf5/hdf5_writer.hpp"
@@ -23,13 +24,13 @@ class SignalHandler{
public:
    static void init(bool verbose = false);

    static void registerFile(io::HDF5Writer& writer);
    static void registerFile(const std::shared_ptr<io::HDF5Writer>& writer);

private:
    static void handle(int signum);

    static inline bool verbose_;
    static inline std::vector<io::HDF5Writer*> file_ptrs_;
    static inline std::vector<std::weak_ptr<io::HDF5Writer>> file_ptrs_;
};

}  // namespace util
+8 −5
Original line number Diff line number Diff line
@@ -33,14 +33,17 @@ void SignalHandler::handle(int signum) {
  if (verbose_)
    std::cerr << "Received signal (" << signum << ") received." << std::endl;

  for (auto file : file_ptrs_)
  for (auto file_ptr : file_ptrs_) {
    auto file = file_ptr.lock();
    if (file)
      file->close_file();
  }

  exit(signum);
}

void SignalHandler::registerFile(io::HDF5Writer& writer) {
  file_ptrs_.push_back(&writer);
void SignalHandler::registerFile(const std::shared_ptr<io::HDF5Writer>& writer) {
  file_ptrs_.emplace_back(writer);
}

}  // namespace util