1
0

hevent.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "hevent.h"
  2. #include "hdef.h"
  3. #include "hlog.h"
  4. #include "hsocket.h"
  5. int _on_read(hevent_t* event) {
  6. event->readable = 1;
  7. //if (event->accept) {
  8. //}
  9. if (event->read_cb) {
  10. event->read_cb(event, event->read_userdata);
  11. }
  12. event->readable = 0;
  13. return 0;
  14. }
  15. int _on_write(hevent_t* event) {
  16. // ONESHOT
  17. _del_event(event, WRITE_EVENT);
  18. event->writeable = 1;
  19. //if (event->connect) {
  20. //}
  21. if (event->write_cb) {
  22. event->write_cb(event, event->read_userdata);
  23. }
  24. event->writeable = 0;
  25. return 0;
  26. }
  27. int hloop_event_init(hloop_t* loop) {
  28. return _event_init(loop);
  29. }
  30. int hloop_event_cleanup(hloop_t* loop) {
  31. return _event_cleanup(loop);
  32. }
  33. int hloop_add_event(hevent_t* event, int type) {
  34. return _add_event(event, type);
  35. }
  36. int hloop_del_event(hevent_t* event, int type) {
  37. return _del_event(event, type);
  38. }
  39. static void remove_bad_fds(hloop_t* loop) {
  40. int error = 0;
  41. socklen_t optlen = sizeof(int);
  42. int ret = 0;
  43. auto iter = loop->events.begin();
  44. while (iter != loop->events.end()) {
  45. int fd = iter->first;
  46. ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&error, &optlen);
  47. if (ret < 0 || error != 0) {
  48. hloge("getsockopt fd=%d retval=%d SO_ERROR=%d", fd, ret, error);
  49. hloop_del_event(iter->second);
  50. iter = loop->events.erase(iter);
  51. continue;
  52. }
  53. ++iter;
  54. }
  55. }
  56. int hloop_handle_events(hloop_t* loop, int timeout) {
  57. /*
  58. // remove destroy events
  59. hevent_t* event = NULL;
  60. auto iter = loop->events.begin();
  61. while (iter != loop->events.end()) {
  62. event = iter->second;
  63. if (event->destroy) {
  64. SAFE_FREE(event);
  65. iter = loop->events.erase(iter);
  66. continue;
  67. }
  68. ++iter;
  69. }
  70. */
  71. int nevent = _handle_events(loop, timeout);
  72. if (nevent < 0) {
  73. printf("handle_events error=%d\n", -nevent);
  74. remove_bad_fds(loop);
  75. }
  76. return nevent;
  77. }