no need to hold mutex