Skip to content
Open
16 changes: 16 additions & 0 deletions components/libc/cplusplus/os/cxx_Semaphore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,21 @@

using namespace rtthread;

/**
* @brief Semaphore class constructor.
* @param name Semaphore name
* @param count Initial semaphore count
*/
Semaphore::Semaphore(const char *name, int32_t count)
{
rt_sem_init(&mID, name, count, RT_IPC_FLAG_FIFO);
}

/**
* @brief Wait on the semaphore.
* @param millisec Timeout in milliseconds (-1 for infinite wait).
* @return true if the semaphore was successfully taken, false on timeout.
*/
bool Semaphore::wait(int32_t millisec)
{
rt_int32_t tick;
Expand All @@ -28,11 +38,17 @@ bool Semaphore::wait(int32_t millisec)
return rt_sem_take(&mID, tick) == RT_EOK;
}

/**
* @brief Release the semaphore.
*/
Comment on lines +41 to +43
Copy link

Copilot AI Nov 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing Doxygen Tag / 缺少 Doxygen 标签

English: This comment is missing the @brief tag. Add it for consistency with other function documentation.

中文:此注释缺少 @brief 标签。为了与其他函数文档保持一致,请添加它。

Suggested format / 建议格式:

/** 
 * @brief Release the semaphore.
 */

Copilot uses AI. Check for mistakes.
void Semaphore::release(void)
{
rt_sem_release(&mID);
}

