yloop.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include "aos/yloop.h"
  6. #include "aos/kernel.h"
  7. #ifdef CONFIG_KERNEL_WORKQUEUE
  8. typedef struct work_para {
  9. aos_work_t *work;
  10. aos_loop_t loop;
  11. aos_call_t action;
  12. void *arg1;
  13. aos_call_t fini_cb;
  14. void *arg2;
  15. } work_par_t;
  16. static void free_wpar(work_par_t *wpar)
  17. {
  18. aos_work_destroy(wpar->work);
  19. aos_free(wpar->work);
  20. aos_free(wpar);
  21. }
  22. static void run_my_work(void *arg)
  23. {
  24. work_par_t *wpar = arg;
  25. wpar->action(wpar->arg1);
  26. if (wpar->fini_cb) {
  27. aos_schedule_call(wpar->fini_cb, wpar->arg2);
  28. }
  29. free_wpar(wpar);
  30. }
  31. void *aos_loop_schedule_work(int ms, aos_call_t action, void *arg1,
  32. aos_call_t fini_cb, void *arg2)
  33. {
  34. int ret;
  35. if (action == NULL) {
  36. return NULL;
  37. }
  38. aos_work_t *work = aos_malloc(sizeof(*work));
  39. work_par_t *wpar = aos_malloc(sizeof(*wpar));
  40. if (!work || !wpar) {
  41. goto err_out;
  42. }
  43. wpar->work = work;
  44. wpar->loop = aos_current_loop();
  45. wpar->action = action;
  46. wpar->arg1 = arg1;
  47. wpar->fini_cb = fini_cb;
  48. wpar->arg2 = arg2;
  49. ret = aos_work_init(work, run_my_work, wpar, ms);
  50. if (ret != 0) {
  51. goto err_out;
  52. }
  53. ret = aos_work_sched(work);
  54. if (ret != 0) {
  55. goto err_out;
  56. }
  57. return wpar;
  58. err_out:
  59. aos_free(work);
  60. aos_free(wpar);
  61. return NULL;
  62. }
  63. void aos_cancel_work(void *w, aos_call_t action, void *arg1)
  64. {
  65. work_par_t *wpar = w;
  66. if (wpar == NULL) {
  67. return;
  68. }
  69. if (wpar->action != action) {
  70. return;
  71. }
  72. if (wpar->arg1 != arg1) {
  73. return;
  74. }
  75. int ret = aos_work_cancel(wpar->work);
  76. if (ret != 0) {
  77. return;
  78. }
  79. free_wpar(wpar);
  80. }
  81. #endif