
From: "Jason Winnebeck"
//waitForPlayer returns the connected player, or NULL if the connection //process was aborted by the user. PongClient::sptr waitForPlayer() { LockCV lock(sync);
while (!(player.lock()) && !kbhit()) { //We wait for 250ms to recheck kbhit for pressed keys. sync.timedWait(250); } if (!(player.lock())) { //We were woken up by a keypress, so refuse any further connections. accept = false;
//We don't need to wait around if anyone is in the middle of connecting, //because shutting down GNE will close any open connections, and we will //be closing down if we aborted this connection.
//Return that no client connected. return PongClient::sptr(); }
return player.lock(); }
Unfortunately I don't have the time to properly review your code. I'll just rewrite the above in a more "idiomatic" way (I hope I'm not missing something.) PongClient::sptr waitForPlayer() { LockCV lock(sync); for(;;) { if( PongClient::sptr p = player.lock() ) { return p; } else if( kbhit() ) { accept = false; return PongClient::sptr(); } else { sync.timedWait(250); } } } Even more "idiomatic" would be to use shared_ptr<...> instead of the ::sptr typedef. Hiding the type of the smart pointer behind a typedef usually doesn't help much and can lead to subtle errors since the semantics of the various smart pointers differ in some corner cases. HTH