MCPcopy Create free account
hub / github.com/F-Stack/f-stack / KqueueCtrlDelRef

Method KqueueCtrlDelRef

adapter/micro_thread/kqueue_proxy.cpp:242–311  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

240}
241
242bool KqueueProxy::KqueueCtrlDelRef(int fd, int events, bool use_ref)
243{
244 KqFdRef* item = KqFdRefGet(fd);
245 if (item == NULL)
246 {
247 MT_ATTR_API(320851, 1); // fd error
248 MTLOG_ERROR("kqfd ref not find, failed, fd: %d", fd);
249 kqueue_assert(0);
250 return false;
251
252 }
253
254 item->DetachEvents(events);
255 int old_events = item->GetListenEvents();
256 int new_events = old_events &~ events;
257
258 if (use_ref) {
259 new_events = old_events;
260 if (item->ReadRefCnt() == 0) {
261 new_events = new_events & ~KQ_EVENT_READ;
262 }
263 if (item->WriteRefCnt() == 0) {
264 new_events = new_events & ~KQ_EVENT_WRITE;
265 }
266 }
267
268 if (old_events == new_events)
269 {
270 return true;
271 }
272 KqEvent ke;
273 int ret;
274 if (old_events & KQ_EVENT_WRITE) {
275 EV_SET(&ke, fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
276 ret = ff_kevent(_kqfd, &ke, 1, NULL, 0, NULL);
277 if (ret == -1) {
278 kqueue_assert(0);
279 return false;
280 }
281 }
282 if (old_events & KQ_EVENT_READ) {
283 EV_SET(&ke, fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
284 ret = ff_kevent(_kqfd, &ke, 1, NULL, 0, NULL);
285 if (ret == -1) {
286 kqueue_assert(0);
287 return false;
288 }
289 }
290
291 if (new_events & KQ_EVENT_WRITE) {
292 EV_SET(&ke, fd, EVFILT_WRITE, EV_ADD, 0, 0, NULL);
293 ret = ff_kevent(_kqfd, &ke, 1, NULL, 0, NULL);
294 if (ret == -1) {
295 kqueue_assert(0);
296 return false;
297 }
298 }
299 if (new_events & KQ_EVENT_READ) {

Callers 1

KqueueCtlDelMethod · 0.80

Calls 6

ff_keventFunction · 0.85
DetachEventsMethod · 0.80
GetListenEventsMethod · 0.80
ReadRefCntMethod · 0.80
WriteRefCntMethod · 0.80
SetListenEventsMethod · 0.80

Tested by

no test coverage detected