Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
a51dcb8b
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a51dcb8b
编写于
11月 23, 2009
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ae_select module added
上级
266373b2
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
74 addition
and
0 deletion
+74
-0
ae_select.c
ae_select.c
+74
-0
未找到文件。
ae_select.c
0 → 100644
浏览文件 @
a51dcb8b
/* Select()-based ae.c module
* Copyright (C) 2009 Salvatore Sanfilippo - antirez@gmail.com
* Released under the BSD license. See the COPYING file for more info. */
#include <string.h>
typedef
struct
aeApiState
{
fd_set
rfds
,
wfds
,
efds
;
/* We need to have a copy of the fd sets as it's not safe to reuse
* FD sets after select(). */
fd_set
_rfds
,
_wfds
,
_efds
;
}
aeApiState
;
static
int
aeApiCreate
(
aeEventLoop
*
eventLoop
)
{
aeApiState
*
state
=
zmalloc
(
sizeof
(
aeApiState
));
if
(
!
state
)
return
-
1
;
FD_ZERO
(
&
state
->
rfds
);
FD_ZERO
(
&
state
->
wfds
);
FD_ZERO
(
&
state
->
efds
);
eventLoop
->
apidata
=
state
;
return
0
;
}
static
void
aeApiFree
(
aeEventLoop
*
eventLoop
)
{
zfree
(
eventLoop
->
apidata
);
}
static
int
aeApiAddEvent
(
aeEventLoop
*
eventLoop
,
int
fd
,
int
mask
)
{
aeApiState
*
state
=
eventLoop
->
apidata
;
if
(
mask
&
AE_READABLE
)
FD_SET
(
fd
,
&
state
->
rfds
);
if
(
mask
&
AE_WRITABLE
)
FD_SET
(
fd
,
&
state
->
wfds
);
if
(
mask
&
AE_EXCEPTION
)
FD_SET
(
fd
,
&
state
->
efds
);
return
0
;
}
static
void
aeApiDelEvent
(
aeEventLoop
*
eventLoop
,
int
fd
,
int
mask
)
{
aeApiState
*
state
=
eventLoop
->
apidata
;
if
(
mask
&
AE_READABLE
)
FD_CLR
(
fd
,
&
state
->
rfds
);
if
(
mask
&
AE_WRITABLE
)
FD_CLR
(
fd
,
&
state
->
wfds
);
if
(
mask
&
AE_EXCEPTION
)
FD_CLR
(
fd
,
&
state
->
efds
);
}
static
int
aeApiPoll
(
aeEventLoop
*
eventLoop
,
struct
timeval
*
tvp
)
{
aeApiState
*
state
=
eventLoop
->
apidata
;
int
retval
,
j
,
numevents
=
0
;
memcpy
(
&
state
->
_rfds
,
&
state
->
rfds
,
sizeof
(
fd_set
));
memcpy
(
&
state
->
_wfds
,
&
state
->
wfds
,
sizeof
(
fd_set
));
memcpy
(
&
state
->
_efds
,
&
state
->
efds
,
sizeof
(
fd_set
));
retval
=
select
(
eventLoop
->
maxfd
+
1
,
&
state
->
_rfds
,
&
state
->
_wfds
,
&
state
->
_efds
,
tvp
);
if
(
retval
>
0
)
{
for
(
j
=
0
;
j
<=
eventLoop
->
maxfd
;
j
++
)
{
int
mask
=
0
;
aeFileEvent
*
fe
=
&
eventLoop
->
events
[
j
];
if
(
fe
->
mask
==
AE_NONE
)
continue
;
if
(
fe
->
mask
&
AE_READABLE
&&
FD_ISSET
(
j
,
&
state
->
_rfds
))
mask
|=
AE_READABLE
;
if
(
fe
->
mask
&
AE_WRITABLE
&&
FD_ISSET
(
j
,
&
state
->
_wfds
))
mask
|=
AE_WRITABLE
;
if
(
fe
->
mask
&
AE_EXCEPTION
&&
FD_ISSET
(
j
,
&
state
->
_efds
))
mask
|=
AE_EXCEPTION
;
eventLoop
->
fired
[
numevents
].
fd
=
j
;
eventLoop
->
fired
[
numevents
].
mask
=
mask
;
numevents
++
;
}
}
return
numevents
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录