/**
* @brief Detach the semaphore when the object is destroyed.
*/
Semaphore::~Semaphore()
{
rt_sem_detach(&mID);
Expand Down
46 changes: 44 additions & 2 deletions components/libc/cplusplus/os/cxx_Thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@

using namespace rtthread;

/**
* @brief Thread class constructor with parameters for stack size, priority, tick, and name.
Copy link

Copilot AI Nov 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Incomplete Doxygen Comment / 不完整的 Doxygen 注释

English: The Doxygen comment should document all parameters and follow complete documentation format. Add @param tags for each parameter to make the documentation complete and useful.

中文:Doxygen 注释应记录所有参数并遵循完整的文档格式。为每个参数添加 @param 标签,使文档完整且有用。

Suggested format / 建议格式:

/** 
 * @brief Thread class constructor with parameters for stack size, priority, tick, and name.
 * @param stack_size Stack size in bytes
 * @param priority Thread priority
 * @param tick Time slice in ticks
 * @param name Thread name
 */
Suggested change
* @brief Thread class constructor with parameters for stack size, priority, tick, and name.
* @brief Thread class constructor with parameters for stack size, priority, tick, and name.
* @param stack_size Stack size in bytes
* @param priority Thread priority
* @param tick Time slice in ticks
* @param name Thread name

Copilot uses AI. Check for mistakes.
* @param stack_size Stack size in bytes
* @param priority Thread priority
* @param tick Time slice in ticks
* @param name Thread name
*/
Thread::Thread(rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick,
Expand All @@ -27,6 +34,15 @@ Thread::Thread(rt_uint32_t stack_size,
tick);
}

/**
* @brief Thread class constructor with entry function and parameters.
Copy link

Copilot AI Nov 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Incomplete Doxygen Comment / 不完整的 Doxygen 注释

English: The Doxygen comment should document all parameters. Add @param tags for entry, p, stack_size, priority, tick, and name parameters.

中文:Doxygen 注释应记录所有参数。为 entry、p、stack_size、priority、tick 和 name 参数添加 @param 标签。

Suggested change
* @brief Thread class constructor with entry function and parameters.
* @brief Thread class constructor with entry function and parameters.
* @param entry The entry function pointer for the thread.
* @param p The parameter to pass to the entry function.
* @param stack_size The size of the thread stack in bytes.
* @param priority The priority of the thread.
* @param tick The time slice (tick) for the thread.
* @param name The name of the thread.

Copilot uses AI. Check for mistakes.
* @param entry The entry function pointer for the thread.
* @param p The parameter to pass to the entry function.
* @param stack_size The size of the thread stack in bytes.
* @param priority The priority of the thread.
* @param tick The time slice (tick) for the thread.
* @param name The name of the thread.
*/
Thread::Thread(void (*entry)(void *p),
void *p,
rt_uint32_t stack_size,
Expand All @@ -45,12 +61,19 @@ Thread::Thread(void (*entry)(void *p),
tick);
}

/**
* @brief Detach the event and delete the thread when the object is destroyed.
*/
Thread::~Thread()
{
rt_event_detach(&_event);
rt_thread_delete(_thread);
}

/**
* @brief Start the thread execution.
* @return true if the thread was successfully started.
*/
bool Thread::start()
{
if (rt_thread_startup(_thread) == RT_EOK)
Expand All @@ -61,6 +84,10 @@ bool Thread::start()
return started;
}

/**
* @brief Make the thread sleep for a specified duration.
* @param millisec Duration in milliseconds.
*/
void Thread::sleep(int32_t millisec)
{
rt_int32_t tick;
Expand All @@ -73,6 +100,9 @@ void Thread::sleep(int32_t millisec)
rt_thread_delay(tick);
}

/**
* @brief Function to run the thread's entry function.
*/
void Thread::func(Thread *pThis)
{
if (pThis->_entry != RT_NULL)
Expand All @@ -87,22 +117,34 @@ void Thread::func(Thread *pThis)
rt_event_send(&pThis->_event, 1);
}

/**
* @brief Default run function that can be overridden by subclasses.
*/
void Thread::run(void *parameter)
{
/* please overload this method */
}

/**
* @brief Wait for the thread to complete with a timeout.
* @param millisec Timeout in milliseconds.
* @return RT_EOK if the thread completed within the timeout, error code otherwise.
*/
rt_err_t Thread::wait(int32_t millisec)
{
return join(millisec);
}

/**
* @brief Join the thread with a timeout.
* @param millisec Timeout in milliseconds.
* @return RT_EOK if the thread completed within the timeout, error code otherwise.
*/
rt_err_t Thread::join(int32_t millisec)
{
if (started)
{
rt_int32_t tick;

if (millisec < 0)
tick = -1;
else
Expand All @@ -114,4 +156,4 @@ rt_err_t Thread::join(int32_t millisec)
{
return -RT_ENOSYS;
}
}
}
49 changes: 31 additions & 18 deletions components/libc/cplusplus/utest/tc_atomic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
*/
static void test_atomic_load_store_int32(void)
{
constexpr int kRound = 10000000;
constexpr int kRound = 10000000;
std::atomic<int32_t> thread_count(0);
std::atomic<int32_t> count(100);
uassert_int_equal(count.load(), 100);
Expand Down Expand Up @@ -56,7 +56,7 @@ static void test_atomic_load_store_int32(void)
*/
static void test_atomic_load_store_int64(void)
{
constexpr int kRound = 10000000;
constexpr int kRound = 10000000;
std::atomic<int64_t> thread_count(0);
std::atomic<int64_t> count(100);
uassert_int_equal(count.load(), 100);
Expand Down Expand Up @@ -112,7 +112,7 @@ static void test_atomic_basic_int32(void)
val.fetch_and(14);
uassert_int_equal(val.load(), 10);

val.fetch_or(11); //1010
val.fetch_or(11); /* 1010 */
uassert_int_equal(val.load(), 11);

val.fetch_xor(4);
Expand All @@ -121,9 +121,9 @@ static void test_atomic_basic_int32(void)
val.exchange(1);
uassert_int_equal(val.load(), 1);

int32_t x = 2;
int32_t y = 3;
bool exchanged = val.compare_exchange_strong(x, y);
int32_t x = 2;
int32_t y = 3;
bool exchanged = val.compare_exchange_strong(x, y);
uassert_false(exchanged);
uassert_int_equal(val.load(), 1);
uassert_int_equal(x, 1);
Expand Down Expand Up @@ -159,7 +159,7 @@ static void test_atomic_basic_int64(void)
val.fetch_and(14);
uassert_int_equal(val.load(), 10);

val.fetch_or(11); //1010
val.fetch_or(11); /* 1010 */
uassert_int_equal(val.load(), 11);

val.fetch_xor(4);
Expand All @@ -168,9 +168,9 @@ static void test_atomic_basic_int64(void)
val.exchange(1);
uassert_int_equal(val.load(), 1);

int64_t x = 2;
int64_t y = 3;
bool exchanged = val.compare_exchange_strong(x, y);
int64_t x = 2;
int64_t y = 3;
bool exchanged = val.compare_exchange_strong(x, y);
uassert_false(exchanged);
uassert_int_equal(val.load(), 1);
uassert_int_equal(x, 1);
Expand All @@ -191,7 +191,7 @@ static void test_atomic_bool(void)
flag.exchange(false);
uassert_false(flag.load());
bool expected = false;
bool desired = true;
bool desired = true;
uassert_true(flag.compare_exchange_strong(expected, desired));
uassert_true(flag.load());
}
Expand All @@ -201,7 +201,7 @@ static void test_atomic_bool(void)
*/
static void test_atomic_pointer(void)
{
int a = 1, b = 2;
int a = 1, b = 2;
std::atomic<int *> ptr(&a);
ptr.store(&b);
uassert_int_equal(*ptr.load(), 2);
Expand All @@ -217,7 +217,7 @@ static void test_memory_order(void)
{
std::atomic<int> x(0);
std::atomic<int> y(0);
// Simple test for memory order
/* Simple test for memory order */
x.store(1, std::memory_order_release);
y.store(2, std::memory_order_release);
uassert_int_equal(x.load(std::memory_order_acquire), 1);
Expand All @@ -230,25 +230,36 @@ static void test_memory_order(void)
static void test_compare_exchange_weak(void)
{
std::atomic<int> val(1);
int expected = 1;
int desired = 2;
int expected = 1;
int desired = 2;
while (!val.compare_exchange_weak(expected, desired))
{
expected = 1; // reset
/* Reset */
expected = 1;
}
uassert_int_equal(val.load(), 2);
}

/**
* @brief Test case initialization function.
* @return RT_EOK on success.
*/
static rt_err_t utest_tc_init(void)
{
return RT_EOK;
}

/**
* @brief Test case cleanup function.
* @return RT_EOK on success.
*/
static rt_err_t utest_tc_cleanup(void)
{
return RT_EOK;
}

/**
* @brief Main test case function that runs the test.
*/
static void testcase(void)
{
/* Test load and store operations for int32_t atomic variables in multi-threaded environment */
Expand All @@ -268,4 +279,6 @@ static void testcase(void)
/* Test compare_exchange_weak operation */
UTEST_UNIT_RUN(test_compare_exchange_weak);
}
UTEST_TC_EXPORT(testcase, "components.libc.cpp.atomic_tc", utest_tc_init, utest_tc_cleanup, 10);

/* Export the test case with initialization and cleanup functions and a timeout of 10 ticks. */
UTEST_TC_EXPORT(testcase, "components.libc.cpp.atomic_tc", utest_tc_init, utest_tc_cleanup, 10);
15 changes: 14 additions & 1 deletion components/libc/cplusplus/utest/tc_smartptr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,34 @@ static void test_shared_ptr(void)
uassert_int_equal(p1.use_count(), 2);
}

/**
* @brief Test case initialization function.
Copy link

Copilot AI Nov 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Incomplete Doxygen Comment / 不完整的 Doxygen 注释

English: The Doxygen comment should document the return value. Add @return RT_EOK on success for completeness.

中文:Doxygen 注释应记录返回值。添加 @return RT_EOK on success 以保持完整性。

Suggested change
* @brief Test case initialization function.
* @brief Test case initialization function.
* @return RT_EOK on success

Copilot uses AI. Check for mistakes.
* @return RT_EOK on success.
*/
static rt_err_t utest_tc_init(void)
{
return RT_EOK;
}

/**
* @brief Test case cleanup function.
* @return RT_EOK on success.
*/
static rt_err_t utest_tc_cleanup(void)
{
return RT_EOK;
}

/**
* @brief Main test case function that runs the test.
*/
static void testcase(void)
{
/* Test unique_ptr basic operations */
UTEST_UNIT_RUN(test_unique_ptr);
/* Test shared_ptr basic operations */
UTEST_UNIT_RUN(test_shared_ptr);
}
UTEST_TC_EXPORT(testcase, "components.libc.cpp.smartptr_tc", utest_tc_init, utest_tc_cleanup, 10);

/* Export the test case with initialization and cleanup functions and a timeout of 10 ticks. */
UTEST_TC_EXPORT(testcase, "components.libc.cpp.smartptr_tc", utest_tc_init, utest_tc_cleanup, 10);
Loading