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
5baf50d8
Commit
5baf50d8
authored
Jun 28, 2018
by
antirez
Browse files
Rax library updated (node callback).
parent
ab55f9da
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/rax.c
View file @
5baf50d8
...
@@ -1241,6 +1241,8 @@ int raxIteratorNextStep(raxIterator *it, int noup) {
...
@@ -1241,6 +1241,8 @@ int raxIteratorNextStep(raxIterator *it, int noup) {
if
(
!
raxIteratorAddChars
(
it
,
it
->
node
->
data
,
if
(
!
raxIteratorAddChars
(
it
,
it
->
node
->
data
,
it
->
node
->
iscompr
?
it
->
node
->
size
:
1
))
return
0
;
it
->
node
->
iscompr
?
it
->
node
->
size
:
1
))
return
0
;
memcpy
(
&
it
->
node
,
cp
,
sizeof
(
it
->
node
));
memcpy
(
&
it
->
node
,
cp
,
sizeof
(
it
->
node
));
/* Call the node callback if any, and replace the node pointer
* if the callback returns true. */
if
(
it
->
node_cb
&&
it
->
node_cb
(
&
it
->
node
))
if
(
it
->
node_cb
&&
it
->
node_cb
(
&
it
->
node
))
memcpy
(
cp
,
&
it
->
node
,
sizeof
(
it
->
node
));
memcpy
(
cp
,
&
it
->
node
,
sizeof
(
it
->
node
));
/* For "next" step, stop every time we find a key along the
/* For "next" step, stop every time we find a key along the
...
@@ -1295,6 +1297,8 @@ int raxIteratorNextStep(raxIterator *it, int noup) {
...
@@ -1295,6 +1297,8 @@ int raxIteratorNextStep(raxIterator *it, int noup) {
raxIteratorAddChars
(
it
,
it
->
node
->
data
+
i
,
1
);
raxIteratorAddChars
(
it
,
it
->
node
->
data
+
i
,
1
);
if
(
!
raxStackPush
(
&
it
->
stack
,
it
->
node
))
return
0
;
if
(
!
raxStackPush
(
&
it
->
stack
,
it
->
node
))
return
0
;
memcpy
(
&
it
->
node
,
cp
,
sizeof
(
it
->
node
));
memcpy
(
&
it
->
node
,
cp
,
sizeof
(
it
->
node
));
/* Call the node callback if any, and replace the node
* pointer if the callback returns true. */
if
(
it
->
node_cb
&&
it
->
node_cb
(
&
it
->
node
))
if
(
it
->
node_cb
&&
it
->
node_cb
(
&
it
->
node
))
memcpy
(
cp
,
&
it
->
node
,
sizeof
(
it
->
node
));
memcpy
(
cp
,
&
it
->
node
,
sizeof
(
it
->
node
));
if
(
it
->
node
->
iskey
)
{
if
(
it
->
node
->
iskey
)
{
...
...
src/rax.h
View file @
5baf50d8
...
@@ -119,9 +119,18 @@ typedef struct raxStack {
...
@@ -119,9 +119,18 @@ typedef struct raxStack {
int
oom
;
/* True if pushing into this stack failed for OOM at some point. */
int
oom
;
/* True if pushing into this stack failed for OOM at some point. */
}
raxStack
;
}
raxStack
;
/* Optional callback used for iterators and be notified on each rax node.
/* Optional callback used for iterators and be notified on each rax node,
* This is used by active defrag, the return value is an indication that
* including nodes not representing keys. If the callback returns true
* the noderef was chagned, and the tree needs to be updated.
* the callback changed the node pointer in the iterator structure, and the
* iterator implementation will have to replace the pointer in the radix tree
* internals. This allows the callback to reallocate the node to perform
* very special operations, normally not needed by normal applications.
*
* This callback is used to perform very low level analysis of the radix tree
* structure, scanning each possible node (but the root node), or in order to
* reallocate the nodes to reduce the allocation fragmentation (this is the
* Redis application for this callback).
*
* This is currently only supported in forward iterations (raxNext) */
* This is currently only supported in forward iterations (raxNext) */
typedef
int
(
*
raxNodeCallback
)(
raxNode
**
noderef
);
typedef
int
(
*
raxNodeCallback
)(
raxNode
**
noderef
);
...
@@ -143,7 +152,7 @@ typedef struct raxIterator {
...
@@ -143,7 +152,7 @@ typedef struct raxIterator {
unsigned
char
key_static_string
[
RAX_ITER_STATIC_LEN
];
unsigned
char
key_static_string
[
RAX_ITER_STATIC_LEN
];
raxNode
*
node
;
/* Current node. Only for unsafe iteration. */
raxNode
*
node
;
/* Current node. Only for unsafe iteration. */
raxStack
stack
;
/* Stack used for unsafe iteration. */
raxStack
stack
;
/* Stack used for unsafe iteration. */
raxNodeCallback
node_cb
;
raxNodeCallback
node_cb
;
/* Optional node callback. Normally set to NULL. */
}
raxIterator
;
}
raxIterator
;
/* A special pointer returned for not found items. */
/* A special pointer returned for not found items. */
...
@@ -168,7 +177,8 @@ int raxEOF(raxIterator *it);
...
@@ -168,7 +177,8 @@ int raxEOF(raxIterator *it);
void
raxShow
(
rax
*
rax
);
void
raxShow
(
rax
*
rax
);
uint64_t
raxSize
(
rax
*
rax
);
uint64_t
raxSize
(
rax
*
rax
);
/* internals */
/* Internal API. May be used by the node callback in order to access rax nodes
* in a low level way, so this function is exported as well. */
void
raxSetData
(
raxNode
*
n
,
void
*
data
);
void
raxSetData
(
raxNode
*
n
,
void
*
data
);
#endif
#endif
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