add reentrant lock