/modules/timer/timer.c

https://bitbucket.org/cesbo/astra · C · 101 lines · 71 code · 23 blank · 7 comment · 4 complexity · d52a7a1bf8a3478ccc66228fb6888ade MD5 · raw file

  1. /*
  2. * For more information, visit https://cesbo.com
  3. * Copyright (C) 2012, Andrey Dyldin <and@cesbo.com>
  4. */
  5. #include <astra.h>
  6. #define LOG_MSG(_msg) "[timer] " _msg
  7. struct module_data_s
  8. {
  9. MODULE_BASE();
  10. struct
  11. {
  12. int interval;
  13. } config;
  14. int idx_cb;
  15. int idx_self;
  16. void *timer;
  17. };
  18. /* callbacks */
  19. static void timer_callback(void *arg)
  20. {
  21. module_data_t *mod = arg;
  22. lua_State *L = LUA_STATE(mod);
  23. lua_rawgeti(L, LUA_REGISTRYINDEX, mod->idx_cb);
  24. lua_rawgeti(L, LUA_REGISTRYINDEX, mod->idx_self);
  25. lua_call(L, 1, 0);
  26. }
  27. /* methods */
  28. static int method_close(module_data_t *mod)
  29. {
  30. lua_State *L = LUA_STATE(mod);
  31. if(mod->timer)
  32. {
  33. timer_detach(mod->timer);
  34. mod->timer = NULL;
  35. }
  36. luaL_unref(L, LUA_REGISTRYINDEX, mod->idx_self);
  37. mod->idx_self = 0;
  38. luaL_unref(L, LUA_REGISTRYINDEX, mod->idx_cb);
  39. mod->idx_cb = 0;
  40. return 0;
  41. }
  42. /* required */
  43. static void module_configure(module_data_t *mod)
  44. {
  45. module_set_number(mod, "interval", 1, 0, &mod->config.interval);
  46. if(mod->config.interval <= 0)
  47. {
  48. log_error(LOG_MSG("option \"interval\" must be greater than 0"));
  49. abort();
  50. }
  51. lua_State *L = LUA_STATE(mod);
  52. lua_getfield(L, 2, "callback");
  53. if(lua_type(L, -1) != LUA_TFUNCTION)
  54. {
  55. log_error(LOG_MSG("option \"callback\" must be a function"));
  56. abort();
  57. }
  58. luaL_checktype(L, -1, LUA_TFUNCTION);
  59. mod->idx_cb = luaL_ref(L, LUA_REGISTRYINDEX);
  60. }
  61. static void module_initialize(module_data_t *mod)
  62. {
  63. module_configure(mod);
  64. lua_State *L = LUA_STATE(mod);
  65. lua_pushvalue(L, -1);
  66. mod->idx_self = luaL_ref(L, LUA_REGISTRYINDEX);
  67. mod->timer = timer_attach(mod->config.interval * 1000
  68. , timer_callback, mod);
  69. }
  70. static void module_destroy(module_data_t *mod)
  71. {
  72. method_close(mod);
  73. }
  74. MODULE_METHODS()
  75. {
  76. METHOD(close)
  77. };
  78. MODULE(timer)