CProxySection_ArrayBase: Fix bug caused by inconsistent new/deletes
authorRamprasad Venkataraman <ramv@illinois.edu>
Thu, 26 Aug 2010 22:40:11 +0000 (17:40 -0500)
committerRamprasad Venkataraman <ramv@illinois.edu>
Tue, 31 Aug 2010 19:30:36 +0000 (14:30 -0500)
Implementing cross-array-sections required new constructors for creating multi-array
sections. These constructors always used new[] even if the section spanned just one
chare array. The destructor on the other hand uses delete / delete[] depending on the
number of arrays in the section. Using these constructors to create a single-array
section causes segfaults in the destructor.

Quick fix so that new[] is used only if _nsid > 1 irrespective of which constructor
is invoked.

src/ck-core/ckarray.h

index 1c5fb1f1dc55d507aab6165bd5da40c7a75e8466..5500cf3dd9b9b07db8a0792bf9a8a9cbb8854b8a 100644 (file)
@@ -419,13 +419,19 @@ public:
     }
     CProxySection_ArrayBase(const int n, const CkArrayID *aid, CkArrayIndexMax const * const *elems, const int *nElems)
         :CProxy_ArrayBase(aid[0]), _nsid(n) {
+      if (_nsid == 1) _sid = new CkSectionID(aid[0], elems[0], nElems[0]);
+      else if (_nsid > 1) {
       _sid = new CkSectionID[n];
       for (int i=0; i<n; ++i) _sid[i] = CkSectionID(aid[i], elems[i], nElems[i]);
+      } else _sid = NULL;
     }
     CProxySection_ArrayBase(const int n, const CkArrayID *aid, CkArrayIndexMax const * const *elems, const int *nElems,CK_DELCTOR_PARAM)
         :CProxy_ArrayBase(aid[0],CK_DELCTOR_ARGS), _nsid(n) {
+      if (_nsid == 1) _sid = new CkSectionID(aid[0], elems[0], nElems[0]);
+      else if (_nsid > 1) {
       _sid = new CkSectionID[n];
       for (int i=0; i<n; ++i) _sid[i] = CkSectionID(aid[i], elems[i], nElems[i]);
+      } else _sid = NULL;
     }
 
     ~CProxySection_ArrayBase() {