Commit 129d4e3a authored by Noam Kleinburd's avatar Noam Kleinburd

Lock resources before checking if we need to clean them.

See the comments deleted by this commit for more details as to how
the race condition could effect the system.
parent e5cf6efa
......@@ -525,11 +525,8 @@ fn empty(context: &mut context::Context, reaping: bool) {
drop(context.tls.take());
}
// FIXME: Looks like a race condition.
// Is it possible for Arc::strong_count to return 1 to two contexts that exit at the
// same time, or return 2 to both, thus either double freeing or leaking the grants?
let mut grants = context.grants.lock();
if Arc::strong_count(&context.grants) == 1 {
let mut grants = context.grants.lock();
for grant in grants.drain(..) {
if reaping {
println!("{}: {}: Grant should not exist: {:?}", context.id.into(), unsafe { ::core::str::from_utf8_unchecked(&context.name.lock()) }, grant);
......@@ -927,11 +924,11 @@ pub fn exit(status: usize) -> ! {
let mut close_files = Vec::new();
let pid = {
let mut context = context_lock.write();
// FIXME: Looks like a race condition.
// Is it possible for Arc::strong_count to return 1 to two contexts that exit at the
// same time, or return 2 to both, thus either double closing or leaking the files?
if Arc::strong_count(&context.files) == 1 {
mem::swap(context.files.lock().deref_mut(), &mut close_files);
{
let mut lock = context.files.lock();
if Arc::strong_count(&context.files) == 1 {
mem::swap(lock.deref_mut(), &mut close_files);
}
}
context.files = Arc::new(Mutex::new(Vec::new()));
context.id
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment