[omniNotify] 64 bit notifd on Solaris 2.8 core dumps immediately
    Mark Zimmerman 
    markzimm at frii.com
       
    Wed Jun 15 11:46:10 BST 2005
    
    
  
Greetings:
I have tracked down the root cause of the error and I am pondering the
correct solution. Here is what is happening:
In RDINotifServer.cc, we have the declaration:
   CosNA::ChannelID        channID;
CosNA::ChannelID is a typedef that means CORBA::Long so it is a 32 bit
value even if you are building 64 bit code. This value is passed by
reference from RDINotifServer.cc:385 into EventChannel_i.cc (lines 1827,
1814). Everything is fine up to now.
>From EventChannel_i.cc:1814, it goes into RDIHash.h:217, which sets us
up for failure. The problem is that when this reference to a 32 bit
value gets here, it becomes (inappropriately) a reference to a Class and
references to Class are 64 bits wide. From here, it gets passed further
down (RDIHash.h:366, 375) into RDIHashFuncs.h:97 where it uses this
pointer to a 32 bit value to attempt to read a 64 bit value. On the
Sparc platform this results in a Bus Error half of the time due to
address misalignment.
To test this out, I changed RDIHashFuncs.h as follows:
Old Code:
inline unsigned int RDI_ULongHash(const void* K)
{ return *((unsigned long *) K); }
New Code:
inline unsigned int RDI_ULongHash(const void* K)
{
   unsigned int *ptr = (unsigned int *) K;
   unsigned int val = *ptr;
   return val;
}
Multiple lines are used to help pinpoint memory faults.
notifd seems to run fine with this change but I am concerned that this
might break it in other ways I have not yet encountered.
Once again, any insights are appreciated.
-- Mark
    
    
More information about the omninotify-list
mailing list