On Tue, Dec 15, 2009 at 1:46 AM, John Denker <j...@av8n.com> wrote: > Status summary: > > 0) I merged in Jester's nan-fixes. That was easy: > git remote add -t nan-fixes jester > git://gitorious.org/~jester/fg/jesters-clone.git > git pull jester > make
We want GIT! We want GIT! :D > 1) If I want to get anything done, I cannot --enable-fpe > because that leads to an early FP exception, while the > splash screen is still up. That may be the nasal bug Jacob is seeing. I could reproduce it and also made a little test case that I am gonna submit as a gcc bug report. It is clearly accessing the "double" member of the union before it has been established as valid. I have adjusted the workaround I had posted earlier so that the bug is no longer triggered for me. (See attachment) Also, compiling with -O3 makes it go away here. > 2) It is still easy to get SEGVs or ABORTs (due to > corrupt double-linked lists) when exiting from the > sim. Some logs including tracebacks are here > http://www.av8n.com/fly/fgfs//corrupt--21540.log > http://www.av8n.com/fly/fgfs//corrupt--21628.log > > This appears to be about 90% reproducible chez moi. > It is at least as likely to happen after after a > short (30 second) simulator run as after a long > (90 minute) one. I can confirm this as well. I have already reported two potential issues that need to be investigated (based on valgrind reports). Also, Tat has started a cvs bisect: so far he has bracketed the problem between 1st of october and 1st of november, I think. -- Csaba/Jester
diff --git a/simgear/nasal/hash.c b/simgear/nasal/hash.c index 1efe8fb..f9683ee 100644 --- a/simgear/nasal/hash.c +++ b/simgear/nasal/hash.c @@ -62,28 +62,28 @@ static unsigned int refhash(naRef key) } } -static int equal(naRef a, naRef b) +static int equal(const naRef* a, const naRef* b) { - if(IS_NUM(a)) return a.num == b.num; - if(PTR(a).obj == PTR(b).obj) return 1; - if(naStr_len(a) != naStr_len(b)) return 0; - return memcmp(naStr_data(a), naStr_data(b), naStr_len(a)) == 0; + if(IS_NUM(*a)) return a->num == b->num; + if(PTR(*a).obj == PTR(*b).obj) return 1; + if(naStr_len(*a) != naStr_len(*b)) return 0; + return memcmp(naStr_data(*a), naStr_data(*b), naStr_len(*a)) == 0; } /* Returns the index of a cell that either contains a matching key, or * is the empty slot to receive a new insertion. */ -static int findcell(struct HashRec *hr, naRef key, unsigned int hash) +static int findcell(struct HashRec *hr, const naRef* key, unsigned int hash) { int i, mask = POW2(hr->lgsz+1)-1, step = (2*hash+1) & mask; for(i=HBITS(hr,hash); TAB(hr)[i] != ENT_EMPTY; i=(i+step)&mask) - if(TAB(hr)[i] != ENT_DELETED && equal(key, ENTS(hr)[TAB(hr)[i]].key)) + if(TAB(hr)[i] != ENT_DELETED && equal(key, &ENTS(hr)[TAB(hr)[i]].key)) break; return i; } static void hashset(HashRec* hr, naRef key, naRef val) { - int ent, cell = findcell(hr, key, refhash(key)); + int ent, cell = findcell(hr, &key, refhash(key)); if((ent = TAB(hr)[cell]) == ENT_EMPTY) { ent = hr->next++; if(ent >= NCELLS(hr)) return; /* race protection, don't overrun */ @@ -127,7 +127,7 @@ int naHash_get(naRef hash, naRef key, naRef* out) { HashRec* hr = REC(hash); if(hr) { - int ent, cell = findcell(hr, key, refhash(key)); + int ent, cell = findcell(hr, &key, refhash(key)); if((ent = TAB(hr)[cell]) < 0) return 0; *out = ENTS(hr)[ent].val; return 1; @@ -147,7 +147,7 @@ void naHash_delete(naRef hash, naRef key) { HashRec* hr = REC(hash); if(hr) { - int cell = findcell(hr, key, refhash(key)); + int cell = findcell(hr, &key, refhash(key)); if(TAB(hr)[cell] >= 0) { TAB(hr)[cell] = ENT_DELETED; if(--hr->size < POW2(hr->lgsz-1)) @@ -211,7 +211,7 @@ int naiHash_tryset(naRef hash, naRef key, naRef val) { HashRec* hr = REC(hash); if(hr) { - int ent, cell = findcell(hr, key, refhash(key)); + int ent, cell = findcell(hr, &key, refhash(key)); if((ent = TAB(hr)[cell]) >= 0) { ENTS(hr)[ent].val = val; return 1; } } return 0;
------------------------------------------------------------------------------ Return on Information: Google Enterprise Search pays you back Get the facts. http://p.sf.net/sfu/google-dev2dev
_______________________________________________ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel