Added sm.c and sm.h, simple messaging without threads.
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Fri, 21 Nov 1997 23:28:29 +0000 (23:28 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Fri, 21 Nov 1997 23:28:29 +0000 (23:28 +0000)
src/langs/simplemsg/sm.c [new file with mode: 0644]
src/langs/simplemsg/sm.h [new file with mode: 0644]

diff --git a/src/langs/simplemsg/sm.c b/src/langs/simplemsg/sm.c
new file mode 100644 (file)
index 0000000..084f304
--- /dev/null
@@ -0,0 +1,89 @@
+#include <converse.h>
+#include "sm.h"
+
+typedef struct SMMessageStruct *SMMessage;
+
+struct SMMessageStruct
+{
+  char cmiheader[CmiMsgHeaderSizeBytes];
+  int seqno, size, ntags;
+  int tags[1];
+};
+
+CpvStaticDeclare(int, SMHandlerIndex);
+CpvStaticDeclare(int *, SMSeqOut);
+CpvStaticDeclare(int *, SMSeqIn);
+CpvStaticDeclare(CmmTable, SMMessages);
+
+void SMHandler(m)
+SMMessage m;
+{
+  CmiGrabBuffer(&m);
+  CmmPut(CpvAccess(SMMessages), m->ntags, m->tags, m);
+}
+
+void SMInit(argv)
+char **argv;
+{
+  int *seqout, *seqin; int i;
+
+  seqout = (int *)CmiAlloc(CmiNumPes()*sizeof(int));
+  seqin  = (int *)CmiAlloc(CmiNumPes()*sizeof(int));
+  for (i=0; i<CmiNumPes(); i++) seqout[i] = 0;
+  for (i=0; i<CmiNumPes(); i++) seqin [i] = 0;
+
+  CpvInitialize(int, SMHandlerIndex);
+  CpvInitialize(int *, SMSeqOut);
+  CpvInitialize(int *, SMSeqIn);
+  CpvInitialize(CmmTable, SMMessages);
+
+  CpvAccess(SMHandlerIndex) = CmiRegisterHandler(SMHandler);
+  CpvAccess(SMSeqOut) = seqout;
+  CpvAccess(SMSeqIn) = seqin;
+  CpvAccess(SMMessages) = CmmNew();
+}
+
+void Send(pe, ntags, tags, buffer, buflen)
+int pe, ntags;
+int *tags;
+void *buffer;
+int buflen;
+{
+  int headsize, totsize, i; SMMessage msg;
+
+  headsize = sizeof(struct SMMessageStruct) + (ntags*sizeof(int));
+  headsize = ((headsize + 7) & (~7));
+  totsize = headsize + buflen;
+  msg = (SMMessage)CmiAlloc(totsize);
+  CmiSetHandler(msg, CpvAccess(SMHandlerIndex));
+  msg->seqno = (CpvAccess(SMSeqOut)[pe])++;
+  msg->size = buflen;
+  msg->ntags = ntags;
+  for (i=0; i<ntags; i++) msg->tags[i] = tags[i];
+  memcpy((((char *)msg)+headsize), buffer, buflen);
+  CmiSyncSend(pe, totsize, msg);
+}
+
+void Recv(ntags, tags, buffer, buflen, rtags)
+int ntags;
+int *tags;
+void *buffer;
+int buflen;
+int *rtags;
+{
+  SMMessage msg;
+  int headsize;
+
+  while (1) {  
+    msg = (SMMessage)CmmGet(CpvAccess(SMMessages), ntags, tags, rtags);
+    if (msg) break;
+  }
+  
+  if (msg->size > buflen) buflen = msg->size;
+  headsize = sizeof(struct SMMessageStruct) + ((ntags-1)*sizeof(int));
+  headsize = ((headsize + 7) & (~7));
+  memcpy(buffer, ((char *)msg)+headsize, buflen);
+  CmiFree(msg);
+  return;
+}
+
diff --git a/src/langs/simplemsg/sm.h b/src/langs/simplemsg/sm.h
new file mode 100644 (file)
index 0000000..dd9b3a6
--- /dev/null
@@ -0,0 +1,11 @@
+#define SMWildCard CmmWildCard
+
+void send CMK_PROTO((int pe, int ntags, int *tags, void *buf, int buflen));
+
+void recv CMK_PROTO((int ntags, int *tags, void *buf, int buflen, int *rtags));
+
+#define send1(pe, tag, buf, buflen)\
+  { int CsmTag=(tag); send(pe, 1, &CsmTag, buf, buflen); }
+
+#define recv1(tag, buf, buflen, rtag)\
+  { int CsmTag=(tag); recv(1, &CsmTag, buf, buflen, rtag); }