blob: b12ec043bd13fcbff3023be1511e7c183f4c2584 [file] [log] [blame]
/* --COPYRIGHT--,ESD
* Copyright (c) 2008 Texas Instruments. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License
* v. 1.0 which accompanies this distribution. The Eclipse Public License is
* available at http://www.eclipse.org/legal/epl-v10.html and the Eclipse
* Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Texas Instruments - initial implementation
* --/COPYRIGHT--*/
/*
* ======== ISync.xdc ========
*/
import xdc.runtime.Error;
/*!
* ======== ISync ========
* OS independent synchronization
*
* This interface allows clients to select method of synchronization in an OS
* independent way.
*
* Modules that require the user to pick a synchronization method, will
* request a `{@link #Handle}`. Clients of such modules can pick a blocking
* `ISync` implementation or a non-blocking implementation.
*
* This interface specifies two main functions `{@link #signal}` and
* `{@link #wait}`. These two functions are always used in pairs in modules
* that use `ISync` instances. The `signal()` function is used to signal
* completion of an activity. The `wait()` function will allow the module to
* block or poll for completion of the same activity.
*
* `ISync` mandates that the sync mechanism be binary and not support counters.
* Although the `wait()` function seems meaningless in the case of
* non-blocking sync, it allows modules to be written generically and support
* all `ISync` implementations. For non-blocking `ISync` the `wait()` function
* will return `WaitStatus_TIMEOUT` to denote timeout.
*/
@DirectCall
interface ISync
{
/*!
* ======== WaitStatus ========
* Error codes returned by ISync_wait
*/
enum WaitStatus {
WaitStatus_ERROR = -1,
WaitStatus_TIMEOUT = 0,
WaitStatus_SUCCESS = 1
};
/*!
* ======== Q_BLOCKING ========
* Blocking quality
*
* Implementations with this "quality" may cause the calling thread to
* block;
*/
const Int Q_BLOCKING = 1;
/*! Used to wait forever */
const UInt WAIT_FOREVER = ~(0);
/*! Used to specify no waiting */
const UInt NO_WAIT = 0;
instance:
/*!
* ======== create ========
* Create an ISync instance.
*/
create();
/*!
* ======== query ========
* Query for a particular quality.
*
* FALSE is returned if quality not supported.
*
* @param(qual) quality
* @b(returns) TRUE or FALSE.
*/
Bool query(Int qual);
/*!
* ======== signal ========
* Called at completion of an activity.
*
* This function is non-blocking. It is also required that the underlying
* sync be binary in nature.
*
* This function does not take an Error.Block intentionally because
* it can be called from ISR context.
*/
Void signal();
/*!
* ======== wait ========
* Called to wait/poll for completion of an activity.
*
* This function can block. Non-blocking implementations should return
* WaitStatus_TIMEOUT to indicate a timeout.
*
* @p(blist)
* -{@link #WaitStatus_ERROR} if an error occured.
* -{@link #WaitStatus_TIMEOUT} denotes timeout.
* -{@link #WaitStatus_SUCCESS} semaphore was decremented.
* @p
*
* @param(timeout) Timeout in microseconds
* @param(eb)Hist Pointer to Error.Block
* @b(returns) Refer to description above
*/
Int wait(UInt timeout, Error.Block *eb);
}