Ensure pipe is_alive is set before triggering event or condition
This commit is contained in:
+4
-6
@@ -102,17 +102,15 @@ impl KernelScheme for PipeScheme {
|
||||
let scheme_id = GlobalSchemes::Pipe.scheme_id();
|
||||
|
||||
let can_remove = if is_write_not_read {
|
||||
event::trigger(scheme_id, key, EVENT_READ);
|
||||
|
||||
pipe.read_condition.notify(token);
|
||||
pipe.writer_is_alive.store(false, Ordering::SeqCst);
|
||||
event::trigger(scheme_id, key, EVENT_READ);
|
||||
pipe.read_condition.notify(token);
|
||||
|
||||
!pipe.reader_is_alive.load(Ordering::SeqCst)
|
||||
} else {
|
||||
event::trigger(scheme_id, key | WRITE_NOT_READ_BIT, EVENT_WRITE);
|
||||
|
||||
pipe.write_condition.notify(token);
|
||||
pipe.reader_is_alive.store(false, Ordering::SeqCst);
|
||||
event::trigger(scheme_id, key | WRITE_NOT_READ_BIT, EVENT_WRITE);
|
||||
pipe.write_condition.notify(token);
|
||||
|
||||
!pipe.writer_is_alive.load(Ordering::SeqCst)
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user