// File: /workspace/github_c_makefile_star2_O0/nilyang[P]redis-tdd-annotation/src/notify.c
// Function: notifyKeyspaceEvent
void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
    sds chan;
    robj *chanobj, *eventobj;
    int len = -1;
    char buf[24];

    /* If notifications for this class of events are off, return ASAP. */
    // 如果服务器配置为不发送 type 类型的通知，那么直接返回
    if (!(server.notify_keyspace_events & type)) return;

    // 事件的名字
    eventobj = createStringObject(event,strlen(event));

    /* __keyspace@<db>__:<key> <event> notifications. */
    // 发送键空间通知
    if (server.notify_keyspace_events & REDIS_NOTIFY_KEYSPACE) {

        // 构建频道对象
        chan = sdsnewlen("__keyspace@",11);
        len = ll2string(buf,sizeof(buf),dbid);
        chan = sdscatlen(chan, buf, len);
        chan = sdscatlen(chan, "__:", 3);
        chan = sdscatsds(chan, key->ptr);

        chanobj = createObject(REDIS_STRING, chan);

        // 通过 publish 命令发送通知
        pubsubPublishMessage(chanobj, eventobj);

        // 释放频道对象
        decrRefCount(chanobj);
    }

    /* __keyevente@<db>__:<event> <key> notifications. */
    // 发送键事件通知
    if (server.notify_keyspace_events & REDIS_NOTIFY_KEYEVENT) {

        // 构建频道对象
        chan = sdsnewlen("__keyevent@",11);
        // 如果在前面发送键空间通知的时候计算了 len ，那么它就不会是 -1
        // 这可以避免计算两次 buf 的长度
        if (len == -1) len = ll2string(buf,sizeof(buf),dbid);
        chan = sdscatlen(chan, buf, len);
        chan = sdscatlen(chan, "__:", 3);
        chan = sdscatsds(chan, eventobj->ptr);

        chanobj = createObject(REDIS_STRING, chan);

        // 通过 publish 命令发送通知
        pubsubPublishMessage(chanobj, key);

        // 释放频道对象
        decrRefCount(chanobj);
    }

    // 释放事件对象
    decrRefCount(eventobj);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movl %edi, -0x4(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movl $0xffffffff, -0x3c(%rbp) # imm = 0xFFFFFFFF
leaq 0x92434(%rip), %rax     # 0x1138f8
movl 0x7b8(%rax), %eax
andl -0x4(%rbp), %eax
cmpl $0x0, %eax
jne 0x814d7
jmp 0x8165d
movq -0x10(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rdi
callq 0x1f4d0
movq -0x68(%rbp), %rdi
movq %rax, %rsi
callq 0x3a2e0
movq %rax, -0x38(%rbp)
leaq 0x923f9(%rip), %rax     # 0x1138f8
movl 0x7b8(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x815a3
leaq 0x68be2(%rip), %rdi     # 0xea0fa
movl $0xb, %esi
callq 0x2c000
movq %rax, -0x28(%rbp)
leaq -0x60(%rbp), %rdi
movslq -0x1c(%rbp), %rdx
movl $0x18, %esi
callq 0x39660
movl %eax, -0x3c(%rbp)
movq -0x28(%rbp), %rdi
leaq -0x60(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
callq 0x2c500
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
leaq 0x68bab(%rip), %rsi     # 0xea106
movl $0x3, %edx
callq 0x2c500
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x2c5f0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rsi
xorl %edi, %edi
callq 0x3a0d0
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x62060
movq -0x30(%rbp), %rdi
callq 0x3aaa0
leaq 0x9234e(%rip), %rax     # 0x1138f8
movl 0x7b8(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
je 0x81654
leaq 0x68b47(%rip), %rdi     # 0xea10a
movl $0xb, %esi
callq 0x2c000
movq %rax, -0x28(%rbp)
cmpl $-0x1, -0x3c(%rbp)
jne 0x815ec
leaq -0x60(%rbp), %rdi
movslq -0x1c(%rbp), %rdx
movl $0x18, %esi
callq 0x39660
movl %eax, -0x3c(%rbp)
movq -0x28(%rbp), %rdi
leaq -0x60(%rbp), %rsi
movslq -0x3c(%rbp), %rdx
callq 0x2c500
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
leaq 0x68afa(%rip), %rsi     # 0xea106
movl $0x3, %edx
callq 0x2c500
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x2c5f0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rsi
xorl %edi, %edi
callq 0x3a0d0
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x62060
movq -0x30(%rbp), %rdi
callq 0x3aaa0
movq -0x38(%rbp), %rdi
callq 0x3aaa0
addq $0x70, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nopl (%rax)