mirror of
https://github.com/eclipse-threadx/threadx.git
synced 2026-10-06 06:59:08 +08:00
cortex_m / Cortex M0 build (push) Canceled after 0s
cortex_m / Cortex M3 build (push) Canceled after 0s
cortex_m / Cortex M4 build (push) Canceled after 0s
cortex_m / Cortex M7 build (push) Canceled after 0s
gcc_check / gnu (push) Canceled after 0s
r52_fvp / r52 (push) Canceled after 0s
regression_test / tx (push) Canceled after 0s
regression_test / smp (push) Canceled after 0s
regression_test / freertos (push) Canceled after 0s
regression_test / riscv (push) Canceled after 0s
regression_test / deploy (push) Canceled after 0s
regression_template / run_tests (push) Canceled after 0s
regression_template / deploy_code_coverage (push) Canceled after 0s
The per-edit disclosure named the product and model, so every agent and every
model version appended another line. 74 files carried two to four of them, and
the same five products had accumulated 13 spellings -- Copilot against GitHub
Copilot, Claude Sonnet 4.6 against claude-sonnet-4.6, four spellings of Codex.
Twenty assembly lines carried a doubled comment marker, `; //` or `@ //`.
Every file now carries exactly one line, fixed text naming no product:
Portions of this file were generated with AI assistance.
It is written with the comment character that file already uses, so the `;`
and `@` assembly files keep theirs and the doubled markers are gone. Precise
attribution stays on the commit, where the Assisted-by trailer is per-change,
dated and attached to the diff it describes. A header line cannot hold that
record honestly, because the code it names gets rewritten and the line stays.
A file-level flag answers whether; the history answers who.
Comment-only. 455 files, 455 insertions and 574 deletions: every removed line
was a disclosure line, every added line is the fixed text, and no file is left
with zero or with more than one. `scripts/check_ports.sh` passes, including the
reproducibility check that would catch a ports_arch master and its generated
copies drifting apart. Recompiled against dev, every file that builds without a
vendor toolchain gives a byte-identical object: 19 of 19 C files under common,
100 of 100 GNU assembly files, and all 16 assemblable files whose comment
marker changed. The 10 remaining marker changes are ac5 and IAR sources where
`;` already started the comment and only the redundant `//` was removed.
Assisted-by: Claude Code (Opus 5) <noreply@anthropic.com>
197 lines
7.2 KiB
C
197 lines
7.2 KiB
C
/***************************************************************************
|
|
* Copyright (c) 2024 Microsoft Corporation
|
|
* Copyright (c) 2026-present Eclipse ThreadX contributors
|
|
*
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the MIT License which is available at
|
|
* https://opensource.org/licenses/MIT.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
**************************************************************************/
|
|
|
|
// Portions of this file were generated with AI assistance.
|
|
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
/** */
|
|
/** ThreadX Component */
|
|
/** */
|
|
/** Thread */
|
|
/** */
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
|
|
#define TX_SOURCE_CODE
|
|
|
|
|
|
/* Include necessary system files. */
|
|
|
|
#include "tx_api.h"
|
|
#include "tx_trace.h"
|
|
#include "tx_thread.h"
|
|
#include "tx_timer.h"
|
|
|
|
/**************************************************************************/
|
|
/* */
|
|
/* FUNCTION RELEASE */
|
|
/* */
|
|
/* _tx_thread_sleep PORTABLE C */
|
|
/* 6.1 */
|
|
/* AUTHOR */
|
|
/* */
|
|
/* William E. Lamie, Microsoft Corporation */
|
|
/* */
|
|
/* DESCRIPTION */
|
|
/* */
|
|
/* This function handles application thread sleep requests. If the */
|
|
/* sleep request was called from a non-thread, an error is returned. */
|
|
/* */
|
|
/* INPUT */
|
|
/* */
|
|
/* timer_ticks Number of timer ticks to sleep*/
|
|
/* */
|
|
/* OUTPUT */
|
|
/* */
|
|
/* status Return completion status */
|
|
/* */
|
|
/* CALLS */
|
|
/* */
|
|
/* _tx_thread_system_suspend Actual thread suspension */
|
|
/* _tx_thread_system_ni_suspend Non-interruptable suspend thread */
|
|
/* */
|
|
/* CALLED BY */
|
|
/* */
|
|
/* Application code */
|
|
/* */
|
|
/**************************************************************************/
|
|
UINT _tx_thread_sleep(ULONG timer_ticks)
|
|
{
|
|
|
|
TX_INTERRUPT_SAVE_AREA
|
|
|
|
UINT status;
|
|
TX_THREAD *thread_ptr;
|
|
|
|
|
|
/* Lockout interrupts while the thread is being resumed. */
|
|
TX_DISABLE
|
|
|
|
/* Pickup thread pointer. */
|
|
TX_THREAD_GET_CURRENT(thread_ptr)
|
|
|
|
/* Determine if this is a legal request. */
|
|
|
|
/* Is there a current thread? */
|
|
if (thread_ptr == TX_NULL)
|
|
{
|
|
|
|
/* Restore interrupts. */
|
|
TX_RESTORE
|
|
|
|
/* Illegal caller of this service. */
|
|
status = TX_CALLER_ERROR;
|
|
}
|
|
|
|
/* Is the caller an ISR or Initialization? */
|
|
else if (TX_THREAD_GET_SYSTEM_STATE() != ((ULONG) 0))
|
|
{
|
|
|
|
/* Restore interrupts. */
|
|
TX_RESTORE
|
|
|
|
/* Illegal caller of this service. */
|
|
status = TX_CALLER_ERROR;
|
|
}
|
|
|
|
#ifndef TX_TIMER_PROCESS_IN_ISR
|
|
|
|
/* Is the caller the system timer thread? */
|
|
else if (thread_ptr == &_tx_timer_thread)
|
|
{
|
|
|
|
/* Restore interrupts. */
|
|
TX_RESTORE
|
|
|
|
/* Illegal caller of this service. */
|
|
status = TX_CALLER_ERROR;
|
|
}
|
|
#endif
|
|
|
|
/* Determine if the requested number of ticks is zero. */
|
|
else if (timer_ticks == ((ULONG) 0))
|
|
{
|
|
|
|
/* Restore interrupts. */
|
|
TX_RESTORE
|
|
|
|
/* Just return with a successful status. */
|
|
status = TX_SUCCESS;
|
|
}
|
|
else
|
|
{
|
|
|
|
/* Determine if the preempt disable flag is non-zero. */
|
|
if (_tx_thread_preempt_disable != ((UINT) 0))
|
|
{
|
|
|
|
/* Restore interrupts. */
|
|
TX_RESTORE
|
|
|
|
/* Suspension is not allowed if the preempt disable flag is non-zero at this point - return error completion. */
|
|
status = TX_CALLER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
|
|
/* If trace is enabled, insert this event into the trace buffer. */
|
|
TX_TRACE_IN_LINE_INSERT(TX_TRACE_THREAD_SLEEP, TX_ULONG_TO_POINTER_CONVERT(timer_ticks), thread_ptr -> tx_thread_state, TX_POINTER_TO_ULONG_CONVERT(&status), 0, TX_TRACE_THREAD_EVENTS)
|
|
|
|
/* Log this kernel call. */
|
|
TX_EL_THREAD_SLEEP_INSERT
|
|
|
|
/* Suspend the current thread. */
|
|
|
|
/* Set the state to suspended. */
|
|
thread_ptr -> tx_thread_state = TX_SLEEP;
|
|
|
|
#ifdef TX_NOT_INTERRUPTABLE
|
|
|
|
/* Initialize the status to successful. */
|
|
thread_ptr -> tx_thread_suspend_status = TX_SUCCESS;
|
|
|
|
/* Call actual non-interruptable thread suspension routine. */
|
|
_tx_thread_system_ni_suspend(thread_ptr, timer_ticks);
|
|
|
|
/* Restore interrupts. */
|
|
TX_RESTORE
|
|
#else
|
|
|
|
/* Set the suspending flag. */
|
|
thread_ptr -> tx_thread_suspending = TX_TRUE;
|
|
|
|
/* Initialize the status to successful. */
|
|
thread_ptr -> tx_thread_suspend_status = TX_SUCCESS;
|
|
|
|
/* Setup the timeout period. */
|
|
thread_ptr -> tx_thread_timer.tx_timer_internal_remaining_ticks = timer_ticks;
|
|
|
|
/* Temporarily disable preemption. */
|
|
_tx_thread_preempt_disable++;
|
|
|
|
/* Restore interrupts. */
|
|
TX_RESTORE
|
|
|
|
/* Call actual thread suspension routine. */
|
|
_tx_thread_system_suspend(thread_ptr);
|
|
#endif
|
|
|
|
/* Return status to the caller. */
|
|
status = thread_ptr -> tx_thread_suspend_status;
|
|
}
|
|
}
|
|
|
|
/* Return completion status. */
|
|
return(status);
|
|
}
|
|
|