lwp_internal.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-07-25 Shell first version
  9. */
  10. #ifndef __LWP_INTERNAL_H__
  11. #define __LWP_INTERNAL_H__
  12. #include <rtthread.h>
  13. #include "lwp.h"
  14. #include "libc_musl.h"
  15. struct rt_lwp;
  16. rt_err_t lwp_mutex_take_safe(rt_mutex_t mtx, rt_int32_t timeout, rt_bool_t interruptable);
  17. rt_err_t lwp_mutex_release_safe(rt_mutex_t mtx);
  18. #ifdef RT_USING_SMP
  19. #define LOCAL_IRQ_MASK() rt_hw_local_irq_disable()
  20. #define LOCAL_IRQ_UNMASK(level) rt_hw_local_irq_enable(level)
  21. #else
  22. #define LOCAL_IRQ_MASK() rt_hw_interrupt_disable()
  23. #define LOCAL_IRQ_UNMASK(level) rt_hw_interrupt_enable(level)
  24. #endif
  25. #ifndef LWP_USING_CPUS_LOCK
  26. rt_err_t lwp_critical_enter(struct rt_lwp *lwp);
  27. rt_err_t lwp_critical_exit(struct rt_lwp *lwp);
  28. #define LWP_LOCK(lwp) \
  29. do { \
  30. RT_DEBUG_SCHEDULER_AVAILABLE(1); \
  31. if (lwp_critical_enter(lwp) != RT_EOK) \
  32. { \
  33. RT_ASSERT(0); \
  34. } \
  35. } while (0)
  36. #define LWP_UNLOCK(lwp) \
  37. do { \
  38. if (lwp_critical_exit(lwp) != RT_EOK) \
  39. { \
  40. RT_ASSERT(0); \
  41. } \
  42. } while (0)
  43. #else
  44. #define LWP_LOCK(lwp) rt_base_t level = rt_hw_interrupt_disable()
  45. #define LWP_UNLOCK(lwp) rt_hw_interrupt_enable(level)
  46. #endif /* LWP_USING_CPUS_LOCK */
  47. /* cpus lock */
  48. #ifdef LWP_OVERRIDE_CPUS_LOCK
  49. #undef rt_hw_interrupt_disable
  50. #undef rt_hw_interrupt_enable
  51. #define rt_hw_interrupt_disable() ({ \
  52. rt_base_t irq = rt_hw_interrupt_is_disabled(); \
  53. if (irq) \
  54. { \
  55. LOG_W("Nested interrupt disable"); \
  56. rt_backtrace(); \
  57. irq = 0xabadcafe; \
  58. } else { \
  59. irq = rt_cpus_lock(); \
  60. } \
  61. irq; \
  62. })
  63. #define rt_hw_interrupt_enable(level) do { \
  64. if (level != 0xabadcafe) \
  65. rt_cpus_unlock(level); \
  66. } while (0)
  67. #endif /* LWP_OVERRIDE_CPUS_LOCK */
  68. /**
  69. * @brief Return code with safety check
  70. * There tend to be chances where a return value is returned without correctly init
  71. */
  72. #ifndef LWP_DEBUG
  73. #define DEF_RETURN_CODE(name) rt_err_t name
  74. #define RETURN(name) return name
  75. #else
  76. #define UNINITIALIZED 0xbeefcafe
  77. #define DEF_RETURN_CODE(name) rt_err_t name = UNINITIALIZED
  78. #define RETURN(name) {RT_ASSERT(name != UNINITIALIZED);return name;}
  79. #endif /* LWP_DEBUG */
  80. #endif /* __LWP_INTERNAL_H__ */