Skip to content

Commit

Permalink
implemented static backend
Browse files Browse the repository at this point in the history
  • Loading branch information
mdorier committed Mar 26, 2024
1 parent 907bb90 commit b9551ee
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 20 deletions.
79 changes: 78 additions & 1 deletion include/flock/flock-backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,98 @@ extern "C" {

struct json_object;

/**
* @brief Initialization arguments.
*
* @note The backend's init_group can call json_object_get on the
* config to increase its reference count and keep it internally
* (the provider does not modify it).
*
* @note The backend's init_group can copy the initial_view internally.
* If it does it, it should memset the flock_backend_init_args's initial_view
* field to 0 so that the provider does not free it.
*/
typedef struct flock_backend_init_args {
margo_instance_id mid;
uint16_t provider_id;
ABT_pool pool;
struct json_object* config;
flock_group_view_t initial_view;
} flock_backend_init_args_t;


typedef flock_return_t (*flock_backend_init_fn)(const flock_backend_init_args_t* args, void**);
/**
* @brief Allocates and initializes the state of the backend.
*
* @param[in] flock_backend_init_args_t* Initialization arguments.
* @param[out] void** Pointer to the allocated state.
*
* @note This function may move some of the fields of the flock_backend_init_args_t
* (see comments about flock_backend_init_args_t above).
*/
typedef flock_return_t (*flock_backend_init_fn)(flock_backend_init_args_t* args, void**);

/**
* @brief Finalizes and deallocate the state of the backend.
*
* @param void* Pointer to the backend's state.
*/
typedef flock_return_t (*flock_backend_finalize_fn)(void*);

/**
* @brief Get the config of the backend and pass it to the
* provided function pointer.
*
* @param void* Pointer to the backend's state.
* @param void (*)(void*, const struct json_object*) Function to call on the config.
* @param void* Context to pass to the function.
*/
typedef flock_return_t (*flock_backend_get_config_fn)(void*, void (*)(void*, const struct json_object*), void*);

/**
* @brief Get the group view held by the backend.
*
* @param void* Pointer to the backend's state.
* @param void (*)(void*, const flock_group_view_t*) Function to call on the group view.
* @param void* Context to pass to the function.
*
* @important This function should NOT lock the view using the view's mtx field.
*/
typedef flock_return_t (*flock_backend_get_view_fn)(void*, void (*)(void*, const flock_group_view_t*), void*);

/**
* @brief Add metadata to the backend.
*
* @param void* Pointer to the backend's state.
* @param const char* Key (null-terminated).
* @param const char* Value (null-terminated).
*/
typedef flock_return_t (*flock_backend_add_metadata_fn)(void*, const char*, const char*);

/**
* @brief Remove metadata from the backend.
*
* @param void* Pointer to the backend's state.
* @param const char* Key (null-terminated).
*/
typedef flock_return_t (*flock_backend_remove_metadata_fn)(void*, const char*);

/**
* @brief Add a member to the group managed by the backend.
*
* @param void* Pointer to the backend's state.
* @param uint64_t Rank of the member to add.
* @param const char* Address of the member.
* @param uint16_t Provider ID of the member.
*/
typedef flock_return_t (*flock_backend_add_member_fn)(void*, uint64_t, const char*, uint16_t);

/**
* @brief Remove a member from the group managed by the backend.
*
* @param void* Pointer to the backend's state.
* @param uint64_t Rank of the member to remove.
*/
typedef flock_return_t (*flock_backend_remove_member_fn)(void*, uint64_t);

/**
Expand Down
11 changes: 5 additions & 6 deletions include/flock/flock-group-view.h
Original file line number Diff line number Diff line change
Expand Up @@ -367,15 +367,14 @@ static inline const char *flock_group_view_find_metadata(const flock_group_view_
}

/**
* @brief Internal serialization function. This function is used by
* hg_proc_flock_group_view_t, which also locks the view while serializing.
* @brief Serialize/deserialize a group view.
*
* @param proc Mercury proc object.
* @param view View to serialize/deserialize.
*
* @return hg_return_t code.
*/
static inline hg_return_t hg_proc_flock_group_view_t_internal(hg_proc_t proc, flock_group_view_t* view) {
static inline hg_return_t hg_proc_flock_group_view_t(hg_proc_t proc, flock_group_view_t* view) {
hg_return_t ret = HG_SUCCESS;
ret = hg_proc_hg_size_t(proc, &view->members.size);
if(ret != HG_SUCCESS) return ret;
Expand Down Expand Up @@ -416,16 +415,16 @@ static inline hg_return_t hg_proc_flock_group_view_t_internal(hg_proc_t proc, fl
}

/**
* @brief Serializes/deserializes a flock_group_view_t.
* @brief Serializes/deserializes a flock_group_view_t and protect its access with a lock.
*
* @param proc Mercury proc object.
* @param view View to serialize/deserialize.
*
* @return hg_return_t code.
*/
static inline hg_return_t hg_proc_flock_group_view_t(hg_proc_t proc, flock_group_view_t* view) {
static inline hg_return_t hg_proc_flock_protected_group_view_t(hg_proc_t proc, flock_group_view_t* view) {
FLOCK_GROUP_VIEW_LOCK(view);
hg_return_t hret = hg_proc_flock_group_view_t_internal(proc, view);
hg_return_t hret = hg_proc_flock_group_view_t(proc, view);
FLOCK_GROUP_VIEW_UNLOCK(view);
return hret;
}
Expand Down
33 changes: 20 additions & 13 deletions src/static/static-backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,20 @@ typedef struct static_context {
} static_context;

static flock_return_t static_create_group(
const flock_backend_init_args_t* args,
flock_backend_init_args_t* args,
void** context)
{
static_context* ctx = (static_context*)calloc(1, sizeof(*ctx));
json_object_deep_copy(args->config, &ctx->config, NULL);
if(!ctx) return FLOCK_ERR_ALLOCATION;

ctx->config = args->config;
json_object_get(ctx->config);

memcpy(&ctx->view.members, &args->initial_view.members, sizeof(ctx->view.members));
memcpy(&ctx->view.metadata, &args->initial_view.metadata, sizeof(ctx->view.metadata));
memset(&args->initial_view.members, 0, sizeof(ctx->view.members));
memset(&args->initial_view.metadata, 0, sizeof(ctx->view.metadata));

*context = ctx;
return FLOCK_SUCCESS;
}
Expand Down Expand Up @@ -49,9 +58,7 @@ static flock_return_t static_get_view(
void* ctx, void (*fn)(void*, const flock_group_view_t* view), void* uargs)
{
static_context* context = (static_context*)ctx;
FLOCK_GROUP_VIEW_LOCK(&context->view);
fn(uargs, &context->view);
FLOCK_GROUP_VIEW_UNLOCK(&context->view);
return FLOCK_SUCCESS;
}

Expand Down Expand Up @@ -91,15 +98,15 @@ static flock_return_t static_remove_metadata(
}

static flock_backend_impl static_backend = {
.name = "static",
.init_group = static_create_group,
.destroy_group = static_destroy_group,
.get_config = static_get_config,
.get_view = static_get_view,
.add_member = static_add_member,
.remove_member = static_remove_member,
.add_metadata = static_add_metadata,
.remove_metadata = static_remove_metadata
.name = "static",
.init_group = static_create_group,
.destroy_group = static_destroy_group,
.get_config = static_get_config,
.get_view = static_get_view,
.add_member = static_add_member,
.remove_member = static_remove_member,
.add_metadata = static_add_metadata,
.remove_metadata = static_remove_metadata
};

flock_return_t flock_register_static_backend(void)
Expand Down

0 comments on commit b9551ee

Please sign in to comment.