Philip or Troy - would you care to prepare and test the backport to ensure we can commit this for the next 0.9 release, coming within days?
Bill Philip Martin wrote: > Troy Heber <[EMAIL PROTECTED]> writes: > >> In any case, this looks like the culprit. > > Agreed, I've cc'd [EMAIL PROTECTED] The C implementation of apr_atomic_cas > on the 0.9.x branch is broken on ia64, and probably any other 64 bit > platform that uses the same code. For the full story see: > http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=387610 > >> apr_uint32_t apr_atomic_cas(volatile apr_uint32_t *mem, long with, >> long cmp) >> { >> long prev; >> #if APR_HAS_THREADS >> apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; >> if (apr_thread_mutex_lock(lock) == APR_SUCCESS) { >> prev = *(long*)mem; >> if (prev == cmp) { >> *(long*)mem = with; >> } >> apr_thread_mutex_unlock(lock); >> return prev; >> >> On a 64-bit machine we end up with a size mismatch and a compare of >> junk. mem is defined as a pointer to a 32-bit, then a cast to long >> 64-bit in this case. prev ends up with junk it it and fails the >> compare prev == cmp that passes on a 32-bit box. In any case this is a >> bug, not positive if it's the only one. > > It looks like it has already been fixed in apr1.2 (as used by apache2.2): > > apr_uint32_t apr_atomic_cas32(volatile apr_uint32_t *mem, apr_uint32_t with, > apr_uint32_t cmp) > { > apr_uint32_t prev; > #if APR_HAS_THREADS > apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; > > CHECK(apr_thread_mutex_lock(lock)); > prev = *mem; > if (prev == cmp) { > *mem = with; > } > CHECK(apr_thread_mutex_unlock(lock)); > #else > prev = *mem; > if (prev == cmp) { > *mem = with; > } > #endif /* APR_HAS_THREADS */ > return prev; > } > -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]