1
0

loop.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "hloop.h"
  2. #include "hbase.h"
  3. #include "nlog.h"
  4. void mylogger(int loglevel, const char* buf, int len) {
  5. if (loglevel >= LOG_LEVEL_ERROR) {
  6. stderr_logger(loglevel, buf, len);
  7. }
  8. if (loglevel >= LOG_LEVEL_INFO) {
  9. file_logger(loglevel, buf, len);
  10. }
  11. network_logger(loglevel, buf, len);
  12. }
  13. void on_idle(hidle_t* idle) {
  14. printf("on_idle: event_id=%lu\tpriority=%d\tuserdata=%ld\n", hevent_id(idle), hevent_priority(idle), (long)(hevent_userdata(idle)));
  15. }
  16. void on_timer(htimer_t* timer) {
  17. hloop_t* loop = hevent_loop(timer);
  18. printf("on_timer: event_id=%lu\tpriority=%d\tuserdata=%ld\ttime=%lus\thrtime=%luus\n",
  19. hevent_id(timer), hevent_priority(timer), (long)(hevent_userdata(timer)), hloop_now(loop), hloop_now_hrtime(loop));
  20. }
  21. void cron_hourly(htimer_t* timer) {
  22. time_t tt;
  23. time(&tt);
  24. printf("cron_hourly: %s\n", ctime(&tt));
  25. }
  26. void timer_write_log(htimer_t* timer) {
  27. static int cnt = 0;
  28. hlogd("[%d] Do you recv me?", ++cnt);
  29. hlogi("[%d] Do you recv me?", ++cnt);
  30. hloge("[%d] Do you recv me?", ++cnt);
  31. }
  32. void on_stdin(hio_t* io, void* buf, int readbytes) {
  33. printf("on_stdin fd=%d readbytes=%d\n", hio_fd(io), readbytes);
  34. printf("> %s\n", buf);
  35. if (strncmp((char*)buf, "quit", 4) == 0) {
  36. hloop_stop(hevent_loop(io));
  37. }
  38. }
  39. int main() {
  40. // memcheck atexit
  41. MEMCHECK;
  42. hloop_t* loop = hloop_new(0);
  43. // test idle and priority
  44. for (int i = HEVENT_LOWEST_PRIORITY; i <= HEVENT_HIGHEST_PRIORITY; ++i) {
  45. hidle_t* idle = hidle_add(loop, on_idle, 10);
  46. hevent_set_priority(idle, i);
  47. }
  48. // test timer timeout
  49. for (int i = 1; i <= 10; ++i) {
  50. htimer_t* timer = htimer_add(loop, on_timer, i*1000, 3);
  51. hevent_set_userdata(timer, i);
  52. }
  53. // test timer period
  54. int minute = time(NULL)%3600/60;
  55. htimer_add_period(loop, cron_hourly, minute+1, -1, -1, -1, -1, INFINITE);
  56. // test network_logger
  57. htimer_add(loop, timer_write_log, 1000, INFINITE);
  58. logger_set_handler(hlog, mylogger);
  59. hlog_set_file("loop.log");
  60. logger_enable_color(hlog, 1);
  61. nlog_listen(loop, DEFAULT_LOG_PORT);
  62. // test nonblock stdin
  63. printf("input 'quit' to quit loop\n");
  64. char buf[64];
  65. hread(loop, STDIN_FILENO, buf, sizeof(buf), on_stdin);
  66. hloop_run(loop);
  67. hloop_free(&loop);
  68. return 0;
  69. }