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);
}
}