Verified Commit 0d3aa875 authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Add ADM_job_requirements_[create|destroy].

Also make the implementation of ADM_job_requirements_t private to the
library.
parent ab585f22
Loading
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -2,6 +2,9 @@
#include <stdio.h>
#include <admire.h>

#define NINPUTS  10
#define NOUTPUTS 5

int
main(int argc, char* argv[]) {

@@ -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) {
@@ -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);
}
+38 −11
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#ifndef SCORD_ADMIRE_H
#define SCORD_ADMIRE_H

#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>

@@ -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 {
@@ -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);


/******************************************************************************/
+50 −0
Original line number Diff line number Diff line
@@ -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) {

@@ -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.
 *