Program Listing for File main_free_cmem.cpp

Return to documentation for file (main_free_cmem.cpp)

#include "cmem_rcc/cmem_rcc.h"
#include "ers/ers.h"
#include "felixtag.h"
#include <stdlib.h>

ERS_DECLARE_ISSUE(felix_log, free_cmem_issue, issue_message, ((const std::string&)issue_message))

void cmem_unlock_and_free_by_handle(int handle)
{
  char err_msg[256];  // size hard-coded in rcc_error.h

  unsigned int ret = CMEM_OpenNopage();
  if (ret != 0) {
    rcc_error_string(err_msg, ret);
    ers::error(felix_log::free_cmem_issue(std::format("Failed to open CMEM: {}", err_msg)));
    exit(1);
  }

  ret = CMEM_SegmentUnlock(handle);
  if (ret) {
    rcc_error_string(err_msg, ret);
    ers::error(
      felix_log::free_cmem_issue(std::format("Failed to unlock segment {}: {}", handle, err_msg)));
    exit(1);
  }

  ret = CMEM_GFPBPASegmentFree(handle);
  if (ret) {
    rcc_error_string(err_msg, ret);
    ers::error(
      felix_log::free_cmem_issue(std::format("Failed to free segment {}: {}", handle, err_msg)));
    exit(1);
  }

  ret = CMEM_Close();
  if (ret) {
    rcc_error_string(err_msg, ret);
    ers::error(felix_log::free_cmem_issue(std::format("Failed to close CMEM: {}", err_msg)));
    exit(1);
  }
}

void cmem_unlock_and_free_by_name(char* cmem_name)
{
  char err_msg[256];  // size hard-coded in rcc_error.h

  unsigned int ret = CMEM_OpenNopage();
  if (ret != 0) {
    rcc_error_string(err_msg, ret);
    ers::error(felix_log::free_cmem_issue(std::format("Failed to open CMEM: {}", err_msg)));
    exit(1);
  }

  ret = CMEM_SegmentUnlockAndFree(cmem_name);
  if (ret) {
    rcc_error_string(err_msg, ret);
    ers::error(felix_log::free_cmem_issue(
      std::format("Failed to unlock segment {}: {}", cmem_name, err_msg)));
    exit(1);
  }

  ret = CMEM_Close();
  if (ret) {
    rcc_error_string(err_msg, ret);
    ers::error(felix_log::free_cmem_issue(std::format("Failed to close CMEM: {}", err_msg)));
    exit(1);
  }

  ERS_INFO(std::format("Unlocked and freed segment {}", cmem_name));
}

int main(int argc, char** argv)
{
  if (argc != 2) {
    ers::error(felix_log::free_cmem_issue(std::format("Usage: {} <handle/name>", argv[0])));
    ERS_INFO(std::format("Version {}", FELIX_TAG));
    return 1;
  }

  char* name = argv[1];
  char* end;
  int handle = strtol(name, &end, 0);
  if (*end == '\0') {
    cmem_unlock_and_free_by_handle(handle);
  } else {
    cmem_unlock_and_free_by_name(name);
  }
}