9.5 调试事件的使用

libevent 可以检测使用事件时的一些常见错误并且进行报告。这些错误包括:

  • 将未初始化的 event 结构体当作已经初始化的

  • 试图重新初始化未决的 event 结构体

跟踪哪些事件已经初始化需要使用额外的内存和处理器时间 ,所以只应该在真正调试程序的 时候才启用调试模式。

  1. void event_enable_debug_mode(void);

必须在创建任何 event_base 之前调用这个函数。

如果在调试模式下使用大量由 event_assign(而不是 event_new)创建的事件,程序可能 会耗尽内存,这是因为没有方式可以告知 libevent 由 event_assign 创建的事件不会再被使 用了(可以调用 event_free 告知由 event_new 创建的事件已经无效了 )。如果想在调试时 避免耗尽内存,可以显式告知 libevent 这些事件不再被当作已分配的了:

  1. void event_debug_unassign(struct event *ev);

没有启用调试的时候调用 event_debug_unassign 没有效果。

实例

  1. #include <event2/event.h>
  2. #include <event2/event_struct.h>
  3. #include <stdlib.h>
  4. void cb(evutil_socket_t fd, short what, void *ptr)
  5. {
  6. /* We pass 'NULL' as the callback pointer for the heap allocated
  7. * event, and we pass the event itself as the callback pointer
  8. * for the stack-allocated event. */
  9. struct event *ev = ptr;
  10. if (ev)
  11. event_debug_unassign(ev);
  12. }
  13. /* Here's a simple mainloop that waits until fd1 and fd2 are both
  14. * ready to read. */
  15. void mainloop(evutil_socket_t fd1, evutil_socket_t fd2, int debug_mode)
  16. {
  17. struct event_base *base;
  18. struct event event_on_stack, *event_on_heap;
  19. if (debug_mode)
  20. event_enable_debug_mode();
  21. base = event_base_new();
  22. event_on_heap = event_new(base, fd1, EV_READ, cb, NULL);
  23. event_assign(&event_on_stack, base, fd2, EV_READ, cb, &event_on_stack);
  24. event_add(event_on_heap, NULL);
  25. event_add(&event_on_stack, NULL);
  26. event_base_dispatch(base);
  27. event_free(event_on_heap);
  28. event_base_free(base);
  29. }