61a9a3d9119c34256eb499a4d6ea8e0877f52963
[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 #include "ckhashtable.h"
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 /******* Converse Client Server *****/
27
28 #define CMK_CCS_VERSION "2"
29
30 extern int _ccsHandlerIdx;
31
32 #if CMK_CCS_AVAILABLE
33
34 typedef CkHashtable_c CcsHandlerTable;
35 CpvExtern(CcsHandlerTable, ccsTab);
36
37 typedef struct CcsDelayedReply_struct {
38   CcsImplHeader *hdr;
39 } CcsDelayedReply;
40
41 typedef void (*CcsHandlerFn)(void *userPtr,int reqLen,const void *reqData);
42
43 /* Includes all information stored about a single CCS handler. */
44 typedef struct CcsHandlerRec {
45     const char *name; /*Name passed over socket*/
46     CmiHandler fnOld; /*Old converse-style handler, or NULL if new-style*/
47     CcsHandlerFn fn; /*New-style handler function, or NULL if old-style*/
48     void *userPtr;
49     CmiReduceMergeFn mergeFn; /*Merge function used for bcast requests*/
50     int nCalls; /* Number of times handler has been executed*/
51     CmiUInt2 redID; /*Reduction ID to be used with CmiListReduce*/
52 } CcsHandlerRec;
53
54 /**
55  * Backward compatability routine: register a regular converse-style handler
56  * to receive CCS requests.  The requests will arrive as a Converse message,
57  * with a (useless) converse header.
58  */
59 void CcsRegisterHandler(const char *ccs_handlername, CmiHandler fn);
60
61 CcsHandlerRec *CcsGetHandler(const char *name);
62
63 /**
64  * Register a real Ccs handler function to receive these CCS requests. 
65  * The requests will arrive as a flat, readonly buffer.
66  */
67 void CcsRegisterHandlerFn(const char *ccs_handlername, CcsHandlerFn fn, void *userPtr);
68
69 /**
70  * Set the merging function for this CCS handler to newMerge.
71  */
72 void CcsSetMergeFn(const char *name, CmiReduceMergeFn newMerge);
73 /* A few standard functions for merging CCS messages */
74 #define SIMPLE_REDUCTION(name) void * CcsMerge_##name(int *size,void *local,void **remote,int n)
75 #define SIMPLE_POLYMORPH_REDUCTION(nameBase) \
76   SIMPLE_REDUCTION(nameBase##_int); \
77   SIMPLE_REDUCTION(nameBase##_float); \
78   SIMPLE_REDUCTION(nameBase##_double)
79 SIMPLE_REDUCTION(concat);
80 SIMPLE_REDUCTION(logical_and);
81 SIMPLE_REDUCTION(logical_or);
82 SIMPLE_REDUCTION(bitvec_and);
83 SIMPLE_REDUCTION(bitvec_and);
84 SIMPLE_POLYMORPH_REDUCTION(sum);
85 SIMPLE_POLYMORPH_REDUCTION(product);
86 SIMPLE_POLYMORPH_REDUCTION(max);
87 SIMPLE_POLYMORPH_REDUCTION(min);
88 #undef SIMPLE_REDUCTION
89 #undef SIMPLE_POLYMORPH_REDUCTION
90
91 void CcsReleaseMessages();
92 void CcsInit(char **argv);
93 int CcsEnabled(void);
94 int CcsIsRemoteRequest(void);
95 void CcsCallerId(skt_ip_t *pip, unsigned int *pport);
96 void CcsSendReply(int replyLen, const void *replyData);
97 void CcsSendReplyNoError(int replyLen, const void *replyData);
98 CcsDelayedReply CcsDelayReply(void);
99 void CcsSendDelayedReply(CcsDelayedReply d,int replyLen, const void *replyData);
100 void CcsNoReply();
101 void CcsNoDelayedReply(CcsDelayedReply d);
102
103 #else
104 typedef void *CcsDelayedReply;
105 #define CcsReleaseMessages() /*empty*/
106 #define CcsInit(argv) /*empty*/
107 #define CcsRegisterHandler(x,y) 0
108 #define CcsRegisterHandlerFn(x,y,p) 0
109 #define CcsSetMergeFn(x,y) 0
110 #define CcsEnabled() 0
111 #define CcsIsRemoteRequest() 0
112 #define CcsCallerId(x,y)  /*empty*/
113 #define CcsDelayReply() 0
114 #define CcsSendReply(s,r) /*empty*/
115 #define CcsSendReplyNoError(s,r) /*empty*/
116 #define CcsSendDelayedReply(d,s,r); 
117 #define CcsNoReply() /*empty*/
118 #define CcsNoDelayedReply(d) /*empty*/
119 #endif
120
121 #ifdef __cplusplus
122 }
123 #endif
124 #endif