Commit c8104a70 authored by Jeremy Soller's avatar Jeremy Soller

Merge branch 'prevent-race-condition' into 'master'

Lock resources before checking if we need to clean them.

See merge request !101
parents e5cf6efa 129d4e3a
......@@ -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