@@ -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
36353646static err_i
36363647pioLocalFile_pioClose (VSelf ,bool sync )
@@ -3911,40 +3922,49 @@ pioRemoteFile_pioSync(VSelf)
39113922}
39123923
39133924static 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
39503970static size_t
@@ -4245,6 +4265,14 @@ static void
42454265pioRemoteFile_fobjDispose (VSelf )
42464266{
42474267Self (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 );
42494277ft_free (self -> asyncChunk );
42504278}
@@ -4818,7 +4846,7 @@ pioCopyWithFilters(pioWriteFlush_i dest, pioRead_i src,
48184846fobj_klass_handle (pioFile );
48194847fobj_klass_handle (pioLocalDrive );
48204848fobj_klass_handle (pioRemoteDrive );
4821- fobj_klass_handle (pioLocalFile ,inherits (pioFile ),mth (fobjRepr ));
4849+ fobj_klass_handle (pioLocalFile ,inherits (pioFile ),mth (fobjDispose , fobjRepr ));
48224850fobj_klass_handle (pioRemoteFile ,inherits (pioFile ),mth (fobjDispose ,fobjRepr ));
48234851fobj_klass_handle (pioWriteFilter ,mth (fobjDispose ,fobjRepr ));
48244852fobj_klass_handle (pioReadFilter ,mth (fobjDispose ,fobjRepr ));