Misc filetable C++ clean up

上级 d99a5ad0
...@@ -2,27 +2,23 @@ ...@@ -2,27 +2,23 @@
class filetable { class filetable {
public: public:
filetable() : ref_(1) { static filetable* alloc() {
for(int fd = 0; fd < NOFILE; fd++) return new filetable();
ofile_[fd] = nullptr;
} }
filetable(const filetable &f) : ref_(1) { filetable* copy() {
filetable* t = alloc();
if (t == nullptr)
return nullptr;
for(int fd = 0; fd < NOFILE; fd++) { for(int fd = 0; fd < NOFILE; fd++) {
if (f.ofile_[fd]) sref<file> f;
ofile_[fd].store(f.ofile_[fd].load()->dup()); if (getfile(fd, &f))
t->ofile_[fd].store(f->dup());
else else
ofile_[fd] = nullptr; t->ofile_[fd] = nullptr;
}
}
~filetable() {
for(int fd = 0; fd < NOFILE; fd++){
if (ofile_[fd]){
ofile_[fd].load()->dec();
ofile_[fd] = nullptr;
}
} }
return t;
} }
bool getfile(int fd, sref<file> *sf) { bool getfile(int fd, sref<file> *sf) {
...@@ -65,9 +61,25 @@ public: ...@@ -65,9 +61,25 @@ public:
ref_++; ref_++;
} }
NEW_DELETE_OPS(filetable)
private: private:
filetable() : ref_(1) {
for(int fd = 0; fd < NOFILE; fd++)
ofile_[fd] = nullptr;
}
~filetable() {
for(int fd = 0; fd < NOFILE; fd++){
if (ofile_[fd]){
ofile_[fd].load()->dec();
ofile_[fd] = nullptr;
}
}
}
filetable& operator=(const filetable&);
filetable(const filetable& x);
NEW_DELETE_OPS(filetable);
std::atomic<file*> ofile_[NOFILE]; std::atomic<file*> ofile_[NOFILE];
std::atomic<u64> ref_; std::atomic<u64> ref_;
}; };
...@@ -377,7 +377,7 @@ fork(int flags) ...@@ -377,7 +377,7 @@ fork(int flags)
myproc()->ftable->incref(); myproc()->ftable->incref();
np->ftable = myproc()->ftable; np->ftable = myproc()->ftable;
} else { } else {
np->ftable = new filetable(*myproc()->ftable); np->ftable = myproc()->ftable->copy();
if (np->ftable == nullptr) { if (np->ftable == nullptr) {
// XXX(sbw) leaking? // XXX(sbw) leaking?
freeproc(np); freeproc(np);
......
...@@ -21,7 +21,7 @@ inituser(void) ...@@ -21,7 +21,7 @@ inituser(void)
extern u64 _initcode_size; extern u64 _initcode_size;
p = proc::alloc(); p = proc::alloc();
p->ftable = new filetable(); p->ftable = filetable::alloc();
if (p->ftable == nullptr) if (p->ftable == nullptr)
panic("userinit: new filetable"); panic("userinit: new filetable");
bootproc = p; bootproc = p;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论