00001 #include "ck.h"
00002 #include "queueing.h"
00003
00004 CkpvDeclare(size_t *, _offsets);
00005
00006 extern "C"
00007 void *CkAllocSysMsg(void)
00008 {
00009 return CkpvAccess(_msgPool)->get();
00010 }
00011
00012 extern "C"
00013 void CkFreeSysMsg(void *m)
00014 {
00015 CkpvAccess(_msgPool)->put(m);
00016 }
00017
00018 extern "C"
00019 void* CkAllocMsg(int msgIdx, int msgBytes, int prioBits)
00020 {
00021 register envelope* env;
00022 env = _allocEnv(ForChareMsg, msgBytes, prioBits);
00023 setMemoryTypeMessage(env);
00024
00025 env->setQueueing(_defaultQueueing);
00026 env->setMsgIdx(msgIdx);
00027
00028 return EnvToUsr(env);
00029 }
00030
00031 extern "C"
00032 void* CkAllocBuffer(void *msg, int bufsize)
00033 {
00034 bufsize = CkMsgAlignLength(bufsize);
00035 register envelope *env = UsrToEnv(msg);
00036 register envelope *packbuf;
00037 packbuf = _allocEnv(env->getMsgtype(), bufsize,
00038 env->getPriobits());
00039
00040 register int size = packbuf->getTotalsize();
00041 CmiMemcpy(packbuf, env, sizeof(envelope));
00042 packbuf->setTotalsize(size);
00043 packbuf->setPacked(!env->isPacked());
00044 CmiMemcpy(packbuf->getPrioPtr(), env->getPrioPtr(), packbuf->getPrioBytes());
00045
00046 return EnvToUsr(packbuf);;
00047 }
00048
00049 extern "C"
00050 void CkFreeMsg(void *msg)
00051 {
00052 if (msg!=NULL) {
00053 CmiFree(UsrToEnv(msg));
00054 }
00055 }
00056
00057
00058 extern "C"
00059 void* CkCopyMsg(void **pMsg)
00060 {
00061 register void *srcMsg = *pMsg;
00062 register envelope *env = UsrToEnv(srcMsg);
00063 register unsigned char msgidx = env->getMsgIdx();
00064 if(!env->isPacked() && _msgTable[msgidx]->pack) {
00065 srcMsg = _msgTable[msgidx]->pack(srcMsg);
00066 UsrToEnv(srcMsg)->setPacked(1);
00067 }
00068 register int size = UsrToEnv(srcMsg)->getTotalsize();
00069 register envelope *newenv = (envelope *) CmiAlloc(size);
00070 CmiMemcpy(newenv, UsrToEnv(srcMsg), size);
00071 if(UsrToEnv(srcMsg)->isPacked() && _msgTable[msgidx]->unpack) {
00072 srcMsg = _msgTable[msgidx]->unpack(srcMsg);
00073 UsrToEnv(srcMsg)->setPacked(0);
00074 }
00075 *pMsg = srcMsg;
00076 if(newenv->isPacked() && _msgTable[msgidx]->unpack) {
00077 srcMsg = _msgTable[msgidx]->unpack(EnvToUsr(newenv));
00078 UsrToEnv(srcMsg)->setPacked(0);
00079 } else srcMsg = EnvToUsr(newenv);
00080
00081 setMemoryTypeMessage(newenv);
00082 return srcMsg;
00083 }
00084
00085 extern "C"
00086 void CkSetQueueing(void *msg, int strategy)
00087 {
00088 UsrToEnv(msg)->setQueueing((unsigned char) strategy);
00089 }
00090
00091
00092 extern "C"
00093 void* CkPriorityPtr(void *msg)
00094 {
00095 #if CMK_ERROR_CHECKING
00096 if (UsrToEnv(msg)->getPriobits() == 0) CkAbort("Trying to access priority bits, but none was allocated");
00097 #endif
00098 return UsrToEnv(msg)->getPrioPtr();
00099 }
00100
00101 CkMarshallMsg *CkAllocateMarshallMsgNoninline(int size,const CkEntryOptions *opts)
00102 {
00103
00104 CkMarshallMsg *m=new (size,opts->getPriorityBits())CkMarshallMsg;
00105
00106 envelope *env=UsrToEnv(m);
00107 setMemoryTypeMessage(env);
00108 if (opts->getPriorityPtr() != NULL)
00109 CmiMemcpy(env->getPrioPtr(),opts->getPriorityPtr(),env->getPrioBytes());
00110
00111 env->setQueueing((unsigned char)opts->getQueueing());
00112 env->setGroupDep(opts->getGroupDepID());
00113 return m;
00114 }
00115