2 Copyright (c) 2018-2019 Nokia.
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
17 #include "private/redis/hiredisclusterepolladapter.hpp"
18 #include <sys/epoll.h>
19 #include "private/engine.hpp"
20 #include "private/redis/hiredisclustersystem.hpp"
22 using namespace shareddatalayer;
23 using namespace shareddatalayer::redis;
27 int attachFunction(redisAsyncContext* ac, void* data)
29 auto instance(static_cast<HiredisClusterEpollAdapter*>(data));
34 void addReadWrap(void* data)
36 auto instance(static_cast<HiredisClusterEpollAdapter::Node*>(data));
40 void addWriteWrap(void* data)
42 auto instance(static_cast<HiredisClusterEpollAdapter::Node*>(data));
46 void delReadWrap(void* data)
48 auto instance(static_cast<HiredisClusterEpollAdapter::Node*>(data));
52 void delWriteWrap(void* data)
54 auto instance(static_cast<HiredisClusterEpollAdapter::Node*>(data));
58 void cleanupWrap(void* data)
60 auto instance(static_cast<HiredisClusterEpollAdapter::Node*>(data));
65 HiredisClusterEpollAdapter::HiredisClusterEpollAdapter(Engine& engine):
66 HiredisClusterEpollAdapter(engine, HiredisClusterSystem::getInstance())
70 HiredisClusterEpollAdapter::HiredisClusterEpollAdapter(Engine& engine, HiredisClusterSystem& hiredisClusterSystem):
72 hiredisClusterSystem(hiredisClusterSystem)
76 void HiredisClusterEpollAdapter::setup(redisClusterAsyncContext* acc)
79 acc->attach_fn = attachFunction;
82 void HiredisClusterEpollAdapter::attach(redisAsyncContext* ac)
85 nodes.insert(std::make_pair(ac->c.fd,
86 std::unique_ptr<Node>(new Node(engine,
88 hiredisClusterSystem))));
91 void HiredisClusterEpollAdapter::detach(const redisAsyncContext* ac)
93 auto it = nodes.find(ac->c.fd);
94 if (it != nodes.end())
98 HiredisClusterEpollAdapter::Node::Node(Engine& engine,
99 redisAsyncContext* ac,
100 HiredisClusterSystem& hiredisClusterSystem):
102 hiredisClusterSystem(hiredisClusterSystem),
108 this->ac->ev.data = this;
109 this->ac->ev.addRead = addReadWrap;
110 this->ac->ev.addWrite = addWriteWrap;
111 this->ac->ev.delRead = delReadWrap;
112 this->ac->ev.delWrite = delWriteWrap;
113 this->ac->ev.cleanup = cleanupWrap;
114 engine.addMonitoredFD(ac->c.fd,
116 std::bind(&HiredisClusterEpollAdapter::Node::eventHandler,
118 std::placeholders::_1));
122 HiredisClusterEpollAdapter::Node::~Node()
128 void HiredisClusterEpollAdapter::Node::eventHandler(unsigned int events)
130 if (events & Engine::EVENT_IN)
131 if (reading && isMonitoring)
132 hiredisClusterSystem.redisAsyncHandleRead(ac);
133 if (events & Engine::EVENT_OUT)
134 if (writing && isMonitoring)
135 hiredisClusterSystem.redisAsyncHandleWrite(ac);
138 void HiredisClusterEpollAdapter::Node::addRead()
143 eventState |= Engine::EVENT_IN;
144 engine.modifyMonitoredFD(ac->c.fd, eventState);
147 void HiredisClusterEpollAdapter::Node::addWrite()
152 eventState |= Engine::EVENT_OUT;
153 engine.modifyMonitoredFD(ac->c.fd, eventState);
156 void HiredisClusterEpollAdapter::Node::delRead()
159 eventState &= ~Engine::EVENT_IN;
160 engine.modifyMonitoredFD(ac->c.fd, eventState);
163 void HiredisClusterEpollAdapter::Node::delWrite()
166 eventState &= ~Engine::EVENT_OUT;
167 engine.modifyMonitoredFD(ac->c.fd, eventState);
170 void HiredisClusterEpollAdapter::Node::cleanup()
175 engine.deleteMonitoredFD(ac->c.fd);
176 isMonitoring = false;