Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
d61e3535
提交
d61e3535
2月 14, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
c++11 atomic template from libstdc++
上级
db8baf3d
全部展开
显示空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
209 行增加
和
6 行删除
+209
-6
atomic.hh
atomic.hh
+25
-0
atomic_2.h
atomic_2.h
+0
-0
atomic_base.h
atomic_base.h
+175
-0
bio.cc
bio.cc
+2
-2
buf.hh
buf.hh
+2
-1
file.cc
file.cc
+2
-2
file.hh
file.hh
+2
-1
types.h
types.h
+1
-0
没有找到文件。
atomic.hh
0 → 100644
浏览文件 @
d61e3535
#pragma once
#define _GLIBCXX_VISIBILITY(x)
#define _GLIBCXX_BEGIN_NAMESPACE_VERSION
#define _GLIBCXX_END_NAMESPACE_VERSION
#define _GLIBCXX_BEGIN_EXTERN_C extern "C" {
#define _GLIBCXX_END_EXTERN_C }
#define __glibcxx_assert(x)
#include "atomic_base.h"
#include "atomic_2.h"
template
<
class
T
>
struct
atomic
:
public
std
::
__atomic2
::
__atomic_base
<
T
>
{
atomic
()
=
default
;
~
atomic
()
=
default
;
atomic
(
const
atomic
&
)
=
delete
;
atomic
&
operator
=
(
const
atomic
&
)
=
delete
;
atomic
&
operator
=
(
const
atomic
&
)
volatile
=
delete
;
constexpr
atomic
(
T
v
)
:
std
::
__atomic2
::
__atomic_base
<
T
>
(
v
)
{}
using
std
::
__atomic2
::
__atomic_base
<
T
>::
operator
T
;
using
std
::
__atomic2
::
__atomic_base
<
T
>::
operator
=
;
};
atomic_2.h
0 → 100644
浏览文件 @
d61e3535
差异被折叠。
点击展开。
atomic_base.h
0 → 100644
浏览文件 @
d61e3535
// -*- C++ -*- header.
// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <http://www.gnu.org/licenses/>.
/** @file bits/atomic_base.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{atomic}
*/
#ifndef _GLIBCXX_ATOMIC_BASE_H
#define _GLIBCXX_ATOMIC_BASE_H 1
#pragma GCC system_header
namespace
std
_GLIBCXX_VISIBILITY
(
default
)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @defgroup atomics Atomics
*
* Components for performing atomic operations.
* @{
*/
/// Enumeration for memory_order
typedef
enum
memory_order
{
memory_order_relaxed
,
memory_order_consume
,
memory_order_acquire
,
memory_order_release
,
memory_order_acq_rel
,
memory_order_seq_cst
}
memory_order
;
inline
memory_order
__calculate_memory_order
(
memory_order
__m
)
{
const
bool
__cond1
=
__m
==
memory_order_release
;
const
bool
__cond2
=
__m
==
memory_order_acq_rel
;
memory_order
__mo1
(
__cond1
?
memory_order_relaxed
:
__m
);
memory_order
__mo2
(
__cond2
?
memory_order_acquire
:
__mo1
);
return
__mo2
;
}
void
atomic_thread_fence
(
memory_order
);
void
atomic_signal_fence
(
memory_order
);
/// kill_dependency
template
<
typename
_Tp
>
inline
_Tp
kill_dependency
(
_Tp
__y
)
{
_Tp
__ret
(
__y
);
return
__ret
;
}
/**
* @brief Base type for atomic_flag.
*
* Base type is POD with data, allowing atomic_flag to derive from
* it and meet the standard layout type requirement. In addition to
* compatibilty with a C interface, this allows different
* implementations of atomic_flag to use the same atomic operation
* functions, via a standard conversion to the __atomic_flag_base
* argument.
*/
_GLIBCXX_BEGIN_EXTERN_C
struct
__atomic_flag_base
{
bool
_M_i
;
};
_GLIBCXX_END_EXTERN_C
#define ATOMIC_FLAG_INIT { false }
// Base types for atomics.
//
// Three nested namespaces for atomic implementation details.
//
// The nested namespace inlined into std:: is determined by the value
// of the _GLIBCXX_ATOMIC_PROPERTY macro and the resulting
// ATOMIC_*_LOCK_FREE macros.
//
// 0 == __atomic0 == Never lock-free
// 1 == __atomic1 == Best available, sometimes lock-free
// 2 == __atomic2 == Always lock-free
namespace
__atomic0
{
struct
atomic_flag
;
template
<
typename
_IntTp
>
struct
__atomic_base
;
}
namespace
__atomic2
{
struct
atomic_flag
;
template
<
typename
_IntTp
>
struct
__atomic_base
;
}
namespace
__atomic1
{
using
__atomic2
::
atomic_flag
;
using
__atomic0
::
__atomic_base
;
}
/// Lock-free Property
#if defined(_GLIBCXX_ATOMIC_BUILTINS_1) && defined(_GLIBCXX_ATOMIC_BUILTINS_2) \
&& defined(_GLIBCXX_ATOMIC_BUILTINS_4) && defined(_GLIBCXX_ATOMIC_BUILTINS_8)
# define _GLIBCXX_ATOMIC_PROPERTY 2
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic2
#elif defined(_GLIBCXX_ATOMIC_BUILTINS_1)
# define _GLIBCXX_ATOMIC_PROPERTY 1
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic1
#else
# define _GLIBCXX_ATOMIC_PROPERTY 0
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic0
#endif
#define ATOMIC_CHAR_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_CHAR16_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_CHAR32_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_WCHAR_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_SHORT_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_INT_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_LONG_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_LLONG_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
inline
namespace
_GLIBCXX_ATOMIC_NAMESPACE
{
}
#define ATOMIC_VAR_INIT(_VI) { _VI }
template
<
typename
_Tp
>
struct
atomic
;
template
<
typename
_Tp
>
struct
atomic
<
_Tp
*>
;
// @} group atomics
_GLIBCXX_END_NAMESPACE_VERSION
}
// namespace std
#endif
bio.cc
浏览文件 @
d61e3535
...
...
@@ -135,7 +135,7 @@ bread(u32 dev, u64 sector, int writer)
if
(
!
(
b
->
flags
&
B_VALID
))
iderw
(
b
);
if
(
writer
&&
!
origwriter
)
{
__sync_fetch_and_and
(
&
b
->
flags
,
~
B_BUSY
)
;
b
->
flags
&=
~
B_BUSY
;
cv_wakeup
(
&
b
->
cv
);
}
return
b
;
...
...
@@ -159,7 +159,7 @@ brelse(struct buf *b, int writer)
if
(
writer
)
{
if
((
b
->
flags
&
B_BUSY
)
==
0
)
panic
(
"brelse"
);
__sync_fetch_and_and
(
&
b
->
flags
,
~
B_BUSY
)
;
b
->
flags
&=
~
B_BUSY
;
cv_wakeup
(
&
b
->
cv
);
}
// rcu_begin_read() happens in bread
...
...
buf.hh
浏览文件 @
d61e3535
#include "gc.hh"
#include "atomic.hh"
struct
buf
:
public
rcu_freed
{
int
flags
;
atomic
<
int
>
flags
;
u32
dev
;
u64
sector
;
struct
buf
*
prev
;
// LRU cache list
...
...
file.cc
浏览文件 @
d61e3535
...
...
@@ -28,7 +28,7 @@ filealloc(void)
struct
file
*
filedup
(
struct
file
*
f
)
{
if
(
__sync_fetch_and_add
(
&
f
->
ref
,
1
)
<
1
)
if
(
f
->
ref
++
<
1
)
panic
(
"filedup"
);
return
f
;
}
...
...
@@ -37,7 +37,7 @@ filedup(struct file *f)
void
fileclose
(
struct
file
*
f
)
{
if
(
subfetch
(
&
f
->
ref
,
1
)
>
0
)
if
(
--
f
->
ref
>
0
)
return
;
if
(
f
->
type
==
file
::
FD_PIPE
)
...
...
file.hh
浏览文件 @
d61e3535
#include "cpputil.hh"
#include "ns.hh"
#include "gc.hh"
#include "atomic.hh"
u64
namehash
(
const
strbuf
<
DIRSIZ
>&
);
struct
file
{
enum
{
FD_NONE
,
FD_PIPE
,
FD_INODE
,
FD_SOCKET
}
type
;
int
ref
;
// reference count
atomic
<
int
>
ref
;
// reference count
char
readable
;
char
writable
;
...
...
types.h
浏览文件 @
d61e3535
...
...
@@ -18,4 +18,5 @@ typedef pme_t pml4e_t;
typedef
s64
ssize_t
;
typedef
u64
size_t
;
typedef
u64
off_t
;
typedef
s64
ptrdiff_t
;
#endif
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论