Skip to content
Snippets Groups Projects
Commit e4552a8b authored by Avi Kivity's avatar Avi Kivity
Browse files

file: generalize make_file() to be able to create derived types

parent af5d4fc8
No related branches found
No related tags found
No related merge requests found
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <cstdint> #include <cstdint>
#include <boost/intrusive_ptr.hpp> #include <boost/intrusive_ptr.hpp>
#include <osv/file.h> #include <osv/file.h>
#include <utility>
static inline void intrusive_ptr_add_ref(file *fp) static inline void intrusive_ptr_add_ref(file *fp)
{ {
...@@ -43,23 +44,29 @@ uint64_t size(fileref f); ...@@ -43,23 +44,29 @@ uint64_t size(fileref f);
void read(fileref f, void *buffer, uint64_t offset, uint64_t len); void read(fileref f, void *buffer, uint64_t offset, uint64_t len);
void write(fileref f, const void* buffer, uint64_t offset, uint64_t len); void write(fileref f, const void* buffer, uint64_t offset, uint64_t len);
template <class file_type = file> template <class file_type, typename... args>
fileref fileref
make_file(unsigned flags, filetype_t type, make_file(args&&... a)
void *opaque, struct fileops *ops)
{ {
file* fp = new (std::nothrow) file_type(flags, type, opaque, ops); file* fp = new (std::nothrow) file_type(std::forward<args>(a)...);
if (!fp) { if (!fp) {
throw ENOMEM; throw ENOMEM;
} }
return fileref(fp, false); return fileref(fp, false);
} }
template <class T, class file_type = file> inline
fileref make_file(unsigned flags, filetype_t type, fileref make_file(unsigned flags, filetype_t type, void *opaque,
std::unique_ptr<T>&& opaque, struct fileops *ops) struct fileops *ops)
{ {
auto f = make_file<file_type>(flags, type, opaque.get(), ops); return make_file<file>(flags, type, opaque, ops);
}
template <typename T>
fileref make_file(unsigned flags, filetype_t type, std::unique_ptr<T>&& opaque,
struct fileops *ops)
{
auto f = make_file<file>(flags, type, opaque.get(), ops);
opaque.release(); opaque.release();
return f; return f;
} }
......
...@@ -166,16 +166,6 @@ file::file(unsigned flags, filetype_t type, void *opaque, ...@@ -166,16 +166,6 @@ file::file(unsigned flags, filetype_t type, void *opaque,
fo_init(fp); fo_init(fp);
} }
fileref make_file(unsigned flags, filetype_t type, void *opaque,
struct fileops *ops)
{
file* fp = new (std::nothrow) file(flags, type, opaque, ops);
if (!fp) {
throw ENOMEM;
}
return fileref(fp, false);
}
void fhold(struct file* fp) void fhold(struct file* fp)
{ {
__sync_fetch_and_add(&fp->f_count, 1); __sync_fetch_and_add(&fp->f_count, 1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment