housekeeping: time() is expensive. don't use it inside a mutex.