Task: Shared bulk data in emulation
authorPhil Miller <mille121@illinois.edu>
Tue, 2 Dec 2008 22:29:38 +0000 (22:29 +0000)
committerPhil Miller <mille121@illinois.edu>
Tue, 2 Dec 2008 22:29:38 +0000 (22:29 +0000)
Summary: Separate shared bulk data interface from definition
Hours: 8

Move the code defining the shared bulk data trick into a source file separate
from the header, so that we have one object to link for whole programs using it,
and hence one instance of the sharing structure.

src/langs/bluegene/shared-alloc.h
src/langs/bluegene/shared_alloc.C [new file with mode: 0644]

index 51001d4461b9ebc08f6f4c647730f0e578f1ee1f..3c1ec368fe537b8815ae36e02f27212e17b1c631 100644 (file)
@@ -1,49 +1,22 @@
-#include <vector>
-#include <utility>
-#include <stdlib.h>
+// Shared allocation for bulk data used in emulated processes
+// Author: Phil Miller
 
-namespace SharedAlloc {
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-  typedef std::pair<void*, int> Alloc;
+  // At program point i, allocate sz bytes, or get the address of a previous
+  // allocation at i
+  void *shalloc(int i, size_t sz);
+  // Free p from the perspective of the current process. The memory will be 
+  // released when all processes that allocated at i call shfree
+  void shfree(int i, void *p);
 
-  std::vector<Alloc> allocs;
+#ifdef __cplusplus
+}
+#endif
 
-  void *shalloc(int i, size_t s)
-  {
-    // Make space to record at least i allocations
-    if(allocs.size() <= i)
-      allocs.resize(i+1, Alloc(0,0));
+#ifdef __cplusplus
+// Define something like shnew and shdelete here?
 
-    // Ensure allocation i is initialized
-    if(allocs[i].first == 0)
-      allocs[i].first = malloc(s);
-
-    // Increment its reference count
-    allocs[i].second++;
-
-    // Return the address
-    return allocs[i].first;
-  }
-
-  void shfree(int i, void *p)
-  {
-    // Check that pointer matches
-    //CkAssert(p == allocs[i].first);
-           
-    // Decrement refcount
-    allocs[i].second--;
-
-    // Free if 0
-    if (allocs[i].second == 0)
-      {
-       free(allocs[i].first);
-       allocs[i].first = 0;
-      }
-  }
-
-
-
-};
-
-using SharedAlloc::shalloc;
-using SharedAlloc::shfree;
+#endif
diff --git a/src/langs/bluegene/shared_alloc.C b/src/langs/bluegene/shared_alloc.C
new file mode 100644 (file)
index 0000000..e724940
--- /dev/null
@@ -0,0 +1,42 @@
+#include <vector>
+#include <utility>
+#include <cstdlib>
+
+#include "shared-alloc.h"
+
+typedef std::pair<void*, int> Alloc;
+
+std::vector<Alloc> allocs;
+
+void *shalloc(int i, size_t s)
+{
+  // Make space to record at least i allocations
+  if(allocs.size() <= i)
+    allocs.resize(i+1, Alloc(0,0));
+
+  // Ensure allocation i is initialized
+  if(allocs[i].first == 0)
+    allocs[i].first = malloc(s);
+
+  // Increment its reference count
+  allocs[i].second++;
+
+  // Return the address
+  return allocs[i].first;
+}
+
+void shfree(int i, void *p)
+{
+  // Check that pointer matches
+  //CkAssert(p == allocs[i].first);
+           
+  // Decrement refcount
+  allocs[i].second--;
+
+  // Free if 0
+  if (allocs[i].second == 0)
+    {
+      free(allocs[i].first);
+      allocs[i].first = 0;
+    }
+}