re-entrant lock