summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/deps/hiredis/adapters/macosx.h
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/deps/hiredis/adapters/macosx.h')
-rw-r--r--examples/redis-unstable/deps/hiredis/adapters/macosx.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/examples/redis-unstable/deps/hiredis/adapters/macosx.h b/examples/redis-unstable/deps/hiredis/adapters/macosx.h
new file mode 100644
index 0000000..3c87f1b
--- /dev/null
+++ b/examples/redis-unstable/deps/hiredis/adapters/macosx.h
@@ -0,0 +1,115 @@
1//
2// Created by Дмитрий Бахвалов on 13.07.15.
3// Copyright (c) 2015 Dmitry Bakhvalov. All rights reserved.
4//
5
6#ifndef __HIREDIS_MACOSX_H__
7#define __HIREDIS_MACOSX_H__
8
9#include <CoreFoundation/CoreFoundation.h>
10
11#include "../hiredis.h"
12#include "../async.h"
13
14typedef struct {
15 redisAsyncContext *context;
16 CFSocketRef socketRef;
17 CFRunLoopSourceRef sourceRef;
18} RedisRunLoop;
19
20static int freeRedisRunLoop(RedisRunLoop* redisRunLoop) {
21 if( redisRunLoop != NULL ) {
22 if( redisRunLoop->sourceRef != NULL ) {
23 CFRunLoopSourceInvalidate(redisRunLoop->sourceRef);
24 CFRelease(redisRunLoop->sourceRef);
25 }
26 if( redisRunLoop->socketRef != NULL ) {
27 CFSocketInvalidate(redisRunLoop->socketRef);
28 CFRelease(redisRunLoop->socketRef);
29 }
30 hi_free(redisRunLoop);
31 }
32 return REDIS_ERR;
33}
34
35static void redisMacOSAddRead(void *privdata) {
36 RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata;
37 CFSocketEnableCallBacks(redisRunLoop->socketRef, kCFSocketReadCallBack);
38}
39
40static void redisMacOSDelRead(void *privdata) {
41 RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata;
42 CFSocketDisableCallBacks(redisRunLoop->socketRef, kCFSocketReadCallBack);
43}
44
45static void redisMacOSAddWrite(void *privdata) {
46 RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata;
47 CFSocketEnableCallBacks(redisRunLoop->socketRef, kCFSocketWriteCallBack);
48}
49
50static void redisMacOSDelWrite(void *privdata) {
51 RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata;
52 CFSocketDisableCallBacks(redisRunLoop->socketRef, kCFSocketWriteCallBack);
53}
54
55static void redisMacOSCleanup(void *privdata) {
56 RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata;
57 freeRedisRunLoop(redisRunLoop);
58}
59
60static void redisMacOSAsyncCallback(CFSocketRef __unused s, CFSocketCallBackType callbackType, CFDataRef __unused address, const void __unused *data, void *info) {
61 redisAsyncContext* context = (redisAsyncContext*) info;
62
63 switch (callbackType) {
64 case kCFSocketReadCallBack:
65 redisAsyncHandleRead(context);
66 break;
67
68 case kCFSocketWriteCallBack:
69 redisAsyncHandleWrite(context);
70 break;
71
72 default:
73 break;
74 }
75}
76
77static int redisMacOSAttach(redisAsyncContext *redisAsyncCtx, CFRunLoopRef runLoop) {
78 redisContext *redisCtx = &(redisAsyncCtx->c);
79
80 /* Nothing should be attached when something is already attached */
81 if( redisAsyncCtx->ev.data != NULL ) return REDIS_ERR;
82
83 RedisRunLoop* redisRunLoop = (RedisRunLoop*) hi_calloc(1, sizeof(RedisRunLoop));
84 if (redisRunLoop == NULL)
85 return REDIS_ERR;
86
87 /* Setup redis stuff */
88 redisRunLoop->context = redisAsyncCtx;
89
90 redisAsyncCtx->ev.addRead = redisMacOSAddRead;
91 redisAsyncCtx->ev.delRead = redisMacOSDelRead;
92 redisAsyncCtx->ev.addWrite = redisMacOSAddWrite;
93 redisAsyncCtx->ev.delWrite = redisMacOSDelWrite;
94 redisAsyncCtx->ev.cleanup = redisMacOSCleanup;
95 redisAsyncCtx->ev.data = redisRunLoop;
96
97 /* Initialize and install read/write events */
98 CFSocketContext socketCtx = { 0, redisAsyncCtx, NULL, NULL, NULL };
99
100 redisRunLoop->socketRef = CFSocketCreateWithNative(NULL, redisCtx->fd,
101 kCFSocketReadCallBack | kCFSocketWriteCallBack,
102 redisMacOSAsyncCallback,
103 &socketCtx);
104 if( !redisRunLoop->socketRef ) return freeRedisRunLoop(redisRunLoop);
105
106 redisRunLoop->sourceRef = CFSocketCreateRunLoopSource(NULL, redisRunLoop->socketRef, 0);
107 if( !redisRunLoop->sourceRef ) return freeRedisRunLoop(redisRunLoop);
108
109 CFRunLoopAddSource(runLoop, redisRunLoop->sourceRef, kCFRunLoopDefaultMode);
110
111 return REDIS_OK;
112}
113
114#endif
115