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
hiredis
Commits
9af1574d
Commit
9af1574d
authored
Dec 01, 2010
by
Pieter Noordhuis
Browse files
Add adapter for the Redis-bundled ae event library
parent
8322162e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
9af1574d
...
...
@@ -64,6 +64,15 @@ hiredis-example-libevent: example-libevent.c adapters/libevent.h ${DYLIBNAME}
hiredis-example-libev
:
example-libev.c adapters/libev.h ${DYLIBNAME}
$(CC)
-o
$@
$(CCOPT)
$(DEBUG)
-L
.
-lhiredis
-lev
-Wl
,-rpath,. example-libev.c
ifndef
AE_DIR
hiredis-example-ae
:
@
echo
"Please specify AE_DIR (e.g. <redis repository>/src)"
@
false
else
hiredis-example-ae
:
example-ae.c adapters/ae.h ${DYLIBNAME}
$(CC)
-o
$@
$(CCOPT)
$(DEBUG)
-I
$(AE_DIR)
-L
.
-lhiredis
-Wl
,-rpath,. example-ae.c
$(AE_DIR)
/ae.o
$(AE_DIR)
/zmalloc.o
endif
hiredis-%
:
%.o ${DYLIBNAME}
$(CC)
-o
$@
$(CCOPT)
$(DEBUG)
-L
.
-lhiredis
-Wl
,-rpath,.
$<
...
...
adapters/ae.h
0 → 100644
View file @
9af1574d
#include <sys/types.h>
#include <ae.h>
#include "../hiredis.h"
#include "../async.h"
typedef
struct
redisAeEvents
{
redisAsyncContext
*
context
;
aeEventLoop
*
loop
;
int
fd
;
int
reading
,
writing
;
}
redisAeEvents
;
void
redisAeReadEvent
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
((
void
)
el
);
((
void
)
fd
);
((
void
)
mask
);
redisAeEvents
*
e
=
(
redisAeEvents
*
)
privdata
;
redisAsyncHandleRead
(
e
->
context
);
}
void
redisAeWriteEvent
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
((
void
)
el
);
((
void
)
fd
);
((
void
)
mask
);
redisAeEvents
*
e
=
(
redisAeEvents
*
)
privdata
;
redisAsyncHandleWrite
(
e
->
context
);
}
void
redisAeAddRead
(
void
*
privdata
)
{
redisAeEvents
*
e
=
(
redisAeEvents
*
)
privdata
;
aeEventLoop
*
loop
=
e
->
loop
;
if
(
!
e
->
reading
)
{
e
->
reading
=
1
;
aeCreateFileEvent
(
loop
,
e
->
fd
,
AE_READABLE
,
redisAeReadEvent
,
e
);
}
}
void
redisAeDelRead
(
void
*
privdata
)
{
redisAeEvents
*
e
=
(
redisAeEvents
*
)
privdata
;
aeEventLoop
*
loop
=
e
->
loop
;
if
(
e
->
reading
)
{
e
->
reading
=
0
;
aeDeleteFileEvent
(
loop
,
e
->
fd
,
AE_READABLE
);
}
}
void
redisAeAddWrite
(
void
*
privdata
)
{
redisAeEvents
*
e
=
(
redisAeEvents
*
)
privdata
;
aeEventLoop
*
loop
=
e
->
loop
;
if
(
!
e
->
writing
)
{
e
->
writing
=
1
;
aeCreateFileEvent
(
loop
,
e
->
fd
,
AE_WRITABLE
,
redisAeWriteEvent
,
e
);
}
}
void
redisAeDelWrite
(
void
*
privdata
)
{
redisAeEvents
*
e
=
(
redisAeEvents
*
)
privdata
;
aeEventLoop
*
loop
=
e
->
loop
;
if
(
e
->
writing
)
{
e
->
writing
=
0
;
aeDeleteFileEvent
(
loop
,
e
->
fd
,
AE_WRITABLE
);
}
}
void
redisAeCleanup
(
void
*
privdata
)
{
redisAeEvents
*
e
=
(
redisAeEvents
*
)
privdata
;
redisAeDelRead
(
privdata
);
redisAeDelWrite
(
privdata
);
free
(
e
);
}
int
redisAeAttach
(
aeEventLoop
*
loop
,
redisAsyncContext
*
ac
)
{
redisContext
*
c
=
&
(
ac
->
c
);
redisAeEvents
*
e
;
/* Nothing should be attached when something is already attached */
if
(
ac
->
data
!=
NULL
)
return
REDIS_ERR
;
/* Create container for context and r/w events */
e
=
(
redisAeEvents
*
)
malloc
(
sizeof
(
*
e
));
e
->
context
=
ac
;
e
->
loop
=
loop
;
e
->
fd
=
c
->
fd
;
e
->
reading
=
e
->
writing
=
0
;
/* Register functions to start/stop listening for events */
ac
->
evAddRead
=
redisAeAddRead
;
ac
->
evDelRead
=
redisAeDelRead
;
ac
->
evAddWrite
=
redisAeAddWrite
;
ac
->
evDelWrite
=
redisAeDelWrite
;
ac
->
evCleanup
=
redisAeCleanup
;
ac
->
data
=
e
;
return
REDIS_OK
;
}
example-ae.c
0 → 100644
View file @
9af1574d
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include "hiredis.h"
#include "async.h"
#include "adapters/ae.h"
/* Put event loop in the global scope, so it can be explicitly stopped */
static
aeEventLoop
*
loop
;
void
getCallback
(
redisAsyncContext
*
c
,
void
*
r
,
void
*
privdata
)
{
redisReply
*
reply
=
r
;
if
(
reply
==
NULL
)
return
;
printf
(
"argv[%s]: %s
\n
"
,
(
char
*
)
privdata
,
reply
->
str
);
/* Disconnect after receiving the reply to GET */
redisAsyncDisconnect
(
c
);
}
void
disconnectCallback
(
const
redisAsyncContext
*
c
,
int
status
)
{
if
(
status
!=
REDIS_OK
)
{
printf
(
"Error: %s
\n
"
,
c
->
errstr
);
}
aeStop
(
loop
);
}
int
main
(
int
argc
,
char
**
argv
)
{
signal
(
SIGPIPE
,
SIG_IGN
);
redisAsyncContext
*
c
=
redisAsyncConnect
(
"127.0.0.1"
,
6379
);
if
(
c
->
err
)
{
/* Let *c leak for now... */
printf
(
"Error: %s
\n
"
,
c
->
errstr
);
return
1
;
}
loop
=
aeCreateEventLoop
();
redisAeAttach
(
loop
,
c
);
redisAsyncSetDisconnectCallback
(
c
,
disconnectCallback
);
redisAsyncCommand
(
c
,
NULL
,
NULL
,
"SET key %b"
,
argv
[
argc
-
1
],
strlen
(
argv
[
argc
-
1
]));
redisAsyncCommand
(
c
,
getCallback
,
(
char
*
)
"end-1"
,
"GET key"
);
aeMain
(
loop
);
return
0
;
}
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