00001
00002
00003
00004
00005
00013
00014
00015 #ifndef __CE_H__
00016 #define __CE_H__
00017
00018 #ifdef _WIN32
00019 #include <winsock2.h>
00020 #endif
00021
00025 typedef double ce_float_t ;
00026
00029 typedef int ce_bool_t ;
00030
00035 typedef int ce_rank_t ;
00036
00039 typedef int ce_ltime_t ;
00040
00043 typedef int ce_len_t ;
00044
00049 typedef void *ce_env_t ;
00050
00053 typedef double ce_time_t ;
00054
00058 typedef char* ce_endpt_t;
00059
00062 typedef char* ce_addr_t;
00063
00066 typedef char *ce_data_t;
00067
00071 typedef ce_endpt_t *ce_endpt_array_t ;
00072
00075 typedef ce_rank_t *ce_rank_array_t ;
00076
00080 typedef ce_addr_t *ce_addr_array_t ;
00081
00091 typedef struct ce_view_id_t {
00092 ce_ltime_t ltime ;
00093 ce_endpt_t endpt ;
00094 } ce_view_id_t ;
00095
00098 typedef ce_view_id_t **ce_view_id_array_t;
00099
00105 typedef struct ce_view_state_t {
00106 char* version ;
00107 char* group ;
00108 ce_rank_t coord ;
00109 int ltime ;
00110 ce_bool_t primary ;
00111 char* proto ;
00112 ce_bool_t groupd ;
00113 ce_bool_t xfer_view ;
00114 char* key ;
00115 int num_ids ;
00116 ce_view_id_array_t prev_ids ;
00117 char *params;
00118 ce_time_t uptime ;
00119 ce_endpt_array_t view ;
00120 ce_addr_array_t address ;
00121 } ce_view_state_t ;
00122
00127 typedef struct ce_local_state_t {
00128 ce_endpt_t endpt ;
00129 ce_addr_t addr ;
00130 ce_rank_t rank ;
00131 char* name ;
00132 int nmembers ;
00133 ce_view_id_t *view_id ;
00134 ce_bool_t am_coord ;
00135 } ce_local_state_t ;
00136
00141 typedef struct ce_jops_t {
00142 ce_time_t hrtbt_rate ;
00143 char *transports ;
00144 char *protocol ;
00145 char *group_name ;
00146 char *properties ;
00147 ce_bool_t use_properties ;
00148 ce_bool_t groupd ;
00149 char *params ;
00150 ce_bool_t debug ;
00151 ce_bool_t client;
00152 char *endpt ;
00153 char *princ ;
00154 char *key ;
00155 ce_bool_t secure ;
00156 } ce_jops_t;
00157
00161 #define CE_DEFAULT_PROTOCOL \
00162 "Top:Heal:Switch:Leave:" \
00163 "Inter:Intra:Elect:Merge:Sync:Suspect:" \
00164 "Stable:Vsync:Frag_Abv:Top_appl:" \
00165 "Frag:Pt2ptw:Mflow:Pt2pt:Mnak:Bottom"
00166
00167
00172 #define CE_DEFAULT_PROPERTIES "Gmp:Sync:Heal:Switch:Frag:Suspect:Flow"
00173
00174
00175
00176
00177
00178
00181 #define record_create(type, var) ((type)malloc(sizeof(*var)))
00182
00185 #define record_free(rec) free(rec)
00186
00189 #define record_clear(rec) memset(rec, 0, sizeof(*rec))
00190
00195 void ce_view_full_free(ce_local_state_t *ls, ce_view_state_t* vs);
00196
00200 void ce_jops_free(ce_jops_t*) ;
00201
00202
00206
00209 typedef void (*ce_appl_install_t)(ce_env_t, ce_local_state_t*, ce_view_state_t*);
00210
00213 typedef void (*ce_appl_exit_t)(ce_env_t) ;
00214
00217 typedef void (*ce_appl_receive_cast_t)(ce_env_t, ce_rank_t, ce_len_t, ce_data_t) ;
00218
00221 typedef void (*ce_appl_receive_send_t)(ce_env_t, ce_rank_t, ce_len_t, ce_data_t) ;
00222
00226 typedef void (*ce_appl_flow_block_t)(ce_env_t, ce_rank_t, ce_bool_t) ;
00227
00232 typedef void (*ce_appl_block_t)(ce_env_t) ;
00233
00237 typedef void (*ce_appl_heartbeat_t)(ce_env_t, ce_time_t) ;
00238
00245 typedef struct ce_appl_intf_t ce_appl_intf_t ;
00246
00266 ce_appl_intf_t*
00267 ce_create_intf(ce_env_t env,
00268 ce_appl_exit_t exit,
00269 ce_appl_install_t install,
00270 ce_appl_flow_block_t flow_block,
00271 ce_appl_block_t block,
00272 ce_appl_receive_cast_t cast,
00273 ce_appl_receive_send_t send,
00274 ce_appl_heartbeat_t heartbeat
00275 );
00276
00277
00278
00282 void ce_Init(
00283 int argc,
00284 char **argv
00285 ) ;
00286
00289 void ce_Main_loop (
00290 );
00291
00296 void ce_Join(
00297 ce_jops_t *ops,
00298 ce_appl_intf_t *c_appl
00299 ) ;
00300
00301
00302
00303
00304
00308 void ce_Leave(ce_appl_intf_t *c_appl) ;
00309
00315 void ce_Cast(
00316 ce_appl_intf_t *c_appl,
00317 ce_len_t len,
00318 ce_data_t buf
00319 ) ;
00320
00327 void ce_Send(
00328 ce_appl_intf_t *c_appl,
00329 ce_rank_array_t dests,
00330 ce_len_t len,
00331 ce_data_t buf
00332 ) ;
00333
00334
00341 void ce_Send1(
00342 ce_appl_intf_t *c_appl,
00343 ce_rank_t dest,
00344 ce_len_t len,
00345 ce_data_t buf
00346 ) ;
00347
00351 void ce_Prompt(
00352 ce_appl_intf_t *c_appl
00353 );
00354
00359 void ce_Suspect(
00360 ce_appl_intf_t *c_appl,
00361 ce_rank_array_t suspects
00362 );
00363
00367 void ce_XferDone(
00368 ce_appl_intf_t *c_appl
00369 ) ;
00370
00374 void ce_Rekey(
00375 ce_appl_intf_t *c_appl
00376 ) ;
00377
00388 void ce_ChangeProtocol(
00389 ce_appl_intf_t *c_appl,
00390 char *protocol_name
00391 ) ;
00392
00393
00400 void ce_ChangeProperties(
00401 ce_appl_intf_t *c_appl,
00402 char *properties
00403 ) ;
00404
00405
00408
00412 void ce_MLPrintOverride(
00413 void (*handler)(char *msg)
00414 ) ;
00415
00419 void ce_MLUncaughtException(
00420 void (*handler)(char *info)
00421 ) ;
00422
00423
00427 #ifdef _WIN32
00428 typedef SOCKET CE_SOCKET ;
00429 #else
00430 typedef int CE_SOCKET ;
00431 #endif
00432
00435 typedef void (*ce_handler_t)(void*);
00436
00444 void ce_AddSockRecv(
00445 CE_SOCKET socket,
00446 ce_handler_t handler,
00447 ce_env_t env
00448 );
00449
00453 void ce_RmvSockRecv(
00454 CE_SOCKET socket
00455 );
00456
00457
00458 #endif