margo.h 3.58 KB
Newer Older
1
2
3
4
5
6
7
8
9
/*
 * (C) 2015 The University of Chicago
 * 
 * See COPYRIGHT in top-level directory.
 */

#ifndef __MARGO
#define __MARGO

10
11
12
13
#ifdef __cplusplus
extern "C" {
#endif

14
15
16
17
18
19
#include <mercury_bulk.h>
#include <mercury.h>
#include <mercury_macros.h>
#include <abt.h>
#include <ev.h>

20
21
22
23

struct margo_instance;
typedef struct margo_instance* margo_instance_id;

24
/**
Jonathan Jenkins's avatar
doc fix    
Jonathan Jenkins committed
25
 * Initializes margo library from given argobots and Mercury instances.
Philip Carns's avatar
Philip Carns committed
26
27
28
29
 * @param [in] progress_pool Argobots pool to drive communication
 * @param [in] handler_pool Argobots pool to service RPC handlers
 * @param [in] hg_context Mercury context
 * @param [in] hg_class Mercury class
30
 * @returns margo instance id on success, NULL upon error
31
 */
32
33
margo_instance_id margo_init(ABT_pool progress_pool, ABT_pool handler_pool,
    hg_context_t *hg_context, hg_class_t *hg_class);
34
35
36

/**
 * Shuts down margo library and its underlying evfibers and mercury resources
Philip Carns's avatar
Philip Carns committed
37
 * @param [in] mid Margo instance
38
 */
39
void margo_finalize(margo_instance_id mid);
40
41

/**
Philip Carns's avatar
Philip Carns committed
42
43
44
 * Retrieve the abt_handler pool that was associated with the instance at 
 *    initialization time
 * @param [in] mid Margo instance
45
 */
46
ABT_pool* margo_get_handler_pool(margo_instance_id mid);
47
48
49

/**
 * Forward an RPC request to a remote host
Philip Carns's avatar
Philip Carns committed
50
 * @param [in] mid Margo instance
51
52
53
54
55
 * @param [in] handle identifier for the RPC to be sent
 * @param [in] in_struct input argument struct for RPC
 * @returns 0 on success, hg_return_t values on error
 */
hg_return_t margo_forward(
56
    margo_instance_id mid,
57
58
59
60
61
    hg_handle_t handle,
    void *in_struct);

/** 
 * Perform a bulk transfer
Philip Carns's avatar
Philip Carns committed
62
 * @param [in] mid Margo instance
63
64
65
66
67
68
69
70
71
72
73
 * @param [in] context Mercury bulk context
 * @param [in] op type of operation to perform
 * @param [in] origin_addr remote Mercury address
 * @param [in] origin_handle remote Mercury bulk memory handle
 * @param [in] origin_offset offset into remote bulk memory to access
 * @param [in] local_handle local bulk memory handle
 * @param [in] local_offset offset into local bulk memory to access
 * @param [in] size size (in bytes) of transfer
 * @returns 0 on success, hg_return_t values on error
 */
hg_return_t margo_bulk_transfer(
74
    margo_instance_id mid,
75
76
77
78
79
80
81
82
83
    hg_bulk_context_t *context,
    hg_bulk_op_t op,
    na_addr_t origin_addr,
    hg_bulk_t origin_handle,
    size_t origin_offset,
    hg_bulk_t local_handle,
    size_t local_offset,
    size_t size);

Philip Carns's avatar
Philip Carns committed
84
85
/**
 * Retrive the Margo instance that has been associated with a Mercury class
86
 * @param [in] cl Mercury class
Philip Carns's avatar
Philip Carns committed
87
 * @returns Margo instance on success, NULL on error
88
 */
89
margo_instance_id margo_hg_class_to_instance(hg_class_t *cl);
90

91
92
93
94
95
/**
 * macro that defines a function to glue an RPC handler to a fiber
 * @param [in] __name name of handler function
 */
#define DEFINE_ARGO_RPC_HANDLER(__name) \
96
hg_return_t __name##_handler(hg_handle_t handle) { \
97
98
    int __ret; \
    ABT_pool* __pool; \
99
100
    margo_instance_id __mid; \
    struct hg_info *__hgi; \
101
102
103
    hg_handle_t* __handle = malloc(sizeof(*__handle)); \
    if(!__handle) return(HG_NOMEM_ERROR); \
    *__handle = handle; \
104
105
    __hgi = HG_Get_info(handle); \
    __mid = margo_hg_class_to_instance(__hgi->hg_class); \
106
    __pool = margo_get_handler_pool(__mid); \
107
108
109
110
111
112
113
    __ret = ABT_thread_create(*__pool, __name, __handle, ABT_THREAD_ATTR_NULL, NULL); \
    if(__ret != 0) { \
        return(HG_NOMEM_ERROR); \
    } \
    return(HG_SUCCESS); \
}

Philip Carns's avatar
Philip Carns committed
114
115
116
117
118
/**
 * macro that declares the prototype for a function to glue an RPC 
 * handler to a fiber
 * @param [in] __name name of handler function
 */
119
120
#define DECLARE_ARGO_RPC_HANDLER(__name) hg_return_t __name##_handler(hg_handle_t handle);

121
122
123
124
#ifdef __cplusplus
}
#endif

125
#endif /* __MARGO */