| 240 | } |
| 241 | |
| 242 | bool 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) { |
no test coverage detected