
Howard Hinnant wrote:
Did I make more sense this time? I often complain when people use too much English and not enough C++ in their arguments, and then I find myself being guilty of the same thing. :-)
Hmmm. Maybe I need to heed this advice as well. template<class M> class condition { public: explicit condition( M * pm = 0 ) { __cndcheck_init( this, pm ); } wait( Lock & lk ) { __cndcheck_wait( this, lk.mutex() ); // ... } }; // Release mode (duh) void __cndcheck_init( void * pc, void * pm ) { } void __cndcheck_wait( void * pc, void * pm2 ) { } // Debug mode map< void*, void* > __cndcheck_state; // must be synchronized void __cndcheck_init( void * pc, void * pm ) { __cndcheck_state[ pc ] = pm; } void __cndcheck_wait( void * pc, void * pm2 ) { assert( __cndcheck_state.count( pc ) ); assert( __cndcheck_state[ pc ] == 0 || __cndcheck_state[ pc ] == pm2 ); } // Checked release mode struct __cndcheck_item // must be atomic { void * pc_; void * pm_; }; __cndcheck_item __cndcheck_state[ 17041 ]; void __cndcheck_init( void * pc, void * pm ) { __cndcheck_state[ (size_t)pc % 17041 ] = { pc, pm }; // atomic store } void __cndcheck_wait( void * pc, void * pm2 ) { __cndcheck_item it = __cndcheck_state[ (size_t)pc % 17041 ]; // atomic load if( it.pc_ == pc ) { assert( it.pm_ == 0 || it.pm_ == pm2 ); } } Or something along those lines. :-)