Preparing to support bigemulator CCS:
[charm.git] / src / conv-ccs / conv-ccs.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /*This file describes the CCS Server-side handler
9 interface.  A CCS handler is just a CMI handler,
10 but it can use the CcsSendReply function.
11 */
12
13 #ifndef CONV_CCS_H
14 #define CONV_CCS_H
15
16 #include "converse.h" /* for CMK_CCS_AVAILABLE and CmiHandler */
17 #include "sockRoutines.h"
18 #include "ccs-server.h" /*for CcsSecAttr*/
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 /******* Converse Client Server *****/
25
26 #define CMK_CCS_VERSION "2"
27
28 extern int _ccsHandlerIdx;
29
30 #if CMK_CCS_AVAILABLE
31
32 typedef struct CcsDelayedReply_struct {
33   CcsImplHeader *hdr;
34 } CcsDelayedReply;
35
36 /**
37  * Backward compatability routine: register a regular converse-style handler
38  * to receive CCS requests.  The requests will arrive as a Converse message,
39  * with a (useless) converse header.
40  */
41 void CcsRegisterHandler(const char *ccs_handlername, CmiHandler fn);
42
43 /**
44  * Register a real Ccs handler function to receive these CCS requests. 
45  * The requests will arrive as a flat, readonly buffer.
46  */
47 typedef void (*CcsHandlerFn)(void *userPtr,int reqLen,const void *reqData);
48 void CcsRegisterHandlerFn(const char *ccs_handlername, CcsHandlerFn fn, void *userPtr);
49
50 /**
51  * Set the merging function for this CCS handler to newMerge.
52  */
53 void CcsSetMergeFn(const char *name, CmiReduceMergeFn newMerge);
54 /* A few standard functions for merging CCS messages */
55 #define SIMPLE_REDUCTION(name) void * CcsMerge_##name(int *size,void *local,void **remote,int n)
56 #define SIMPLE_POLYMORPH_REDUCTION(nameBase) \
57   SIMPLE_REDUCTION(nameBase##_int); \
58   SIMPLE_REDUCTION(nameBase##_float); \
59   SIMPLE_REDUCTION(nameBase##_double)
60 SIMPLE_REDUCTION(concat);
61 SIMPLE_REDUCTION(logical_and);
62 SIMPLE_REDUCTION(logical_or);
63 SIMPLE_REDUCTION(bitvec_and);
64 SIMPLE_REDUCTION(bitvec_and);
65 SIMPLE_POLYMORPH_REDUCTION(sum);
66 SIMPLE_POLYMORPH_REDUCTION(product);
67 SIMPLE_POLYMORPH_REDUCTION(max);
68 SIMPLE_POLYMORPH_REDUCTION(min);
69 #undef SIMPLE_REDUCTION
70 #undef SIMPLE_POLYMORPH_REDUCTION
71
72 void CcsReleaseMessages();
73 void CcsInit(char **argv);
74 int CcsEnabled(void);
75 int CcsIsRemoteRequest(void);
76 void CcsCallerId(skt_ip_t *pip, unsigned int *pport);
77 void CcsSendReply(int replyLen, const void *replyData);
78 CcsDelayedReply CcsDelayReply(void);
79 void CcsSendDelayedReply(CcsDelayedReply d,int replyLen, const void *replyData);
80 void CcsNoReply();
81 void CcsNoDelayedReply(CcsDelayedReply d);
82
83 #else
84 typedef void *CcsDelayedReply;
85 #define CcsReleaseMessages() /*empty*/
86 #define CcsInit(argv) /*empty*/
87 #define CcsRegisterHandler(x,y) 0
88 #define CcsRegisterHandlerFn(x,y,p) 0
89 #define CcsSetMergeFn(x,y) 0
90 #define CcsEnabled() 0
91 #define CcsIsRemoteRequest() 0
92 #define CcsCallerId(x,y)  /*empty*/
93 #define CcsDelayReply() 0
94 #define CcsSendReply(s,r) /*empty*/
95 #define CcsSendDelayedReply(d,s,r); 
96 #define CcsNoReply() /*empty*/
97 #define CcsNoDelayedReply(d) /*empty*/
98 #endif
99
100 #ifdef __cplusplus
101 }
102 #endif
103 #endif