Added "broadcast" to sm. Changed the interface.
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Mon, 15 Feb 1999 20:55:12 +0000 (20:55 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Mon, 15 Feb 1999 20:55:12 +0000 (20:55 +0000)
src/langs/simplemsg/sm.c
src/langs/simplemsg/sm.h

index 084f3044439b4fe7e43c5b7e7641f853dbf1725c..367d457660dee804355f0241a97b770530972e82 100644 (file)
@@ -43,7 +43,7 @@ char **argv;
   CpvAccess(SMMessages) = CmmNew();
 }
 
-void Send(pe, ntags, tags, buffer, buflen)
+void GeneralSend(pe, ntags, tags, buffer, buflen)
 int pe, ntags;
 int *tags;
 void *buffer;
@@ -64,7 +64,45 @@ int buflen;
   CmiSyncSend(pe, totsize, msg);
 }
 
-void Recv(ntags, tags, buffer, buflen, rtags)
+int GeneralBroadcast(rootpe, ntags, tags, buffer, buflen, rtags)
+int pe, ntags;
+int *tags, *rtags;
+void *buffer;
+int buflen;
+{
+  if(CmiMyPe()==rootpe) {
+    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);
+    CmiSyncBroadcast(totsize, msg);
+    return buflen;
+  } else {
+    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 buflen;
+  }
+}
+
+int GeneralRecv(ntags, tags, buffer, buflen, rtags)
 int ntags;
 int *tags;
 void *buffer;
@@ -84,6 +122,6 @@ int *rtags;
   headsize = ((headsize + 7) & (~7));
   memcpy(buffer, ((char *)msg)+headsize, buflen);
   CmiFree(msg);
-  return;
+  return buflen;
 }
 
index aa479beff355ef221dc866c52917926325ede31f..2b82bc03b3a12082b74f0d5ce41aaa91db717f62 100644 (file)
@@ -1,11 +1,43 @@
+#ifndef _SM_H
+#define _SM_H
+
 #define SMWildCard CmmWildCard
 
-void send(int pe, int ntags, int *tags, void *buf, int buflen);
+extern void 
+GeneralSend(int pe, int ntags, int *tags, void *buf, int buflen);
+
+extern int 
+GeneralBroadcast(int rootpe, int ntags, int *tags, 
+                 void *buf, int buflen, int *rtags);
+
+extern int 
+GeneralRecv(int ntags, int *tags, void *buf, int buflen, int *rtags);
+
+static void send(pe, tag, buf, buflen)
+int pe, buflen;
+int tag;
+void *buf;
+{ 
+  int CsmTag=(tag); 
+  GeneralSend(pe, 1, &CsmTag, buf, buflen); 
+}
 
-void recv(int ntags, int *tags, void *buf, int buflen, int *rtags);
+static int broadcast(rootpe, tag, buf, buflen, rtag)
+int rootpe, buflen;
+int tag, *rtag;
+void *buf;
+{ 
+  int CsmTag=(tag); 
+  return GeneralBroadcast(rootpe, 1, &CsmTag, buf, buflen, rtag); 
+}
 
-#define send1(pe, tag, buf, buflen)\
-  { int CsmTag=(tag); send(pe, 1, &CsmTag, buf, buflen); }
+static int recv(tag, buf, buflen, rtag)
+int tag, buflen;
+int *rtag;
+void *buf;
+{
+  int CsmTag=(tag); 
+  return GeneralRecv(1, &CsmTag, buf, buflen, rtag); 
+}
 
-#define recv1(tag, buf, buflen, rtag)\
-  { int CsmTag=(tag); recv(1, &CsmTag, buf, buflen, rtag); }
+#endif