libfs/ FUSE on L4Re
Leslie Zhai
lesliezhai at llvm.org.cn
Thu Jun 1 09:38:48 CEST 2017
diff --git a/libfs/lib/libc_backend/l4fs.cc b/libfs/lib/libc_backend/l4fs.cc
index 7a229ff..31ad120 100644
--- a/libfs/lib/libc_backend/l4fs.cc
+++ b/libfs/lib/libc_backend/l4fs.cc
@@ -219,10 +219,10 @@ int L4fs_dir::get_entry(const char *name, int
flags, mode_t mode,
//printf("mode=%x,flags=%x\n", mode, flags);
if (S_ISDIR(mode)) {
//printf("open '%s' as directory\n", name);
- *file = new L4fs_dir(_svr, fh);
+ *file = cxx::ref_ptr(new L4fs_dir(_svr, fh));
} else {
//printf("open '%s' as file\n", name);
- *file = new L4fs_file(_svr, fh);
+ *file = cxx::ref_ptr(new L4fs_file(_svr, fh));
}
return (*file) ? 0 : -ENOMEM;
@@ -325,7 +325,7 @@ int L4fs_file_system::mount(char const *source,
unsigned long mountflags,
if (fh < 0)
return fh;
- *dir = new L4fs_dir(svr, fh);
+ *dir = cxx::ref_ptr(new L4fs_dir(svr, fh));
if (!dir)
return -ENOMEM;
在 2017年06月01日 15:36, Xiang Zhai 写道:
> Hi Florian,
>
>
> /home/zhaixiang/project/l4re/l4/pkg/libfs/lib/libc_backend/l4fs.cc: In
> member function ‘virtual int L4fs::L4fs_dir::get_entry(const char*,
> int, mode_t, cxx::Ref_ptr<L4Re::Vfs::File>*)’:
> /home/zhaixiang/project/l4re/l4/pkg/libfs/lib/libc_backend/l4fs.cc:222:38:
> error: no match for ‘operator=’ (operand types are
> ‘cxx::Ref_ptr<L4Re::Vfs::File>’ and ‘L4fs::L4fs_dir*’)
> *file = new L4fs_dir(_svr, fh);
> ^
> In file included from
> /home/zhaixiang/project/l4re/l4/build/include/l4/l4re_vfs/vfs.h:41:0,
> from
> /home/zhaixiang/project/l4re/l4/build/include/l4/l4re_vfs/backend:22,
> from
> /home/zhaixiang/project/l4re/l4/pkg/libfs/lib/libc_backend/l4fs.cc:15:
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:186:8:
> note: candidate: template<class OT> void cxx::Ref_ptr<T,
> CNT>::operator=(const cxx::Ref_ptr<OT>&) [with OT = OT; T =
> L4Re::Vfs::File; CNT = cxx::Default_ref_counter]
> void operator = (Ref_ptr<OT> const &o) throw()
> ^~~~~~~~
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:186:8:
> note: template argument deduction/substitution failed:
> /home/zhaixiang/project/l4re/l4/pkg/libfs/lib/libc_backend/l4fs.cc:222:38:
> note: mismatched types ‘const cxx::Ref_ptr<T>’ and ‘L4fs::L4fs_dir*’
> *file = new L4fs_dir(_svr, fh);
> ^
> In file included from
> /home/zhaixiang/project/l4re/l4/build/include/l4/l4re_vfs/vfs.h:41:0,
> from
> /home/zhaixiang/project/l4re/l4/build/include/l4/l4re_vfs/backend:22,
> from
> /home/zhaixiang/project/l4re/l4/pkg/libfs/lib/libc_backend/l4fs.cc:15:
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:193:8:
> note: candidate: void cxx::Ref_ptr<T, CNT>::operator=(const
> cxx::Ref_ptr<T>&) [with T = L4Re::Vfs::File; CNT =
> cxx::Default_ref_counter]
> void operator = (Ref_ptr<T> const &o) throw()
> ^~~~~~~~
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:193:8:
> note: no known conversion for argument 1 from ‘L4fs::L4fs_dir*’ to
> ‘const cxx::Ref_ptr<L4Re::Vfs::File>&’
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:203:8:
> note: candidate: void cxx::Ref_ptr<T, CNT>::operator=(cxx::Ref_ptr<T,
> CNT>::Null_type) [with T = L4Re::Vfs::File; CNT =
> cxx::Default_ref_counter; cxx::Ref_ptr<T, CNT>::Null_type =
> std::nullptr_t]
> void operator = (Null_type) throw()
> ^~~~~~~~
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:203:8:
> note: no known conversion for argument 1 from ‘L4fs::L4fs_dir*’ to
> ‘cxx::Ref_ptr<L4Re::Vfs::File>::Null_type {aka std::nullptr_t}’
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:218:8:
> note: candidate: template<class OT> void cxx::Ref_ptr<T,
> CNT>::operator=(cxx::Ref_ptr<OT>&&) [with OT = OT; T =
> L4Re::Vfs::File; CNT = cxx::Default_ref_counter]
> void operator = (Ref_ptr<OT> &&o) throw()
> ^~~~~~~~
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:218:8:
> note: template argument deduction/substitution failed:
> /home/zhaixiang/project/l4re/l4/pkg/libfs/lib/libc_backend/l4fs.cc:222:38:
> note: mismatched types ‘cxx::Ref_ptr<T>’ and ‘L4fs::L4fs_dir*’
> *file = new L4fs_dir(_svr, fh);
> ^
> In file included from
> /home/zhaixiang/project/l4re/l4/build/include/l4/l4re_vfs/vfs.h:41:0,
> from
> /home/zhaixiang/project/l4re/l4/build/include/l4/l4re_vfs/backend:22,
> from
> /home/zhaixiang/project/l4re/l4/pkg/libfs/lib/libc_backend/l4fs.cc:15:
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:224:8:
> note: candidate: void cxx::Ref_ptr<T,
> CNT>::operator=(cxx::Ref_ptr<T>&&) [with T = L4Re::Vfs::File; CNT =
> cxx::Default_ref_counter]
> void operator = (Ref_ptr<T> &&o) throw()
> ^~~~~~~~
> /home/zhaixiang/project/l4re/l4/build/include/l4/cxx/ref_ptr:224:8:
> note: no known conversion for argument 1 from ‘L4fs::L4fs_dir*’ to
> ‘cxx::Ref_ptr<L4Re::Vfs::File>&&’
>
>
> So I simply added cxx::ref_ptr() for reference counting pointer with
> automatic cleanup:
>
>
> diff --git a/libfs/lib/libc_backend/l4fs.cc
> b/libfs/lib/libc_backend/l4fs.cc
> index 7a229ff..31ad120 100644
> --- a/libfs/lib/libc_backend/l4fs.cc
> +++ b/libfs/lib/libc_backend/l4fs.cc
> @@ -219,10 +219,10 @@ int L4fs_dir::get_entry(const char *name, int
> flags, mode_t mode,
> //printf("mode=%x,flags=%x\n", mode, flags);
> if (S_ISDIR(mode)) {
> //printf("open '%s' as directory\n", name);
> - *file = new L4fs_dir(_svr, fh);
> + *file = cxx::ref_ptr(new L4fs_dir(_svr, fh));
> } else {
> //printf("open '%s' as file\n", name);
> - *file = new L4fs_file(_svr, fh);
> + *file = cxx::ref_ptr(new L4fs_file(_svr, fh));
> }
>
> return (*file) ? 0 : -ENOMEM;
> @@ -325,7 +325,7 @@ int L4fs_file_system::mount(char const *source,
> unsigned long mountflags,
> if (fh < 0)
> return fh;
>
> - *dir = new L4fs_dir(svr, fh);
> + *dir = cxx::ref_ptr(new L4fs_dir(svr, fh));
> if (!dir)
> return -ENOMEM;
>
>
> please review my patch, thanks a lot!
>
--
Regards,
Leslie Zhai - a LLVM hacker https://reviews.llvm.org/p/xiangzhai/
More information about the l4-hackers
mailing list