00001
00005 #ifndef CHARM_H
00006 #define CHARM_H
00007
00008 #include "converse.h"
00009 #include <sys/types.h>
00010
00011 #ifdef __cplusplus
00012 #include "pup.h"
00013 extern "C" {
00014 #endif
00015
00016
00017
00018
00019
00020
00021
00022
00024 #define CK_QUEUEING_FIFO CQS_QUEUEING_FIFO
00025 #define CK_QUEUEING_LIFO CQS_QUEUEING_LIFO
00026 #define CK_QUEUEING_IFIFO CQS_QUEUEING_IFIFO
00027 #define CK_QUEUEING_ILIFO CQS_QUEUEING_ILIFO
00028 #define CK_QUEUEING_BFIFO CQS_QUEUEING_BFIFO
00029 #define CK_QUEUEING_BLIFO CQS_QUEUEING_BLIFO
00030 #define CK_QUEUEING_LFIFO CQS_QUEUEING_LFIFO
00031 #define CK_QUEUEING_LLIFO CQS_QUEUEING_LLIFO
00032
00033 #define CkTimer CmiTimer
00034 #define CkWallTimer CmiWallTimer
00035 #define CkCpuTimer CmiCpuTimer
00036
00037 #define CkMyPe CmiMyPe
00038 #define CkMyRank CmiMyRank
00039 #define CkMyNode CmiMyNode
00040 #define CkNumPes CmiNumPes
00041 #define CkNumNodes CmiNumNodes
00042 #define CkNodeFirst CmiNodeFirst
00043 #define CkNodeSize CmiNodeSize
00044 #define CkMyNodeSize CmiMyNodeSize
00045 #define CkNodeOf CmiNodeOf
00046 #define CkRankOf CmiRankOf
00047
00048 #define CkPrintf CmiPrintf
00049 #define CkScanf CmiScanf
00050 #define CkError CmiError
00051 #define CkAbort CmiAbort
00052 #define CkAssert CmiAssert
00053
00054 extern void CkExit(void);
00055 extern char **CkGetArgv(void);
00056 extern int CkGetArgc(void);
00057
00058
00059
00060
00061
00062
00063
00064 #define CK_PE_ALL CLD_BROADCAST_ALL
00065 #define CK_PE_ALL_BUT_ME CLD_BROADCAST
00066 #define CK_PE_ANY CLD_ANYWHERE
00067
00068
00069
00070
00071
00072
00073
00074 extern void* CkAllocSysMsg(void);
00075 extern void CkFreeSysMsg(void *msg);
00076 extern void* CkAllocMsg(int msgIdx, int msgBytes, int prioBits);
00077 extern void* CkAllocBuffer(void *msg, int bufsize);
00078 extern void CkFreeMsg(void *msg);
00079 extern void* CkCopyMsg(void **pMsg);
00080 extern void CkSetQueueing(void *msg, int strategy);
00081 extern void* CkPriorityPtr(void *msg);
00082
00083
00092 typedef void* (*CkPackFnPtr)(void *msg);
00094 typedef void* (*CkUnpackFnPtr)(void *buf);
00096 typedef void (*CkDeallocFnPtr)(void *msg);
00097
00099 extern int CkRegisterMsg(const char *name, CkPackFnPtr pack,
00100 CkUnpackFnPtr unpack, CkDeallocFnPtr dealloc, size_t size);
00101
00103 #define CK_EP_NOKEEP (1<<2)
00104 #define CK_EP_INTRINSIC (1<<3)
00105 #define CK_EP_TRACEDISABLE (1<<4)
00106
00107 #define CK_EP_MEMCRITICAL (1<<5)
00108
00110 typedef enum{
00111 TypeInvalid=0,
00112 TypeChare,
00113 TypeMainChare,
00114 TypeGroup,
00115 TypeNodeGroup,
00116 TypeArray
00117 } ChareType;
00118
00120 typedef void (*CkCallFnPtr) (void *msg, void *obj);
00123 extern int CkRegisterEp(const char *name, CkCallFnPtr call, int msgIdx,
00124 int chareIdx,int ck_ep_flags);
00125
00128 extern int CkRegisterChare(const char *name, size_t dataSz, ChareType chareType);
00130 extern void CkRegisterChareInCharm(int chareIndex);
00132 extern int CkRegisterMainChare(int chareIndex, int epIndex);
00134 extern void CkRegisterDefaultCtor(int chareIndex, int ctorEpIndex);
00136 extern void CkRegisterMigCtor(int chareIndex, int ctorEpIndex);
00138 extern void CkRegisterGroupIrr(int chareIndex,int isIrr);
00140 extern void CkRegisterBase(int derivedIdx, int baseIdx);
00141
00143 typedef void (*CkPupReadonlyFnPtr)(void *pup_er);
00145 extern void CkRegisterReadonly(const char *name,const char *type,
00146 int size, void *ptr,CkPupReadonlyFnPtr pup_fn);
00148 extern void CkRegisterReadonlyMsg(const char *name,const char *type,
00149 void** pMsg);
00150
00152 typedef int (*CkMarshallUnpackFn)(char *marshall_buf,void *object);
00154 extern void CkRegisterMarshallUnpackFn(int epIndex,CkMarshallUnpackFn m);
00156 extern CkMarshallUnpackFn CkLookupMarshallUnpackFn(int epIndex);
00157
00158 #ifdef __cplusplus
00159
00160 typedef void (*CkMessagePupFn)(PUP::er &p,void *userMessage);
00162 extern void CkRegisterMessagePupFn(int epIndex,CkMessagePupFn m);
00163 #endif
00164
00166
00174
00175 typedef struct {
00176 int onPE;
00177 void* objPtr;
00178 } CkChareID;
00179
00180 typedef struct _ckGroupID{
00181 int idx;
00182 #ifdef __cplusplus
00183 inline void pup(PUP::er &p) { p|idx; }
00184 inline int isZero(void) const { return (idx==0); }
00185 inline void setZero(void) { idx=0; }
00186 inline int operator==(const struct _ckGroupID& gid) const {
00187 return (gid.idx==idx);
00188 }
00189 inline int operator<(const struct _ckGroupID& gid) const {
00190 return (gid.idx<idx);
00191 }
00192 #endif
00193 } CkGroupID;
00194
00195 typedef CkGroupID CkNodeGroupID;
00196
00197
00198
00199
00200
00201
00202 #ifdef __cplusplus
00203 class envelope;
00204 #else
00205 typedef struct envelope envelope;
00206 #endif
00207 extern void CkCreateChare(int chareIdx, int constructorIdx, void *msg,
00208 CkChareID *vid, int destPE);
00209 extern CkGroupID CkCreateGroup(int chareIdx, int constructorIdx, void *msg);
00210 extern CkGroupID CkCreateNodeGroup(int chareIdx, int constructorIdx, void *msg);
00211 extern void CkCreateLocalGroup(CkGroupID groupID, int constructorIdx, envelope *env);
00212 extern void CkCreateLocalNodeGroup(CkGroupID groupID, int constructorIdx, envelope *env);
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 typedef enum {
00233 NewChareMsg =1,
00234 NewVChareMsg =2,
00235 BocInitMsg =3,
00236 ForChareMsg =4,
00237 ForBocMsg =5,
00238 ForVidMsg =6,
00239 FillVidMsg =7,
00240 DeleteVidMsg =8,
00241 RODataMsg =9,
00242 ROMsgMsg =10,
00243 StartExitMsg =11,
00244 ExitMsg =12,
00245 ReqStatMsg =13,
00246 StatMsg =14,
00247 NodeBocInitMsg =15,
00248 ForNodeBocMsg =16,
00249 ArrayEltInitMsg =17,
00250 ForArrayEltMsg =18,
00251 LAST_CK_ENVELOPE_TYPE =19
00252 } CkEnvelopeType;
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 #define CK_MSG_INLINE 0x1
00263 #define CK_MSG_IMMEDIATE 0x2
00264 #define CK_MSG_EXPEDITED 0x4
00265 #define CK_MSG_KEEP 0x8
00266 #define CK_MSG_LB_NOTRACE 0x10
00267
00268 #ifdef __cplusplus
00269 #define CK_MSGOPTIONAL =0
00270 #else
00271 #define CK_MSGOPTIONAL
00272 #endif
00273
00274 extern void CkSendMsg(int entryIndex, void *msg, const CkChareID *chare, int opts CK_MSGOPTIONAL);
00275 extern void CkSendMsgBranch(int eIdx, void *msg, int destPE, CkGroupID gID, int opts CK_MSGOPTIONAL);
00276 extern void CkSendMsgInline(int entryIndex, void *msg, const CkChareID *chare, int opts CK_MSGOPTIONAL);
00277 extern void CkSendMsgBranchInline(int eIdx, void *msg, int destPE, CkGroupID gID, int opts CK_MSGOPTIONAL);
00278 extern void CkSendMsgBranchMulti(int eIdx, void *msg, CkGroupID gID, int npes, int *pes, int opts CK_MSGOPTIONAL);
00279 extern void CkSendMsgBranchGroup(int eIdx,void *msg,CkGroupID gID,CmiGroup grp, int opts CK_MSGOPTIONAL);
00280 extern void CkSendMsgNodeBranch(int eIdx, void *msg, int destNode, CkGroupID gID, int opts CK_MSGOPTIONAL);
00281 extern void CkSendMsgNodeBranchInline(int eIdx, void *msg, int destNode, CkGroupID gID, int opts CK_MSGOPTIONAL);
00282 extern void CkSendMsgNodeBranchMulti(int eIdx, void *msg, CkGroupID gID, int npes, int *nodes, int opts CK_MSGOPTIONAL);
00283 extern void CkBroadcastMsgBranch(int eIdx, void *msg, CkGroupID gID, int opts CK_MSGOPTIONAL);
00284 extern void CkBroadcastMsgNodeBranch(int eIdx, void *msg, CkGroupID gID, int opts CK_MSGOPTIONAL);
00285
00286 extern int CkChareMsgPrep(int eIdx, void *msg,const CkChareID *pCid);
00287 extern void CkGroupMsgPrep(int eIdx, void *msg, CkGroupID gID);
00288 extern void CkNodeGroupMsgPrep(int eIdx, void *msg, CkGroupID gID);
00289
00290 extern void CkSetRefNum(void *msg, CMK_REFNUM_TYPE ref);
00291 extern CMK_REFNUM_TYPE CkGetRefNum(void *msg);
00292 extern int CkGetSrcPe(void *msg);
00293 extern int CkGetSrcNode(void *msg);
00294
00295 extern void CkDeliverMessageFree(int epIdx,void *msg,void *object);
00296 extern void CkDeliverMessageReadonly(int epIdx,const void *msg,void *object);
00297
00298 extern void *CkLocalBranch(CkGroupID gID);
00299 extern void *CkLocalNodeBranch(CkGroupID gID);
00300 extern void *CkLocalChare(const CkChareID *chare);
00301
00302 extern void CkArrayManagerInsert(int onPe,void *msg,CkGroupID aID);
00303 extern void CkArrayManagerDeliver(int onPe,void *msg, int opts CK_MSGOPTIONAL);
00304
00309
00310
00311
00312
00313
00314
00315 typedef struct _ckSemaID {
00316 int pe;
00317 int idx;
00318 #ifdef __cplusplus
00319 public:
00320 void pup(PUP::er &p) { p(pe); p(idx); }
00321 #endif
00322 } CkSemaID;
00323
00324 extern CkSemaID CkSemaCreate(void);
00325 extern void *CkSemaWait(CkSemaID id);
00326 extern void CkSemaWaitN(CkSemaID id, int n, void *marray[]);
00327 extern void CkSemaSignal(CkSemaID id, void *m);
00328 extern void CkSemaDestroy(CkSemaID id);
00332
00333
00334
00335
00336
00344
00346 extern void CkStartQD(int eIdx,const CkChareID *chare);
00348 extern void CkWaitQD(void);
00351
00352
00353
00354
00355
00356
00357 extern int CkMessageToEpIdx(void *msg);
00358 extern void CkPrintEntryMethod(int epIdx);
00359 extern void CkPrintChareName(int chareIdx);
00360 extern void CkSummary_MarkEvent(int);
00361 extern void CkSummary_StartPhase(int);
00362 extern int CkDisableTracing(int epIdx);
00363 extern void CkEnableTracing(int epIdx);
00364
00365 #ifdef __cplusplus
00366 }
00367 #endif
00368 #endif