openfam::fam::fam_create_region
Create a new region in FAM.
Synopsis
Fam_Region_Descriptor *fam_create_region(char *name, uint64_t size, mode_t permissions, Fam_Redundancy_Level redundancyLevel, ...);
Description
This method creates a region in FAM for subsequent use
Input Arguments
| Name | Description |
|---|---|
| Name | Name of the region to be created. |
| Size | Requested size of the region in bytes. |
| permissions | Permissions to be associated with this region. |
| redundancyLevel | Desired redundancy level. |
Return Values
Descriptor to the created region. Throws an exception on error.
Exceptions
| Exception | Description |
|---|---|
| FAM_ERR_NOPERM | Caller does not have access rights |
| FAM_ERR_ALREADYEXIST | the region name is already present in FAM |
| FAM_ERR_GRPC | there is a communication error with memoryserver |
| FAM_ERR_RPC_CLIENT_NOTFOUND | Memory server initialization failure |
Notes
Note that the system may round up the actual size of the region to align memory boundaries. Currently the maximum size of a region is limited to 16 EiB by the API.
Fam_Region_Descriptor provides a method to retrieve an opaque read-only data structure called Fam_Global_Descriptor which represents both the region and data item in FAM. Fam_Global_Descriptor can be freely copied, and shared across processing nodes by the program, and are portable across operating system and program instances.
// Fam_Global_Descriptor Fam_Region_Descriptor::get_global_descriptor(); Fam_Global_Descriptor gDescriptor = regionDescriptor->get_global_descriptor();
Fam_Region_Descriptor can be instantiated from Fam_Global_Descriptor using the following constructor.
// Fam_Region_Descriptor::Fam_Region_Descriptor(Fam_Global_Descriptor gDescriptor); Fam_Region_Descriptor *rd = new Fam_Region_Descriptor(gDescriptor);
Example
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fam/fam.h>
#include <fam/fam_exception.h>
using namespace std;
using namespace openfam;
int main(void) {
fam *myFam = new fam();
// .. initialization code here
try {
// create a 10 GB region with 0777 permissions and RAID5 redundancy
Fam_Region_Descriptor *rd = myFam->fam_create_region("myRegion", (uint64_t)10000000000, 0777, RAID5);
/ use the created region...
printf("fam_create_region successful\n");
// ... continuation code here
// we are finished. Destroy the region and everything in it
myFam->fam_destroy_region(rd);
printf("fam_destroy_region successful\n");
} catch (Fam_Allocator_Exception &e) {
printf("Create/Destroy region failed: %d: %s\n", e.fam_error(), e.fam_error_msg());
}
// ... finalization code here
}