/*
 * Copyright (c) 2004-2010 The Trustees of Indiana University.
 *                         All rights reserved.
 * Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
 *                         All rights reserved.
 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
 *                         University of Stuttgart.  All rights reserved.
 * Copyright (c) 2004-2005 The Regents of the University of California.
 *                         All rights reserved.
 * $COPYRIGHT$
 * 
 * Additional copyrights may follow
 * 
 * $HEADER$
 */

/**
 * @file
 * 
 * FULL SNAPC component
 *
 * Simple, braindead implementation.
 */

#ifndef MCA_SNAPC_FULL_EXPORT_H
#define MCA_SNAPC_FULL_EXPORT_H

#include "orte_config.h"

#include "opal/mca/mca.h"
#include "opal/mca/event/event.h"

#include "orte/mca/sstore/sstore.h"
#include "orte/mca/snapc/snapc.h"

BEGIN_C_DECLS

/*
 * cmds for base receive
 */
typedef uint8_t orte_snapc_full_cmd_flag_t;
#define ORTE_SNAPC_FULL_CMD  OPAL_UINT8
#define ORTE_SNAPC_FULL_UPDATE_JOB_STATE_CMD          1
#define ORTE_SNAPC_FULL_UPDATE_JOB_STATE_QUICK_CMD    2
#define ORTE_SNAPC_FULL_UPDATE_ORTED_STATE_CMD        3
#define ORTE_SNAPC_FULL_UPDATE_ORTED_STATE_QUICK_CMD  4
#define ORTE_SNAPC_FULL_VPID_ASSOC_CMD                5
#define ORTE_SNAPC_FULL_ESTABLISH_DIR_CMD             6
#define ORTE_SNAPC_FULL_RESTART_PROC_INFO             7
#define ORTE_SNAPC_FULL_REQUEST_OP_CMD                8
#define ORTE_SNAPC_FULL_MAX                           9

    /*
     * Local Component structures
     */
    struct orte_snapc_full_component_t {
        orte_snapc_base_component_t super;  /** Base SNAPC component */
    };
    typedef struct orte_snapc_full_component_t orte_snapc_full_component_t;
    OPAL_MODULE_DECLSPEC extern orte_snapc_full_component_t mca_snapc_full_component;

    /*
     * Global Coordinator per orted metadata
     */
    struct orte_snapc_full_orted_snapshot_t {
        /** Base SNAPC Global snapshot type */
        orte_snapc_base_global_snapshot_t super;

        /** ORTE Process name */
        orte_process_name_t process_name;

        /** State of the checkpoint */
        int state;
    };
    typedef struct orte_snapc_full_orted_snapshot_t orte_snapc_full_orted_snapshot_t;
    OBJ_CLASS_DECLARATION(orte_snapc_full_orted_snapshot_t);

    /*
     * Local Coordinator per app metadata
     */
    struct orte_snapc_full_app_snapshot_t {
        /** Base SNAPC Global snapshot type */
        orte_snapc_base_local_snapshot_t super;

        /** Named Pipe Read and Write */
        char * comm_pipe_r;
        char * comm_pipe_w;
        int    comm_pipe_r_fd;
        int    comm_pipe_w_fd;
        int    unique_pipe_id;

        /* An opal event handle for the read pipe */
        opal_event_t comm_pipe_r_eh;
        bool is_eh_active;

        /** Process pid */
        pid_t process_pid;

        /** Is this process a migration target */
        bool migrating;

        /** Finished flag */
        bool finished;
    };
    typedef struct orte_snapc_full_app_snapshot_t orte_snapc_full_app_snapshot_t;
    OBJ_CLASS_DECLARATION(orte_snapc_full_app_snapshot_t);

    extern bool orte_snapc_full_skip_app;
    extern bool orte_snapc_full_timing_enabled;
    extern int orte_snapc_full_progress_meter;
    extern int orte_snapc_full_max_wait_time;

    int orte_snapc_full_component_query(mca_base_module_t **module, int *priority);

    /*
     * Module functions
     */
    int orte_snapc_full_module_init(bool seed, bool app);
    int orte_snapc_full_module_finalize(void);

    int orte_snapc_full_setup_job(orte_jobid_t jobid);
    int orte_snapc_full_release_job(orte_jobid_t jobid);

    int orte_snapc_full_ft_event(int state);

    int orte_snapc_full_start_ckpt(orte_snapc_base_quiesce_t *datum);
    int orte_snapc_full_end_ckpt(orte_snapc_base_quiesce_t *datum);
    int orte_snapc_full_request_op(orte_snapc_base_request_op_t *datum);

    /*
     * Global Coordinator Functionality
     */
    int global_coord_init(void);
    int global_coord_finalize(void);
    int global_coord_setup_job(orte_jobid_t jobid);
    int global_coord_release_job(orte_jobid_t jobid);
    int global_coord_orted_state_update(orte_process_name_t proc_name,
                                        int    proc_ckpt_state,
                                        char **proc_ckpt_ref,
                                        char **proc_ckpt_loc,
                                        char **agent_ckpt);
    int global_coord_start_ckpt(orte_snapc_base_quiesce_t *datum);
    int global_coord_end_ckpt(orte_snapc_base_quiesce_t *datum);
    int global_coord_restart_proc_info(pid_t  local_pid,
                                       char * local_hostname);

    /*
     * Local Coordinator Functionality
     */
    int local_coord_init(void);
    int local_coord_finalize(void);
    int local_coord_setup_job(orte_jobid_t jobid);
    int local_coord_release_job(orte_jobid_t jobid);
    int local_coord_job_state_update(orte_jobid_t jobid,
                                     int    job_ckpt_state,
                                     orte_sstore_base_handle_t ss_handle,
                                     opal_crs_base_ckpt_options_t *options);

    /*
     * Application Coordinator Functionality
     */
    int app_coord_init(void);
    int app_coord_finalize(void);
    int app_coord_ft_event(int state);
    int app_coord_request_op(orte_snapc_base_request_op_t *datum);

END_C_DECLS

#endif /* MCA_SNAPC_FULL_EXPORT_H */
