use recursive mutex