On 11 Jun 2013, at 23:06, Sorin Manolache wrote: > I'm sorry, I ran out of ideas. I suppose that the operations of the two > threads on the bucket brigade are protected by mutexes...
Yep. I create my own output bucket brigade too. I *presume* this uses the allocator mutex to manipulate the bucket brigade (or that it contains its own mutex) protecting its link->next pointers. /* We cannot use the same bucket allocator for the ouput bucket brigade * obb as the one associated with the connection (r->connection->bucket_alloc) * because the same bucket allocator cannot be used in two different * threads, and we use the connection bucket allocator in this * thread - see docs on apr_bucket_alloc_create(). This results in * occasional core dumps. So create our own bucket allocator and pool * for output thread bucket brigade. */ ... if ( ( apr_thread_mutex_create(&oallocatormutex, APR_THREAD_MUTEX_UNNESTED, r->pool) == APR_SUCCESS) && ( apr_allocator_create(&oallocator) == APR_SUCCESS) && ( apr_allocator_mutex_set(oallocator, oallocatormutex), 1 ) && ( apr_pool_create_ex(&opool, NULL, NULL, oallocator) == APR_SUCCESS) && /* WARNING: pool has no parent */ ( NULL != (obucketallocator = apr_bucket_alloc_create(opool))) && ( NULL != (obb = apr_brigade_create(opool, obucketallocator))) ) { -- Alex Bligh