ckcallback: Use a CkArrayIndex base class object instead of CkArrayIndexStruct
authorRamprasad Venkataraman <ramv@illinois.edu>
Fri, 22 Apr 2011 20:15:21 +0000 (15:15 -0500)
committerRamprasad Venkataraman <ramv@illinois.edu>
Tue, 31 May 2011 15:18:32 +0000 (10:18 -0500)
CkCallback has a union of data based on the different callback types. One of
these if for callbacks that go to array elements. This required storing an
array index in the union with the resulting stipulation that the stored index
object should not have any default constructors.  A CkArrayIndexStruct class
has existed in the codebase expressly for such situations. Because this class
has no relation to the hierarchy of 'normal' array index classes, dangerous
pointer casts have been the norm.

Because of such risky casts, this snippet of code in the callback has been
plagued with heisenbugs over many years, as compilers get stricter and exhibit
greater personality variations across brands and architectures. OpenAtom has
exposed the bugs a couple of times in the last couple of years.

To fix this issue for good (hopefully), the objective is to not cast across
unrelated class hierarchies, but rather make the base class amenable to
participation in a union.  This should help get rid of classes that existed
purely for such silly hacks to enable charm functionality.

src/ck-core/ckcallback.C
src/ck-core/ckcallback.h

index 0b0aa7f5da6aa64a61106eb344f8caa843686ee0..107e4609b83887471eb4ab00b1422574cd0ec5f4 100644 (file)
@@ -140,7 +140,7 @@ CkCallback::CkCallback(int ep,const CProxyElement_ArrayBase &arrElt,CmiBool doIn
       type=doInline?isendArray:sendArray;
        d.array.ep=ep; 
        d.array.id=arrElt.ckGetArrayID(); 
-       d.array.idx.asMax()=arrElt.ckGetIndex();
+       d.array.idx = arrElt.ckGetIndex();
 }
 
 CkCallback::CkCallback(ArrayElement *p, int ep,CmiBool doInline) {
@@ -150,7 +150,7 @@ CkCallback::CkCallback(ArrayElement *p, int ep,CmiBool doInline) {
       type=doInline?isendArray:sendArray;
     d.array.ep=ep; 
        d.array.id=p->ckGetArrayID(); 
-       d.array.idx.asMax()=p->ckGetArrayIndex();
+       d.array.idx = p->ckGetArrayIndex();
 }
 
 void CkCallback::send(int length,const void *data) const
@@ -219,11 +219,11 @@ void CkCallback::send(void *msg) const
                break;
        case sendArray: //Send message to an array element
                if (!msg) msg=CkAllocSysMsg();
-               CkSendMsgArray(d.array.ep,msg,d.array.id,d.array.idx.asMax());
+               CkSendMsgArray(d.array.ep,msg,d.array.id,d.array.idx);
                break;
        case isendArray: //inline send-to-array element
                if (!msg) msg=CkAllocSysMsg();
-               CkSendMsgArrayInline(d.array.ep,msg,d.array.id,d.array.idx.asMax());
+               CkSendMsgArrayInline(d.array.ep,msg,d.array.id,d.array.idx);
                break;
        case bcastGroup:
                if (!msg) msg=CkAllocSysMsg();
index 61a7ded3849fed2352f2f380f6fd20fa35d47c15..5878b802e1b018aed80ea85ad885fb7808814ca1 100644 (file)
@@ -77,7 +77,7 @@ private:
        struct s_array { //(sendArray, bcastArray)
                int ep; //Entry point to call
                CkGroupID id; //Array ID to call it on
-               CkArrayIndexStruct idx; //Index to send to (if any)
+               CkArrayIndex idx; //Index to send to (if any)
        } array;
        struct s_ccsReply {
                CcsDelayedReply reply;
@@ -174,7 +174,7 @@ public:
       bzero(this, sizeof(CkCallback));
 #endif
       type=doInline?isendArray:sendArray;
-         d.array.ep=ep; d.array.id=id; d.array.idx.asMax()=*(CkArrayIndexMax*)&idx;
+         d.array.ep=ep; d.array.id=id; d.array.idx = idx;
        }
 
     // Bcast to array