Merge branch 'charm' of charmgit:charm into charm
[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 CcsDelayedReply CcsDelayReply(void);
98 void CcsSendDelayedReply(CcsDelayedReply d,int replyLen, const void *replyData);
99 void CcsNoReply();
100 void CcsNoDelayedReply(CcsDelayedReply d);
101
102 #else
103 typedef void *CcsDelayedReply;
104 #define CcsReleaseMessages() /*empty*/
105 #define CcsInit(argv) /*empty*/
106 #define CcsRegisterHandler(x,y) 0
107 #define CcsRegisterHandlerFn(x,y,p) 0
108 #define CcsSetMergeFn(x,y) 0
109 #define CcsEnabled() 0
110 #define CcsIsRemoteRequest() 0
111 #define CcsCallerId(x,y)  /*empty*/
112 #define CcsDelayReply() 0
113 #define CcsSendReply(s,r) /*empty*/
114 #define CcsSendDelayedReply(d,s,r); 
115 #define CcsNoReply() /*empty*/
116 #define CcsNoDelayedReply(d) /*empty*/
117 #endif
118
119 #ifdef __cplusplus
120 }
121 #endif
122 #endif