hevent.cpp 2.0 KB

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