Loading examples/c/ADM_register_job.c +35 −4 Original line number Diff line number Diff line Loading @@ -2,6 +2,9 @@ #include <stdio.h> #include <admire.h> #define NINPUTS 10 #define NOUTPUTS 5 int main(int argc, char* argv[]) { Loading @@ -14,10 +17,30 @@ main(int argc, char* argv[]) { int exit_status = EXIT_SUCCESS; ADM_server_t server = ADM_server_create("tcp", argv[1]); ADM_job_t job; #if 0 ADM_job_requirements_t reqs = ADM_job_requirements_init(); ADM_dataset_info_t info = ADM_dataset_info_init(); ADM_dataset_handle_t inputs[NINPUTS]; for(int i = 0; i < NINPUTS; ++i) { const char* pattern = "input-dataset-%d"; size_t n = snprintf(NULL, 0, pattern, i); char* id = (char*) malloc(n + 1); snprintf(id, n, pattern, i); inputs[i] = ADM_dataset_create(id); } ADM_dataset_handle_t outputs[NOUTPUTS]; for(int i = 0; i < NOUTPUTS; ++i) { const char* pattern = "output-dataset-%d"; size_t n = snprintf(NULL, 0, pattern, i); char* id = (char*) malloc(n + 1); snprintf(id, n, pattern, i); outputs[i] = ADM_dataset_create(id); } ADM_job_requirements_t reqs = ADM_job_requirements_create( inputs, NINPUTS, outputs, NOUTPUTS, NULL); ADM_return_t ret = ADM_register_job(server, reqs, &job); if(ret != ADM_SUCCESS) { Loading @@ -26,12 +49,20 @@ main(int argc, char* argv[]) { exit_status = EXIT_FAILURE; goto cleanup; } #endif fprintf(stdout, "ADM_register_job() remote procedure completed " "successfully\n"); cleanup: for(int i = 0; i < NINPUTS; ++i) { ADM_dataset_destroy(inputs[i]); } for(int i = 0; i < NOUTPUTS; ++i) { ADM_dataset_destroy(outputs[i]); } ADM_server_destroy(server); exit(exit_status); } src/api/admire.h +38 −11 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #ifndef SCORD_ADMIRE_H #define SCORD_ADMIRE_H #include <stddef.h> #include <stdint.h> #include <stdbool.h> Loading @@ -37,9 +38,10 @@ extern "C" { #define ADM_IOSCHED_API_VERSION_MINOR 1 #define ADM_IOSCHED_API_VERSION_PATCH 0 /** * Public type and struct definitions */ /******************************************************************************/ /* Public type definitions and type-related functions */ /******************************************************************************/ /* Error return codes */ typedef enum { Loading Loading @@ -200,14 +202,39 @@ typedef struct { typedef ADM_adhoc_context_t* ADM_adhoc_storage_handle_t; /** The I/O requirements for a job */ typedef struct { /** A list of input datasets */ ADM_dataset_handle_t** r_inputs; /** A list of output datasets */ ADM_dataset_handle_t** r_outputs; /** A definition for a specific adhoc storage instance */ ADM_adhoc_storage_handle_t r_adhoc_storage; } ADM_job_requirements_t; typedef struct adm_job_requirements* ADM_job_requirements_t; /** * Create a JOB_REQUIREMENTS from user-provided information. * * @remark JOB_REQUIREMENTS created by this function need to be freed by calling * ADM_job_requirements_destroy(). * * @param[in] inputs An array of DATASET_DESCRIPTORS describing the input * information required by the job. * @param[in] inputs_len The number of DATASET_DESCRIPTORS stored in inputs. * @param[in] outputs An array of DATASET_DESCRIPTORS describing the output * information generated by the job. * @param[in] outputs_len The number of DATASET_DESCRIPTORS stored in outputs. * @param[in] adhoc_storage An optional ADHOC_DESCRIPTOR describing the adhoc * storage system required by the job (can be set to NULL if no adhoc storage * system is required). * @return A valid ADM_job_requirements_t if sucessfull or NULL in case of * failure. */ ADM_job_requirements_t ADM_job_requirements_create(ADM_dataset_handle_t inputs[], size_t inputs_len, ADM_dataset_handle_t outputs[], size_t outputs_len, ADM_adhoc_storage_handle_t adhoc_storage); /** * Destroy a ADM_job_requirements_t created by ADM_job_requirements_create(). * * @param[in] reqs The ADM_job_requirements_t to destroy. * @return ADM_SUCCESS or corresponding error code. */ ADM_return_t ADM_job_requirements_destroy(ADM_job_requirements_t reqs); /******************************************************************************/ Loading src/api/c_wrapper.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,20 @@ struct adm_dataset { const char* d_id; }; /** The I/O requirements for a job */ struct adm_job_requirements { /** An array of input datasets */ ADM_dataset_handle_t* r_inputs; /** The number of datasets in r_inputs */ size_t r_num_inputs; /** A list of output datasets */ ADM_dataset_handle_t* r_outputs; /** The number of datasets in r_outputs */ size_t r_num_outputs; /** An optional definition for a specific adhoc storage instance */ ADM_adhoc_storage_handle_t r_adhoc_storage; }; ADM_server_t ADM_server_create(const char* protocol, const char* address) { Loading Loading @@ -99,6 +113,42 @@ ADM_dataset_destroy(ADM_dataset_handle_t dataset) { return ret; } ADM_job_requirements_t ADM_job_requirements_create(ADM_dataset_handle_t inputs[], size_t inputs_len, ADM_dataset_handle_t outputs[], size_t outputs_len, ADM_adhoc_storage_handle_t adhoc_storage) { struct adm_job_requirements* adm_job_reqs = (struct adm_job_requirements*) malloc( sizeof(struct adm_job_requirements)); if(!adm_job_reqs) { LOGGER_ERROR("Could not allocate ADM_job_requirements_t") return NULL; } adm_job_reqs->r_inputs = inputs; adm_job_reqs->r_num_inputs = inputs_len; adm_job_reqs->r_outputs = outputs; adm_job_reqs->r_num_outputs = outputs_len; adm_job_reqs->r_adhoc_storage = adhoc_storage; return adm_job_reqs; } ADM_return_t ADM_job_requirements_destroy(ADM_job_requirements_t reqs) { ADM_return_t ret = ADM_SUCCESS; if(!reqs) { LOGGER_ERROR("Invalid ADM_job_requirements_t") return ADM_EINVAL; } free(reqs); return ret; } /** * Initialize a job handle that can be used by clients to refer to a job. * Loading Loading
examples/c/ADM_register_job.c +35 −4 Original line number Diff line number Diff line Loading @@ -2,6 +2,9 @@ #include <stdio.h> #include <admire.h> #define NINPUTS 10 #define NOUTPUTS 5 int main(int argc, char* argv[]) { Loading @@ -14,10 +17,30 @@ main(int argc, char* argv[]) { int exit_status = EXIT_SUCCESS; ADM_server_t server = ADM_server_create("tcp", argv[1]); ADM_job_t job; #if 0 ADM_job_requirements_t reqs = ADM_job_requirements_init(); ADM_dataset_info_t info = ADM_dataset_info_init(); ADM_dataset_handle_t inputs[NINPUTS]; for(int i = 0; i < NINPUTS; ++i) { const char* pattern = "input-dataset-%d"; size_t n = snprintf(NULL, 0, pattern, i); char* id = (char*) malloc(n + 1); snprintf(id, n, pattern, i); inputs[i] = ADM_dataset_create(id); } ADM_dataset_handle_t outputs[NOUTPUTS]; for(int i = 0; i < NOUTPUTS; ++i) { const char* pattern = "output-dataset-%d"; size_t n = snprintf(NULL, 0, pattern, i); char* id = (char*) malloc(n + 1); snprintf(id, n, pattern, i); outputs[i] = ADM_dataset_create(id); } ADM_job_requirements_t reqs = ADM_job_requirements_create( inputs, NINPUTS, outputs, NOUTPUTS, NULL); ADM_return_t ret = ADM_register_job(server, reqs, &job); if(ret != ADM_SUCCESS) { Loading @@ -26,12 +49,20 @@ main(int argc, char* argv[]) { exit_status = EXIT_FAILURE; goto cleanup; } #endif fprintf(stdout, "ADM_register_job() remote procedure completed " "successfully\n"); cleanup: for(int i = 0; i < NINPUTS; ++i) { ADM_dataset_destroy(inputs[i]); } for(int i = 0; i < NOUTPUTS; ++i) { ADM_dataset_destroy(outputs[i]); } ADM_server_destroy(server); exit(exit_status); }
src/api/admire.h +38 −11 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #ifndef SCORD_ADMIRE_H #define SCORD_ADMIRE_H #include <stddef.h> #include <stdint.h> #include <stdbool.h> Loading @@ -37,9 +38,10 @@ extern "C" { #define ADM_IOSCHED_API_VERSION_MINOR 1 #define ADM_IOSCHED_API_VERSION_PATCH 0 /** * Public type and struct definitions */ /******************************************************************************/ /* Public type definitions and type-related functions */ /******************************************************************************/ /* Error return codes */ typedef enum { Loading Loading @@ -200,14 +202,39 @@ typedef struct { typedef ADM_adhoc_context_t* ADM_adhoc_storage_handle_t; /** The I/O requirements for a job */ typedef struct { /** A list of input datasets */ ADM_dataset_handle_t** r_inputs; /** A list of output datasets */ ADM_dataset_handle_t** r_outputs; /** A definition for a specific adhoc storage instance */ ADM_adhoc_storage_handle_t r_adhoc_storage; } ADM_job_requirements_t; typedef struct adm_job_requirements* ADM_job_requirements_t; /** * Create a JOB_REQUIREMENTS from user-provided information. * * @remark JOB_REQUIREMENTS created by this function need to be freed by calling * ADM_job_requirements_destroy(). * * @param[in] inputs An array of DATASET_DESCRIPTORS describing the input * information required by the job. * @param[in] inputs_len The number of DATASET_DESCRIPTORS stored in inputs. * @param[in] outputs An array of DATASET_DESCRIPTORS describing the output * information generated by the job. * @param[in] outputs_len The number of DATASET_DESCRIPTORS stored in outputs. * @param[in] adhoc_storage An optional ADHOC_DESCRIPTOR describing the adhoc * storage system required by the job (can be set to NULL if no adhoc storage * system is required). * @return A valid ADM_job_requirements_t if sucessfull or NULL in case of * failure. */ ADM_job_requirements_t ADM_job_requirements_create(ADM_dataset_handle_t inputs[], size_t inputs_len, ADM_dataset_handle_t outputs[], size_t outputs_len, ADM_adhoc_storage_handle_t adhoc_storage); /** * Destroy a ADM_job_requirements_t created by ADM_job_requirements_create(). * * @param[in] reqs The ADM_job_requirements_t to destroy. * @return ADM_SUCCESS or corresponding error code. */ ADM_return_t ADM_job_requirements_destroy(ADM_job_requirements_t reqs); /******************************************************************************/ Loading
src/api/c_wrapper.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,20 @@ struct adm_dataset { const char* d_id; }; /** The I/O requirements for a job */ struct adm_job_requirements { /** An array of input datasets */ ADM_dataset_handle_t* r_inputs; /** The number of datasets in r_inputs */ size_t r_num_inputs; /** A list of output datasets */ ADM_dataset_handle_t* r_outputs; /** The number of datasets in r_outputs */ size_t r_num_outputs; /** An optional definition for a specific adhoc storage instance */ ADM_adhoc_storage_handle_t r_adhoc_storage; }; ADM_server_t ADM_server_create(const char* protocol, const char* address) { Loading Loading @@ -99,6 +113,42 @@ ADM_dataset_destroy(ADM_dataset_handle_t dataset) { return ret; } ADM_job_requirements_t ADM_job_requirements_create(ADM_dataset_handle_t inputs[], size_t inputs_len, ADM_dataset_handle_t outputs[], size_t outputs_len, ADM_adhoc_storage_handle_t adhoc_storage) { struct adm_job_requirements* adm_job_reqs = (struct adm_job_requirements*) malloc( sizeof(struct adm_job_requirements)); if(!adm_job_reqs) { LOGGER_ERROR("Could not allocate ADM_job_requirements_t") return NULL; } adm_job_reqs->r_inputs = inputs; adm_job_reqs->r_num_inputs = inputs_len; adm_job_reqs->r_outputs = outputs; adm_job_reqs->r_num_outputs = outputs_len; adm_job_reqs->r_adhoc_storage = adhoc_storage; return adm_job_reqs; } ADM_return_t ADM_job_requirements_destroy(ADM_job_requirements_t reqs) { ADM_return_t ret = ADM_SUCCESS; if(!reqs) { LOGGER_ERROR("Invalid ADM_job_requirements_t") return ADM_EINVAL; } free(reqs); return ret; } /** * Initialize a job handle that can be used by clients to refer to a job. * Loading