Concurrent separation logic