Files
threadx/common_smp/src/txe_timer_change.c
T
Frédéric Desbiens 3e5a16c95b Allowed tx_timer_change to be called from tx_application_define (#730)
Fixes #224

`_txe_timer_change` returned `TX_CALLER_ERROR` for any call at or above
`TX_INITIALIZE_IN_PROGRESS`, making `tx_timer_change` the only timer service
that could not be called from `tx_application_define` -- while still being
allowed from an ISR.

The check has no technical basis: `_tx_timer_change` only writes the expiration
fields of a timer that is not on an active list, with interrupts disabled.
Removed it from both the `common` and `common_smp` copies of
`txe_timer_change.c`, with the now-unused includes and the `TX_CALLER_ERROR`
line in the header comment. Relaxing an error check is backward compatible.

`testcontrol.c` in both suites now calls `tx_timer_change` at initialization, so
the timer simple test covers it: `ERROR #30` on `dev`, green with the fix.
116/116 SMP, 103/103 non-SMP.

Assisted-by: Copilot (Opus 5) <noreply@github.com>
2026-09-15 16:24:50 -04:00

111 lines
4.9 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
**************************************************************************/
// Some portions generated by Copilot (Opus 5).
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Timer */
/** */
/**************************************************************************/
/**************************************************************************/
#define TX_SOURCE_CODE
/* Include necessary system files. */
#include "tx_api.h"
#include "tx_timer.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _txe_timer_change PORTABLE C */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function checks for errors in the application timer change */
/* function call. */
/* */
/* INPUT */
/* */
/* timer_ptr Pointer to timer control block */
/* initial_ticks Initial expiration ticks */
/* reschedule_ticks Reschedule ticks */
/* */
/* OUTPUT */
/* */
/* TX_TIMER_ERROR Invalid application timer pointer */
/* TX_TICK_ERROR Invalid initial tick value of 0 */
/* status Actual completion status */
/* */
/* CALLS */
/* */
/* _tx_timer_change Actual timer change function */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* */
/**************************************************************************/
UINT _txe_timer_change(TX_TIMER *timer_ptr, ULONG initial_ticks, ULONG reschedule_ticks)
{
UINT status;
/* Check for an invalid timer pointer. */
if (timer_ptr == TX_NULL)
{
/* Timer pointer is invalid, return appropriate error code. */
status = TX_TIMER_ERROR;
}
/* Now check for invalid timer ID. */
else if (timer_ptr -> tx_timer_id != TX_TIMER_ID)
{
/* Timer pointer is invalid, return appropriate error code. */
status = TX_TIMER_ERROR;
}
/* Check for an illegal initial tick value. */
else if (initial_ticks == ((ULONG) 0))
{
/* Invalid initial tick value, return appropriate error code. */
status = TX_TICK_ERROR;
}
else
{
/* Call actual application timer function. */
status = _tx_timer_change(timer_ptr, initial_ticks, reschedule_ticks);
}
/* Return completion status. */
return(status);
}