提交 009a6d08 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

add operator->() to atomic pointers

use atomic<> for dir pointer in an inode
上级 392bdc80
...@@ -464,6 +464,14 @@ namespace __atomic2 ...@@ -464,6 +464,14 @@ namespace __atomic2
{ return load(); } { return load(); }
__pointer_type __pointer_type
operator->() const
{ return load(); }
__pointer_type
operator->() const volatile
{ return load(); }
__pointer_type
operator=(__pointer_type __p) operator=(__pointer_type __p)
{ {
store(__p); store(__p);
......
...@@ -30,7 +30,7 @@ struct inode : public rcu_freed { ...@@ -30,7 +30,7 @@ struct inode : public rcu_freed {
struct condvar cv; struct condvar cv;
struct spinlock lock; struct spinlock lock;
char lockname[16]; char lockname[16];
xns<strbuf<DIRSIZ>, u32, namehash> *dir; atomic<xns<strbuf<DIRSIZ>, u32, namehash>*> dir;
short type; // copy of disk inode short type; // copy of disk inode
short major; short major;
......
...@@ -643,7 +643,9 @@ dir_init(struct inode *dp) ...@@ -643,7 +643,9 @@ dir_init(struct inode *dp)
} }
brelse(bp, 0); brelse(bp, 0);
} }
if (!__sync_bool_compare_and_swap(&dp->dir, 0, dir)) {
decltype(dir) expect_null = 0;
if (!dp->dir.compare_exchange_strong(expect_null, dir)) {
// XXX free all the dirents // XXX free all the dirents
delete dir; delete dir;
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论