Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
hiredis
Commits
54a39608
Commit
54a39608
authored
Sep 30, 2011
by
Pieter Noordhuis
Browse files
Destroy hook for parser
parent
7540faf3
Changes
3
Hide whitespace changes
Inline
Side-by-side
parser.c
View file @
54a39608
...
...
@@ -497,6 +497,17 @@ error:
return
pos
-
buf
;
}
void
redis_parser_destroy
(
redis_parser
*
parser
)
{
/* Only trigger destroy callback when the parser has unfinished
* redis_protocol instances. */
if
(
parser
->
stackidx
>=
0
&&
parser
->
callbacks
&&
parser
->
callbacks
->
destroy
)
{
parser
->
callbacks
->
destroy
(
parser
,
redis_parser_root
(
parser
));
}
}
redis_protocol
*
redis_parser_root
(
redis_parser
*
parser
)
{
return
&
parser
->
stack
[
0
];
}
...
...
parser.h
View file @
54a39608
...
...
@@ -88,6 +88,7 @@ struct redis_parser_s {
void
redis_parser_init
(
redis_parser
*
parser
,
const
redis_parser_callbacks
*
callbacks
);
size_t
redis_parser_execute
(
redis_parser
*
parser
,
redis_protocol
**
dst
,
const
char
*
buf
,
size_t
len
);
void
redis_parser_destroy
(
redis_parser
*
parser
);
redis_protocol
*
redis_parser_root
(
redis_parser
*
parser
);
enum
redis_parser_errno
redis_parser_err
(
redis_parser
*
parser
);
const
char
*
redis_parser_strerror
(
enum
redis_parser_errno
err
);
...
...
test/test-parser.c
View file @
54a39608
...
...
@@ -111,11 +111,21 @@ int on_nil(redis_parser *parser, redis_protocol *p) {
return
0
;
}
static
int
destroy_called
=
0
;
void
destroy
(
redis_parser
*
parser
,
redis_protocol
*
p
)
{
((
void
)
parser
);
((
void
)
p
);
destroy_called
++
;
}
static
redis_parser_callbacks
callbacks
=
{
&
on_string
,
&
on_array
,
&
on_integer
,
&
on_nil
&
on_nil
,
&
destroy
};
#define RESET_PARSER(__parser) do { \
...
...
@@ -530,6 +540,49 @@ void test_abort_after_error(redis_parser *p) {
assert
(
res
==
NULL
);
}
void
test_destroy_callback_after_success
(
redis_parser
*
p
)
{
redis_protocol
*
res
;
enum
redis_parser_errno
err
;
RESET_PARSER
(
p
);
assert_equal_size_t
(
redis_parser_execute
(
p
,
&
res
,
"+ok
\r\n
"
,
5
),
5
);
assert
(
res
!=
NULL
);
assert
(
redis_parser_err
(
p
)
==
RPE_OK
);
/* Test that the destroy callback is NOT called when there are
* no errors or the parser is in-flight */
redis_parser_destroy
(
p
);
assert_equal_int
(
destroy_called
,
0
);
}
void
test_destroy_callback_after_error
(
redis_parser
*
p
)
{
redis_protocol
*
res
;
enum
redis_parser_errno
err
;
RESET_PARSER
(
p
);
assert_equal_size_t
(
redis_parser_execute
(
p
,
&
res
,
"+ok
\r\r
"
,
5
),
4
);
assert
(
res
==
NULL
);
assert
(
redis_parser_err
(
p
)
!=
RPE_OK
);
/* Test that the destroy callback is called after an error */
redis_parser_destroy
(
p
);
assert_equal_int
(
destroy_called
,
1
);
}
void
test_destroy_callback_in_flight
(
redis_parser
*
p
)
{
redis_protocol
*
res
;
enum
redis_parser_errno
err
;
RESET_PARSER
(
p
);
assert_equal_size_t
(
redis_parser_execute
(
p
,
&
res
,
"+ok
\r
"
,
4
),
4
);
assert
(
res
==
NULL
);
assert
(
redis_parser_err
(
p
)
==
RPE_OK
);
/* Test that the destroy callback is called when the parser is in-flight */
redis_parser_destroy
(
p
);
assert_equal_int
(
destroy_called
,
1
);
}
int
main
(
int
argc
,
char
**
argv
)
{
redis_parser
*
parser
=
malloc
(
sizeof
(
redis_parser
));
redis_parser_init
(
parser
,
&
callbacks
);
...
...
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