@@ -3631,6 +3631,17 @@ pioLocalDrive_pioIsRemote(VSelf)
3631
3631
}
3632
3632
3633
3633
/* 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
+ }
3634
3645
3635
3646
static err_i
3636
3647
pioLocalFile_pioClose (VSelf ,bool sync )
@@ -3911,40 +3922,49 @@ pioRemoteFile_pioSync(VSelf)
3911
3922
}
3912
3923
3913
3924
static err_i
3914
- pioRemoteFile_pioClose (VSelf , bool sync )
3925
+ pioRemoteFile_doClose (VSelf )
3915
3926
{
3916
- Self (pioRemoteFile );
3917
- err_i err = $noerr ();
3918
- fio_header hdr ;
3927
+ Self (pioRemoteFile );
3928
+ err_i err = $noerr ();
3929
+ fio_header hdr ;
3919
3930
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
+ };
3921
3937
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 ) );
3924
3940
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 );
3931
3944
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
+ }
3934
3950
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;
3938
3952
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
+ }
3944
3955
3945
- self -> p .closed = true;
3956
+ static err_i
3957
+ pioRemoteFile_pioClose (VSelf ,bool sync )
3958
+ {
3959
+ Self (pioRemoteFile );
3960
+ err_i err = $noerr ();
3946
3961
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 ));
3948
3968
}
3949
3969
3950
3970
static size_t
@@ -4245,6 +4265,14 @@ static void
4245
4265
pioRemoteFile_fobjDispose (VSelf )
4246
4266
{
4247
4267
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
+ }
4248
4276
$idel (& self -> asyncError );
4249
4277
ft_free (self -> asyncChunk );
4250
4278
}
@@ -4818,7 +4846,7 @@ pioCopyWithFilters(pioWriteFlush_i dest, pioRead_i src,
4818
4846
fobj_klass_handle (pioFile );
4819
4847
fobj_klass_handle (pioLocalDrive );
4820
4848
fobj_klass_handle (pioRemoteDrive );
4821
- fobj_klass_handle (pioLocalFile ,inherits (pioFile ),mth (fobjRepr ));
4849
+ fobj_klass_handle (pioLocalFile ,inherits (pioFile ),mth (fobjDispose , fobjRepr ));
4822
4850
fobj_klass_handle (pioRemoteFile ,inherits (pioFile ),mth (fobjDispose ,fobjRepr ));
4823
4851
fobj_klass_handle (pioWriteFilter ,mth (fobjDispose ,fobjRepr ));
4824
4852
fobj_klass_handle (pioReadFilter ,mth (fobjDispose ,fobjRepr ));