Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
a51dcb8b
Commit
a51dcb8b
authored
Nov 23, 2009
by
antirez
Browse files
ae_select module added
parent
266373b2
Changes
1
Show whitespace changes
Inline
Side-by-side
ae_select.c
0 → 100644
View file @
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
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment