Commit b19b1ab2 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 744dc883
......@@ -301,22 +301,21 @@ error _Conn::close() {
// mappings to give EFAULT on access.
while (1) {
FileH f = nil;
bool opening, closing;
bool opening;
// pick up any fileh
wconn._filehMu.Lock();
if (!wconn._filehTab.empty()) {
f = wconn._filehTab.begin()->second;
opening = (f->_state < _FileHOpened);
closing = (f->_state >= _FileHClosing);
if (!closing)
f->_nopen++; // the file is not closing - we'll close it ourselves.
}
wconn._filehMu.Unlock();
if (f == nil)
break; // all closed
trace("picked %s\topening: %d", v(f), opening);
// if fileh was "opening" - wait for the open to complete before calling close.
if (opening) {
f->_openReady.recv();
......@@ -324,16 +323,13 @@ error _Conn::close() {
continue; // failed open; f should be removed from wconn._filehTab by Conn.open itself
}
// if fileh was not "closing" - close it ourselves (we pretended we opened it too).
// call close f under
// force fileh close.
// - virt_lock
// - wconn.atMu.R
// - wconn.filehMu unlocked
if (!closing) {
err = f->_closeLocked(/*force=*/true);
if (err != nil)
reterr1(err);
}
err = f->_closeLocked(/*force=*/true);
if (err != nil)
reterr1(err);
// wait for f close to complete, as it might be that f.close was called
// simultaneously to us or just before. f is removed from
......
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