io_watcher.cpp 996 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include "io_watcher.h"
  2. #include "hio.h"
  3. #include "hdef.h"
  4. #include "hlog.h"
  5. #include "hsocket.h"
  6. int hloop_iowatcher_init(hloop_t* loop) {
  7. return iowatcher_init(loop);
  8. }
  9. int hloop_iowatcher_cleanup(hloop_t* loop) {
  10. return iowatcher_cleanup(loop);
  11. }
  12. static void remove_bad_fds(hloop_t* loop) {
  13. int error = 0;
  14. socklen_t optlen = sizeof(int);
  15. int ret = 0;
  16. auto iter = loop->ios.begin();
  17. while (iter != loop->ios.end()) {
  18. int fd = iter->first;
  19. ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&error, &optlen);
  20. if (ret < 0 || error != 0) {
  21. hloge("getsockopt fd=%d retval=%d SO_ERROR=%d", fd, ret, error);
  22. hio_del(iter->second);
  23. continue;
  24. }
  25. ++iter;
  26. }
  27. }
  28. int hloop_handle_ios(hloop_t* loop, int timeout) {
  29. int nevent = iowatcher_poll_events(loop, timeout);
  30. if (nevent < 0) {
  31. hloge("poll_events error=%d", -nevent);
  32. remove_bad_fds(loop);
  33. }
  34. return nevent;
  35. }