Skip to content

Commit e499bcd

Browse files
committed
file.c: return back close on dispose
but in a gentle way
1 parent e0df06f commit e499bcd

File tree

1 file changed

+54
-26
lines changed

1 file changed

+54
-26
lines changed

src/utils/file.c

Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3631,6 +3631,17 @@ pioLocalDrive_pioIsRemote(VSelf)
36313631
}
36323632

36333633
/* LOCAL FILE */
3634+
static void
3635+
pioLocalFile_fobjDispose(VSelf)
3636+
{
3637+
Self(pioLocalFile);
3638+
if (!self->p.closed)
3639+
{
3640+
close(self->fd);
3641+
self->fd = -1;
3642+
self->p.closed = true;
3643+
}
3644+
}
36343645

36353646
static err_i
36363647
pioLocalFile_pioClose(VSelf, bool sync)
@@ -3911,40 +3922,49 @@ pioRemoteFile_pioSync(VSelf)
39113922
}
39123923

39133924
static err_i
3914-
pioRemoteFile_pioClose(VSelf, bool sync)
3925+
pioRemoteFile_doClose(VSelf)
39153926
{
3916-
Self(pioRemoteFile);
3917-
err_i err = $noerr();
3918-
fio_header hdr;
3927+
Self(pioRemoteFile);
3928+
err_i err = $noerr();
3929+
fio_header hdr;
39193930

3920-
ft_assert(self->handle >= 0, "Remote closed file abused \"%s\"", self->p.path);
3931+
hdr = (fio_header){
3932+
.cop = FIO_CLOSE,
3933+
.handle = self->handle,
3934+
.size = 0,
3935+
.arg = 0,
3936+
};
39213937

3922-
if (sync && (self->p.flags & O_ACCMODE) != O_RDONLY)
3923-
err = pioRemoteFile_pioSync(self);
3938+
fio_fdset &= ~(1 << hdr.handle);
3939+
IO_CHECK(fio_write_all(fio_stdout, &hdr, sizeof(hdr)), sizeof(hdr));
39243940

3925-
hdr = (fio_header){
3926-
.cop = FIO_CLOSE,
3927-
.handle = self->handle,
3928-
.size = 0,
3929-
.arg = 0,
3930-
};
3941+
/* Wait for response */
3942+
IO_CHECK(fio_read_all(fio_stdin, &hdr, sizeof(hdr)), sizeof(hdr));
3943+
ft_dbg_assert(hdr.cop == FIO_CLOSE);
39313944

3932-
fio_fdset &= ~(1 << hdr.handle);
3933-
IO_CHECK(fio_write_all(fio_stdout, &hdr, sizeof(hdr)), sizeof(hdr));
3945+
if (hdr.arg != 0 && $isNULL(err))
3946+
{
3947+
err = $syserr((int)hdr.arg, "Cannot close remote file {path:q}",
3948+
path(self->p.path));
3949+
}
39343950

3935-
/* Wait for response */
3936-
IO_CHECK(fio_read_all(fio_stdin, &hdr, sizeof(hdr)), sizeof(hdr));
3937-
ft_dbg_assert(hdr.cop == FIO_CLOSE);
3951+
self->p.closed = true;
39383952

3939-
if (hdr.arg != 0 && $isNULL(err))
3940-
{
3941-
err = $syserr((int)hdr.arg, "Cannot close remote file {path:q}",
3942-
path(self->p.path));
3943-
}
3953+
return err;
3954+
}
39443955

3945-
self->p.closed = true;
3956+
static err_i
3957+
pioRemoteFile_pioClose(VSelf, bool sync)
3958+
{
3959+
Self(pioRemoteFile);
3960+
err_i err = $noerr();
39463961

3947-
return err;
3962+
ft_assert(self->handle >= 0, "Remote closed file abused \"%s\"", self->p.path);
3963+
3964+
if (sync && (self->p.flags & O_ACCMODE) != O_RDONLY)
3965+
err = pioRemoteFile_pioSync(self);
3966+
3967+
return fobj_err_combine(err, pioRemoteFile_doClose(self));
39483968
}
39493969

39503970
static size_t
@@ -4245,6 +4265,14 @@ static void
42454265
pioRemoteFile_fobjDispose(VSelf)
42464266
{
42474267
Self(pioRemoteFile);
4268+
if (!self->p.closed)
4269+
{
4270+
err_i err;
4271+
4272+
err = pioRemoteFile_doClose(self);
4273+
if ($haserr(err))
4274+
elog(WARNING, "%s", $errmsg(err));
4275+
}
42484276
$idel(&self->asyncError);
42494277
ft_free(self->asyncChunk);
42504278
}
@@ -4818,7 +4846,7 @@ pioCopyWithFilters(pioWriteFlush_i dest, pioRead_i src,
48184846
fobj_klass_handle(pioFile);
48194847
fobj_klass_handle(pioLocalDrive);
48204848
fobj_klass_handle(pioRemoteDrive);
4821-
fobj_klass_handle(pioLocalFile, inherits(pioFile), mth(fobjRepr));
4849+
fobj_klass_handle(pioLocalFile, inherits(pioFile), mth(fobjDispose, fobjRepr));
48224850
fobj_klass_handle(pioRemoteFile, inherits(pioFile), mth(fobjDispose, fobjRepr));
48234851
fobj_klass_handle(pioWriteFilter, mth(fobjDispose, fobjRepr));
48244852
fobj_klass_handle(pioReadFilter, mth(fobjDispose, fobjRepr));

0 commit comments

Comments
 (0)