Program Listing for File main_free_cmem.cpp

Return to documentation for file (main_free_cmem.cpp)

#include <stdlib.h>
#include "felixtag.h"
#include "log.hpp"
#include "cmem_rcc/cmem_rcc.h"

void cmem_unlock_and_free_by_handle(int handle) {
  int ret = CMEM_OpenNopage();
  if (ret != 0) {
    LOG_ERR("Failed to open CMEM");
    rcc_error_print(stdout, ret);
    exit(1);
  }

  ret = CMEM_SegmentUnlock(handle);
  if (ret) {
    LOG_ERR("Failed to unlock segment %d", handle);
    rcc_error_print(stdout, ret);
    exit(1);
  }

  ret = CMEM_GFPBPASegmentFree(handle);
  if (ret) {
    LOG_ERR("Failed to free segment %d", handle);
    rcc_error_print(stdout, ret);
    exit(1);
  }

  ret = CMEM_Close();
  if (ret) {
    LOG_ERR("Failed to close CMEM");
    rcc_error_print(stdout, ret);
    exit(1);
  }
}

void cmem_unlock_and_free_by_name(char* cmem_name) {
  int ret = CMEM_OpenNopage();
  if (ret != 0) {
    LOG_ERR("Failed to open CMEM");
    rcc_error_print(stdout, ret);
    exit(1);
  }

  ret = CMEM_SegmentUnlockAndFree(cmem_name);
  if (ret) {
    LOG_ERR("Failed to unlock and free segment %s", cmem_name);
    rcc_error_print(stdout, ret);
    exit(1);
  }

  ret = CMEM_Close();
  if (ret) {
    LOG_ERR("Failed to close CMEM");
    rcc_error_print(stdout, ret);
    exit(1);
  }

  LOG_INFO("Unlocked and freed segment %s", cmem_name);
}

int main(int argc, char** argv)
{
  if(argc != 2) {
    LOG_ERR("Usage: %s <handle/name>", argv[0]);
    LOG_INFO("Version: %s\n", 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);
  }
}