summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2019-10-18 18:01:39 +0200
committerantirez <antirez@gmail.com>2019-10-18 18:01:39 +0200
commitd9fe3252a86914361e0d4ee057135bac5c8b0629 (patch)
tree67442033192dd9ec73ba5115169c424fe156fb02
parent673c9d702962a5618650108eaf4c5f38bcafe164 (diff)
downloadredis-d9fe3252a86914361e0d4ee057135bac5c8b0629.tar.gz
Modules hooks: initial design of data structures.
-rw-r--r--src/module.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/module.c b/src/module.c
index ff5eba787..d60763851 100644
--- a/src/module.c
+++ b/src/module.c
@@ -65,7 +65,7 @@ struct RedisModule {
list *filters; /* List of filters the module has registered. */
int in_call; /* RM_Call() nesting level */
int options; /* Module options and capabilities. */
- RedisModuleInfoFunc info_cb; /* callback for module to add INFO fields. */
+ RedisModuleInfoFunc info_cb; /* Callback for module to add INFO fields. */
};
typedef struct RedisModule RedisModule;
@@ -323,6 +323,43 @@ static struct RedisModuleForkInfo {
#define REDISMODULE_ARGV_NO_AOF (1<<1)
#define REDISMODULE_ARGV_NO_REPLICAS (1<<2)
+/* Server events hooks data structures and defines: this modules API
+ * allow modules to subscribe to certain events in Redis, such as
+ * the start and end of an RDB or AOF save, the change of role in replication,
+ * and similar other events. */
+
+#define REDISMODULE_EVENT_ID_REPLICATION_ROLE_CHANGED 0
+#define REDISMODULE_EVENT_ID_RDB_SAVE_START 1
+#define REDISMODULE_EVENT_ID_RDB_SAVE_END 2
+#define REDISMODULE_EVENT_ID_AOF_REWRITE_START 3
+#define REDISMODULE_EVENT_ID_AOF_REWRITE_END 4
+#define REDISMODULE_EVENT_ID_FLUSHDB_START 5
+#define REDISMODULE_EVENT_ID_FLUSHDB_END 6
+#define REDISMODULE_EVENT_ID_LOADING_START 7
+#define REDISMODULE_EVENT_ID_LOADING_END 8
+#define REDISMODULE_EVENT_ID_CLIENT_CONNNECTED 9
+#define REDISMODULE_EVENT_ID_CLIENT_DISCONNECTED 10
+#define REDISMODULE_EVENT_ID_SERVER_SHUTDOWN 11
+#define REDISMODULE_EVENT_ID_REPLICA_ONLINE 12
+#define REDISMODULE_EVENT_ID_REPLICA_OFFLINE 13
+#define REDISMODULE_EVENT_ID_MASTER_LINK_UP 14
+#define REDISMODULE_EVENT_ID_MASTER_LINK_DOWN 15
+
+typedef struct RedisModuleEvent {
+ uint64_t id; /* REDISMODULE_EVENT_ID_... defines. */
+ uint64_t dataver; /* Version of the structure we pass as 'data'. */
+} RedisModuleEvent;
+
+typedef int (*RedisModuleEventCallback)(RedisModuleEvent eid, void *data);
+
+typedef struct RedisModuleEventListener {
+ RedisModule *module;
+ RedisModuleEvent event;
+ RedisModuleEventCallback callback;
+} RedisModuleEventListener;
+
+list *RedisModule_EventListeners; /* Global list of all the active events. */
+
/* --------------------------------------------------------------------------
* Prototypes
* -------------------------------------------------------------------------- */
@@ -5614,6 +5651,9 @@ void moduleInitModulesSystem(void) {
/* Create the timers radix tree. */
Timers = raxNew();
+ /* Setup the event listeners data structures. */
+ RedisModule_EventListeners = listCreate();
+
/* Our thread-safe contexts GIL must start with already locked:
* it is just unlocked when it's safe. */
pthread_mutex_lock(&moduleGIL);