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
redis
Commits
256ddbf6
Commit
256ddbf6
authored
Feb 15, 2018
by
antirez
Browse files
Remove non semantical spaces from module.c.
parent
280c3e39
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/module.c
View file @
256ddbf6
...
@@ -220,22 +220,25 @@ static pthread_mutex_t moduleGIL = PTHREAD_MUTEX_INITIALIZER;
...
@@ -220,22 +220,25 @@ static pthread_mutex_t moduleGIL = PTHREAD_MUTEX_INITIALIZER;
/* Function pointer type for keyspace event notification subscriptions from modules. */
/* Function pointer type for keyspace event notification subscriptions from modules. */
typedef
int
(
*
RedisModuleNotificationFunc
)
(
RedisModuleCtx
*
ctx
,
int
type
,
const
char
*
event
,
RedisModuleString
*
key
);
typedef
int
(
*
RedisModuleNotificationFunc
)
(
RedisModuleCtx
*
ctx
,
int
type
,
const
char
*
event
,
RedisModuleString
*
key
);
/* Keyspace notification subscriber information. See RM_SubscribeToKeyspaceEvents */
/* Keyspace notification subscriber information.
* See RM_SubscribeToKeyspaceEvents() for more information. */
typedef
struct
RedisModuleKeyspaceSubscriber
{
typedef
struct
RedisModuleKeyspaceSubscriber
{
/* The module subscribed to the event */
/* The module subscribed to the event */
RedisModule
*
module
;
RedisModule
*
module
;
/* Notification callback in the module*/
/* Notification callback in the module*/
RedisModuleNotificationFunc
notify_callback
;
RedisModuleNotificationFunc
notify_callback
;
/* A bit mask of the events the module is interested in */
/* A bit mask of the events the module is interested in */
int
event_mask
;
int
event_mask
;
/* Active flag set on entry, to avoid reentrant subscribers calling themselves */
/* Active flag set on entry, to avoid reentrant subscribers
int
active
;
* calling themselves */
int
active
;
}
RedisModuleKeyspaceSubscriber
;
}
RedisModuleKeyspaceSubscriber
;
/* The module keyspace notification subscribers list */
/* The module keyspace notification subscribers list */
static
list
*
moduleKeyspaceSubscribers
;
static
list
*
moduleKeyspaceSubscribers
;
/* Static client recycled for all notification clients, to avoid allocating per round. */
/* Static client recycled for all notification clients, to avoid allocating
* per round. */
static
client
*
moduleKeyspaceSubscribersClient
;
static
client
*
moduleKeyspaceSubscribersClient
;
/* --------------------------------------------------------------------------
/* --------------------------------------------------------------------------
...
@@ -3696,18 +3699,18 @@ void moduleReleaseGIL(void) {
...
@@ -3696,18 +3699,18 @@ void moduleReleaseGIL(void) {
* Module Keyspace Notifications API
* Module Keyspace Notifications API
* -------------------------------------------------------------------------- */
* -------------------------------------------------------------------------- */
/* Subscribe to keyspace notifications. This is a low-level version of the
/* Subscribe to keyspace notifications. This is a low-level version of the
* keyspace-notifications API. A module cand register callbacks to be notified
* keyspace-notifications API. A module cand register callbacks to be notified
* when keyspce events occur.
* when keyspce events occur.
*
*
* Notification events are filtered by their type (string events, set events,
* Notification events are filtered by their type (string events, set events,
* etc), and the subsriber callback receives only events that match a specific
* etc), and the subsriber callback receives only events that match a specific
* mask of event types.
* mask of event types.
*
*
* When subscribing to notifications with RedisModule_SubscribeToKeyspaceEvents
* When subscribing to notifications with RedisModule_SubscribeToKeyspaceEvents
* the module must provide an event type-mask, denoting the events the subscriber
* the module must provide an event type-mask, denoting the events the subscriber
* is interested in. This can be an ORed mask of any of the following flags:
* is interested in. This can be an ORed mask of any of the following flags:
*
*
* - REDISMODULE_NOTIFY_GENERIC: Generic commands like DEL, EXPIRE, RENAME
* - REDISMODULE_NOTIFY_GENERIC: Generic commands like DEL, EXPIRE, RENAME
* - REDISMODULE_NOTIFY_STRING: String events
* - REDISMODULE_NOTIFY_STRING: String events
* - REDISMODULE_NOTIFY_LIST: List events
* - REDISMODULE_NOTIFY_LIST: List events
...
@@ -3718,32 +3721,32 @@ void moduleReleaseGIL(void) {
...
@@ -3718,32 +3721,32 @@ void moduleReleaseGIL(void) {
* - REDISMODULE_NOTIFY_EVICTED: Eviction events
* - REDISMODULE_NOTIFY_EVICTED: Eviction events
* - REDISMODULE_NOTIFY_STREAM: Stream events
* - REDISMODULE_NOTIFY_STREAM: Stream events
* - REDISMODULE_NOTIFY_ALL: All events
* - REDISMODULE_NOTIFY_ALL: All events
*
*
* We do not distinguish between key events and keyspace events, and it is up
* We do not distinguish between key events and keyspace events, and it is up
* to the module to filter the actions taken based on the key.
* to the module to filter the actions taken based on the key.
*
*
* The subscriber signature is:
* The subscriber signature is:
*
*
* int (*RedisModuleNotificationFunc) (RedisModuleCtx *ctx, int type,
* int (*RedisModuleNotificationFunc) (RedisModuleCtx *ctx, int type,
* const char *event,
* const char *event,
* RedisModuleString *key);
* RedisModuleString *key);
*
*
* `type` is the event type bit, that must match the mask given at registration
* `type` is the event type bit, that must match the mask given at registration
* time. The event string is the actual command being executed, and key is the
* time. The event string is the actual command being executed, and key is the
* relevant Redis key.
* relevant Redis key.
*
*
* Notification callback gets executed with a redis context that can not be
* Notification callback gets executed with a redis context that can not be
* used to send anything to the client, and has the db number where the event
* used to send anything to the client, and has the db number where the event
* occured as its selected db number.
* occured as its selected db number.
*
*
* Notice that it is not necessary to enable norifications in redis.conf for
* Notice that it is not necessary to enable norifications in redis.conf for
* module notifications to work.
* module notifications to work.
*
*
* Warning: the notification callbacks are performed in a synchronous manner,
* Warning: the notification callbacks are performed in a synchronous manner,
* so notification callbacks must to be fast, or they would slow Redis down.
* so notification callbacks must to be fast, or they would slow Redis down.
* If you need to take long actions, use threads to offload them.
* If you need to take long actions, use threads to offload them.
*
*
* See https://redis.io/topics/notifications for more information.
* See https://redis.io/topics/notifications for more information.
*/
*/
int
RM_SubscribeToKeyspaceEvents
(
RedisModuleCtx
*
ctx
,
int
types
,
RedisModuleNotificationFunc
callback
)
{
int
RM_SubscribeToKeyspaceEvents
(
RedisModuleCtx
*
ctx
,
int
types
,
RedisModuleNotificationFunc
callback
)
{
RedisModuleKeyspaceSubscriber
*
sub
=
zmalloc
(
sizeof
(
*
sub
));
RedisModuleKeyspaceSubscriber
*
sub
=
zmalloc
(
sizeof
(
*
sub
));
...
@@ -3754,26 +3757,22 @@ int RM_SubscribeToKeyspaceEvents(RedisModuleCtx *ctx, int types, RedisModuleNoti
...
@@ -3754,26 +3757,22 @@ int RM_SubscribeToKeyspaceEvents(RedisModuleCtx *ctx, int types, RedisModuleNoti
listAddNodeTail
(
moduleKeyspaceSubscribers
,
sub
);
listAddNodeTail
(
moduleKeyspaceSubscribers
,
sub
);
return
REDISMODULE_OK
;
return
REDISMODULE_OK
;
}
}
/* Dispatcher for keyspace notifications to module subscriber functions.
/* Dispatcher for keyspace notifications to module subscriber functions.
* This gets called only if at least one module requested to be notified on
* This gets called only if at least one module requested to be notified on
* keyspace notifications */
* keyspace notifications */
void
moduleNotifyKeyspaceEvent
(
int
type
,
const
char
*
event
,
robj
*
key
,
int
dbid
)
{
void
moduleNotifyKeyspaceEvent
(
int
type
,
const
char
*
event
,
robj
*
key
,
int
dbid
)
{
/* Don't do anything if there aren't any subscribers */
/* Don't do anything if there aren't any subscribers */
if
(
listLength
(
moduleKeyspaceSubscribers
)
==
0
)
return
;
if
(
listLength
(
moduleKeyspaceSubscribers
)
==
0
)
return
;
listIter
li
;
listIter
li
;
listNode
*
ln
;
listNode
*
ln
;
listRewind
(
moduleKeyspaceSubscribers
,
&
li
);
listRewind
(
moduleKeyspaceSubscribers
,
&
li
);
/* Remove irrelevant flags from the type mask */
/* Remove irrelevant flags from the type mask */
type
&=
~
(
NOTIFY_KEYEVENT
|
NOTIFY_KEYSPACE
);
type
&=
~
(
NOTIFY_KEYEVENT
|
NOTIFY_KEYSPACE
);
while
((
ln
=
listNext
(
&
li
)))
{
while
((
ln
=
listNext
(
&
li
)))
{
RedisModuleKeyspaceSubscriber
*
sub
=
ln
->
value
;
RedisModuleKeyspaceSubscriber
*
sub
=
ln
->
value
;
/* Only notify subscribers on events matching they registration,
/* Only notify subscribers on events matching they registration,
...
@@ -3784,7 +3783,7 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid)
...
@@ -3784,7 +3783,7 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid)
ctx
.
client
=
moduleKeyspaceSubscribersClient
;
ctx
.
client
=
moduleKeyspaceSubscribersClient
;
selectDb
(
ctx
.
client
,
dbid
);
selectDb
(
ctx
.
client
,
dbid
);
/* mark the handler as activer to avoid reentrant loops.
/* mark the handler as activer to avoid reentrant loops.
* If the subscriber performs an action triggering itself,
* If the subscriber performs an action triggering itself,
* it will not be notified about it. */
* it will not be notified about it. */
sub
->
active
=
1
;
sub
->
active
=
1
;
...
@@ -3793,7 +3792,6 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid)
...
@@ -3793,7 +3792,6 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid)
moduleFreeContext
(
&
ctx
);
moduleFreeContext
(
&
ctx
);
}
}
}
}
}
}
/* Unsubscribe any notification subscirbers this module has upon unloading */
/* Unsubscribe any notification subscirbers this module has upon unloading */
...
@@ -3810,7 +3808,6 @@ void moduleUnsubscribeNotifications(RedisModule *module) {
...
@@ -3810,7 +3808,6 @@ void moduleUnsubscribeNotifications(RedisModule *module) {
}
}
}
}
/* --------------------------------------------------------------------------
/* --------------------------------------------------------------------------
* Modules API internals
* Modules API internals
* -------------------------------------------------------------------------- */
* -------------------------------------------------------------------------- */
...
@@ -3848,10 +3845,9 @@ void moduleRegisterCoreAPI(void);
...
@@ -3848,10 +3845,9 @@ void moduleRegisterCoreAPI(void);
void
moduleInitModulesSystem
(
void
)
{
void
moduleInitModulesSystem
(
void
)
{
moduleUnblockedClients
=
listCreate
();
moduleUnblockedClients
=
listCreate
();
server
.
loadmodule_queue
=
listCreate
();
server
.
loadmodule_queue
=
listCreate
();
modules
=
dictCreate
(
&
modulesDictType
,
NULL
);
modules
=
dictCreate
(
&
modulesDictType
,
NULL
);
/* Set up the keyspace notification susbscriber list and static client */
/* Set up the keyspace notification susbscriber list and static client */
moduleKeyspaceSubscribers
=
listCreate
();
moduleKeyspaceSubscribers
=
listCreate
();
moduleKeyspaceSubscribersClient
=
createClient
(
-
1
);
moduleKeyspaceSubscribersClient
=
createClient
(
-
1
);
...
@@ -3907,7 +3903,6 @@ void moduleFreeModuleStructure(struct RedisModule *module) {
...
@@ -3907,7 +3903,6 @@ void moduleFreeModuleStructure(struct RedisModule *module) {
zfree
(
module
);
zfree
(
module
);
}
}
void
moduleUnregisterCommands
(
struct
RedisModule
*
module
)
{
void
moduleUnregisterCommands
(
struct
RedisModule
*
module
)
{
/* Unregister all the commands registered by this module. */
/* Unregister all the commands registered by this module. */
dictIterator
*
di
=
dictGetSafeIterator
(
server
.
commands
);
dictIterator
*
di
=
dictGetSafeIterator
(
server
.
commands
);
...
...
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