| 166 | } |
| 167 | |
| 168 | bool KqueueProxy::KqueueCtrlAdd(int fd, int events) |
| 169 | { |
| 170 | KqFdRef* item = KqFdRefGet(fd); |
| 171 | if (item == NULL) |
| 172 | { |
| 173 | MT_ATTR_API(320851, 1); // fd error, wtf? |
| 174 | MTLOG_ERROR("kqfd ref not find, failed, fd: %d", fd); |
| 175 | kqueue_assert(0); |
| 176 | return false; |
| 177 | } |
| 178 | |
| 179 | item->AttachEvents(events); |
| 180 | |
| 181 | int old_events = item->GetListenEvents(); |
| 182 | int new_events = old_events | events; |
| 183 | if (old_events == new_events) |
| 184 | { |
| 185 | return true; |
| 186 | } |
| 187 | |
| 188 | KqEvent ke; |
| 189 | int ret; |
| 190 | if (old_events & KQ_EVENT_WRITE) { |
| 191 | EV_SET(&ke, fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); |
| 192 | ret = ff_kevent(_kqfd, &ke, 1, NULL, 0, NULL); |
| 193 | if (ret == -1) { |
| 194 | // TODO, error check |
| 195 | item->DetachEvents(events); |
| 196 | kqueue_assert(0); |
| 197 | return false; |
| 198 | } |
| 199 | } |
| 200 | if (old_events & KQ_EVENT_READ) { |
| 201 | EV_SET(&ke, fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); |
| 202 | ret = ff_kevent(_kqfd, &ke, 1, NULL, 0, NULL); |
| 203 | if (ret == -1) { |
| 204 | // TODO, error check |
| 205 | item->DetachEvents(events); |
| 206 | kqueue_assert(0); |
| 207 | return false; |
| 208 | } |
| 209 | } |
| 210 | if (events & KQ_EVENT_WRITE) { |
| 211 | EV_SET(&ke, fd, EVFILT_WRITE, EV_ADD, 0, 0, NULL); |
| 212 | ret = ff_kevent(_kqfd, &ke, 1, NULL, 0, NULL); |
| 213 | if (ret == -1) { |
| 214 | // TODO, error check |
| 215 | item->DetachEvents(events); |
| 216 | kqueue_assert(0); |
| 217 | return false; |
| 218 | } |
| 219 | } |
| 220 | if (events & KQ_EVENT_READ) { |
| 221 | EV_SET(&ke, fd, EVFILT_READ, EV_ADD, 0, 0, NULL); |
| 222 | ret = ff_kevent(_kqfd, &ke, 1, NULL, 0, NULL); |
| 223 | if (ret == -1) { |
| 224 | // TODO, error check |
| 225 | item->DetachEvents(events); |
no test coverage detected