Commit b19b1ab2 authored by Kirill Smelkov's avatar Kirill Smelkov

.

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