lwp_internal.h 3.1 KB

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