blob: d950bd8586eb214c53a76003650963c5459ba5f6 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2000-2019 Ericsson Telecom AB //
// //
// All rights reserved. This program and the accompanying materials //
// are made available under the terms of the Eclipse Public License v2.0 //
// which accompanies this distribution, and is available at //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// Module: EPTF_CLL_FBQ_Functions
//
// Purpose:
// This module supports Free-Busy queue management functions
//
// Module Parameters:
// -
//
// Module depends on:
// <EPTF_CLL_Base_Functions>
// <EPTF_CLL_Common_Definitions>
// <EPTF_CLL_Common_Functions>
// <EPTF_CLL_NQueue_Functions>
// <EPTF_CLL_FBQ_Definitions>
//
// Current Owner:
// Jozsef Gyurusi (ETHJGI)
//
// Last Review Date:
// 2012-02-16
//
// Detailed Comments:
// FBQ is now based on the NQueue feature. The FBQ consists of two main chains
// (free and busy) plus an invalid chain. These chains are chains of an NQueue.
// The Free-Busy queue API is just an interface over NQueue to manage only the
// free-busy queue. It is compatible with the previous implementation but
// the following should be taken care of when adapting to this new implementation:
//
// To adapt the previous code to this new implementation the
// following changes has to be made:
// 1) The user component should be extended by <EPTF_FBQ_CT>
// 2) The <f_EPTF_FBQ_init_CT> function has to be called in the user init function
// before other FBQ functions are called
// 3) Initialize the Free-Busy queue data stucture (of type <EPTF_FreeBusyQueue>)
// with the function <f_EPTF_FBQ_initFreeBusyQueue>.
// Do not use the constant <c_EPTF_emptyFreeBusyQueue> only to initialize the queue!
//
// Other typical mistakes that should be corrected:
// API functions has to be used instead of accessing the data elements directly.
// For example:
// pl_queue.status.busyStatus.number -> f_EPTF_FBQ_getLengthOfBusyChain(pl_queue)
// sizeof(pl_queue.itemList) -> f_EPTF_FBQ_getLengthOfQueue(pl_queue)
//
// Public functions:
// <f_EPTF_FBQ_init_CT>
// <f_EPTF_FBQ_initFreeBusyQueue>
// <f_EPTF_FBQ_deleteFreeBusyQueue>
// <f_EPTF_FBQ_setQueueDidx>
// <f_EPTF_FBQ_getQueueDidx>
// <f_EPTF_FBQ_setQueueData>
// <f_EPTF_FBQ_getQueueData>
// <f_EPTF_FBQ_getOrCreateFreeSlot>
// <f_EPTF_FBQ_createFreeSlots>
// <f_EPTF_FBQ_moveFromFreeHeadToBusy>
// <f_EPTF_FBQ_moveFromFreeHeadToBusyTail>
// <f_EPTF_FBQ_moveFromFreeToBusyTail>
// <f_EPTF_FBQ_moveFromBusyToFreeHead>
// <f_EPTF_FBQ_moveFromBusyToFreeTail>
// <f_EPTF_FBQ_moveFromBusyToInvalid>
// <f_EPTF_FBQ_moveFromInvalidToFreeHead>
// <f_EPTF_FBQ_moveFromInvalidToFreeTail>
// <f_EPTF_FBQ_moveFromInvalidToBusyHead>
// <f_EPTF_FBQ_moveFromInvalidToBusyTail>
// <f_EPTF_FBQ_logChain>
// <f_EPTF_FBQ_itemIsBusy>
// <f_EPTF_FBQ_itemIsInvalid>
// <f_EPTF_FBQ_itemIsFree>
// <f_EPTF_FBQ_getBusyHeadIdx>
// <f_EPTF_FBQ_getBusyTailIdx>
// <f_EPTF_FBQ_getFwdBusyItemIdx>
// <f_EPTF_FBQ_getBwdBusyItemIdx>
// <f_EPTF_FBQ_getFreeHeadIdx>
// <f_EPTF_FBQ_getFreeTailIdx>
// <f_EPTF_FBQ_getFwdFreeItemIdx>
// <f_EPTF_FBQ_getBwdFreeItemIdx>
// <f_EPTF_FBQ_getLengthOfBusyChain>
// <f_EPTF_FBQ_getLengthOfFreeChain>
// <f_EPTF_FBQ_getFreeSlot>
// <f_EPTF_FBQ_getLengthOfQueue>
//
///////////////////////////////////////////////////////////
module EPTF_CLL_FBQ_Functions {
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_Common_Functions all;
import from EPTF_CLL_NQueue_Functions all;
import from EPTF_CLL_FBQ_Definitions all;
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_init_CT
//
// Purpose:
// Initializes the FBQ feature
//
// Parameters:
// pl_selfName - *in* *charstring* - the name of the component
//
// Return Value:
// -
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_init_CT(in charstring pl_selfName) runs on EPTF_FBQ_CT
{
if (v_FBQ_initialized) {
return;
}
f_EPTF_NQueue_init_CT(pl_selfName);
f_EPTF_Base_registerCleanup(refers(f_EPTF_FBQ_cleanup_CT));
v_FBQ_dataList := {};
v_FBQ_initialized := true;
}
private function f_EPTF_FBQ_cleanup_CT() runs on EPTF_FBQ_CT {
if (not v_FBQ_initialized) {
return;
}
v_FBQ_dataList := {};
v_FBQ_initialized := false;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_initFreeBusyQueue
//
// Purpose:
// Function to init the EPTF_FreeBusyQueue to empty.
//
// Parameters:
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue to be initialized
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_initFreeBusyQueue(inout EPTF_FreeBusyQueue pl_queue)
{
pl_queue := f_EPTF_NQueue_createQueue();
f_EPTF_NQueue_createChain(pl_queue); // free chain
f_EPTF_NQueue_createChain(pl_queue); // busy chain
f_EPTF_NQueue_createChain(pl_queue); // invalid chain
// v_FBQ_dataList[pl_queue] := {} // will be initialized on demand
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_initFreeBusyQueue
//
// Purpose:
// Function to delete the EPTF_FreeBusyQueue.
//
// Parameters:
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue to be deleted
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_deleteFreeBusyQueue(inout EPTF_FreeBusyQueue pl_queue) runs on EPTF_FBQ_CT
{
f_EPTF_NQueue_deleteQueue(pl_queue);
v_FBQ_dataList[pl_queue] := {}; // clear the associated data
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_setQueueDidx
//
// Purpose:
// Function to set the data indices of the <EPTF_FreeBusyQueue>
//
// Parameters:
// pl_i - *in* *integer* - the index of queue item
//
// pl_j - *in* <EPTF_IndexList> - the indices to the event data
//
// pl_queue - *inout* <EPTF_FreeBusyQueue>
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_setQueueDidx(
in integer pl_i,
in EPTF_IndexList pl_j,
inout EPTF_FreeBusyQueue pl_queue) runs on EPTF_FBQ_CT
{
v_FBQ_dataList[pl_queue][pl_i] := pl_j;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getQueueDidx
//
// Purpose:
// Function to get user data indices associated with a given slot
// of a <EPTF_FreeBusyQueue>
//
// Parameters:
// pl_idx - *in* *integer* - the index of queue item
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// pl_didx - *out* <EPTF_IndexList> - the indices at position [idx] to be returned
//
// Return Value:
// (none)
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getQueueDidx(
in integer pl_idx,
in EPTF_FreeBusyQueue pl_queue,
out EPTF_IndexList pl_didx) runs on EPTF_FBQ_CT
{
if( not isbound(v_FBQ_dataList[pl_queue])
or sizeof(v_FBQ_dataList[pl_queue]) <= pl_idx
or not isbound(v_FBQ_dataList[pl_queue][pl_idx])) {
pl_didx := {}
} else {
pl_didx := v_FBQ_dataList[pl_queue][pl_idx];
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_setQueueData
//
// Purpose:
// Function to set the a single data elem for an item in a queue.
//
// Parameters:
// pl_itemIdx - *in* *integer* - the index of queue item
// pl_queue - *inout* <EPTF_FreeBusyQueue>
// pl_dataIdx - *in* *integer* - the index of data within the item's data list
// pl_data - *in* *integer* - the new data value
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_setQueueData(
in integer pl_itemIdx,
inout EPTF_FreeBusyQueue pl_queue,
in integer pl_dataIdx,
in integer pl_data) runs on EPTF_FBQ_CT
{
v_FBQ_dataList[pl_queue][pl_itemIdx][pl_dataIdx] := pl_data;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getQueueData
//
// Purpose:
// Function to get the a single data elem from an item in a queue.
//
// Parameters:
// pl_itemIdx - *in* *integer* - the index of queue item
// pl_queue - *inout* <EPTF_FreeBusyQueue>
// pl_dataIdx - *in* *integer* - the index of data within the item's data list
//
// Return Value:
// *integer* - the data value
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getQueueData(
in integer pl_itemIdx,
in EPTF_FreeBusyQueue pl_queue,
in integer pl_dataIdx) runs on EPTF_FBQ_CT
return integer
{
if(c_EPTF_Common_debugSwitch) {
if( not isbound(v_FBQ_dataList[pl_queue])
or sizeof(v_FBQ_dataList[pl_queue]) <= pl_itemIdx
or not isbound(v_FBQ_dataList[pl_queue][pl_itemIdx])
or sizeof(v_FBQ_dataList[pl_queue][pl_itemIdx]) <= pl_dataIdx
or not isbound(v_FBQ_dataList[pl_queue][pl_itemIdx][pl_dataIdx])) {
var integer vl_numElements := 0;
if (isbound(v_FBQ_dataList[pl_queue])) {
vl_numElements := sizeof(v_FBQ_dataList[pl_queue]);
}
f_EPTF_Common_warning(%definitionId&": invalid item ("&
int2str(pl_itemIdx)&") or data("&int2str(pl_dataIdx)&
") index. Items: "&int2str(vl_numElements));
}
}
return v_FBQ_dataList[pl_queue][pl_itemIdx][pl_dataIdx];
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getOrCreateFreeSlot
//
// Purpose:
// Function to get the head of the free_chain of the <EPTF_FreeBusyQueue>,
// it allocates a new slot for the the head, if necessary.
//
// Parameters:
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// *integer* - the index of the head of the unused (free_chain) slot
//
// Detailed Comments:
// If there is no such item then it allocates on-the-fly, then
// returns the index of the item. It allways return the *head of the
// free chain*.
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getOrCreateFreeSlot(
inout EPTF_FreeBusyQueue pl_queue)
return integer
{
if(f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_free_chain) == 0) {
return f_EPTF_NQueue_createItemAtChainTail(pl_queue, c_EPTF_FBQ_free_chain);
} else {
return f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_free_chain);
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_createFreeSlots
//
// Purpose:
// Function to create more than one new slot items in the free_chain
// of a <EPTF_FreeBusyQueue>
//
// Parameters:
// pl_number - *in* integer - the number of new slots to be created
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue, where the slots to be allocated
//
// Return Value:
// (none)
//
// Detailed Comments:
// The functions allocates "number" number of unused (free_chain) slots in the queue.
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_createFreeSlots(
in integer pl_number,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_createItemsAtChainTail(pl_queue, c_EPTF_FBQ_free_chain, pl_number);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromFreeHeadToBusy
//
// Purpose:
// Function to move the slot at the head of free_chain to somewhere into busy_chain
//
// Parameters:
// pl_idx - *in* *integer* - what to move
//
// pl_location - *in* <EPTF_insertionType> - type of insertion
//
// pl_afteridx - *in* *integer* - the index of the slot that the slot at position
// pl_idx is to be inserted after (vl_i.e., this slot will be before the
// inserted item when the inserion is finished)
//
// pl_beforeidx - *in* *integer* - the index of the slot that the slot at position
// pl_idx is to be inserted before (vl_i.e., this slot will be after the
// inserted item when the inserion is finished)
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromFreeHeadToBusy(
in integer pl_idx, // comes from the old API, has no sense
in EPTF_insertionType pl_location,
in integer pl_afteridx,
in integer pl_beforeidx,
inout EPTF_FreeBusyQueue pl_queue)
{
if(c_EPTF_Common_debugSwitch) {
if(pl_idx != f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_free_chain)) {
f_EPTF_Common_warning(%definitionId&": pl_idx is not the head of chain!");
}
}
// set the pl_idx to the head:
if (not f_EPTF_FBQ_getFreeHeadIdx(pl_idx, pl_queue)) {
// free chain is empty: nothing to do
return;
}
if (pl_location==empty) {
f_EPTF_NQueue_moveToHead(pl_queue, c_EPTF_FBQ_busy_chain, pl_idx);
} else if (pl_location==tail) {
if(c_EPTF_Common_debugSwitch) {
if(pl_afteridx != f_EPTF_NQueue_getTailOfChain(pl_queue, c_EPTF_FBQ_busy_chain)) {
f_EPTF_Common_warning(%definitionId&": the pl_afteridx does not points to the tail!");
}
}
f_EPTF_NQueue_moveToTail(pl_queue, c_EPTF_FBQ_busy_chain, pl_idx)
//f_EPTF_NQueue_moveAfter(pl_queue, vl_tailIdx, pl_idx);
} else if (pl_location == head) {
if(c_EPTF_Common_debugSwitch) {
if(pl_beforeidx != f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_busy_chain)) {
f_EPTF_Common_warning(%definitionId&": the pl_beforeidx does not points to the head!");
}
}
f_EPTF_NQueue_moveToHead(pl_queue, c_EPTF_FBQ_busy_chain, pl_idx);
} else if (pl_location == middle) {
if(c_EPTF_Common_debugSwitch) {
var integer vl_tmp := pl_afteridx;
if(f_EPTF_NQueue_getNextItemIdx(pl_queue, vl_tmp)) {
if(vl_tmp != pl_beforeidx) {
f_EPTF_Common_warning(%definitionId&": the item after pl_afteridx is not pl_beforeidx!");
}
}
}
f_EPTF_NQueue_moveAfter(pl_queue, pl_afteridx, pl_idx);
}
}
// this does not use the pl_location parameter, and because of this it behaves slightly differently than the original function:
// public function f_EPTF_FBQ_moveFromFreeHeadToBusy(
// in integer pl_idx, // comes from the old API, has no sense
// in EPTF_insertionType pl_location,
// in integer pl_afteridx,
// in integer pl_beforeidx,
// inout EPTF_FreeBusyQueue pl_queue)
// {
// if(c_EPTF_Common_debugSwitch) {
// if(pl_idx != f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_free_chain)) {
// f_EPTF_Common_warning(%definitionId&": pl_idx is not the head of chain!");
// }
// }
// if (not f_EPTF_FBQ_getFreeHeadIdx(pl_idx, pl_queue)) {
// // free chain is empty: nothing to do
// return;
// }
// if(pl_beforeidx == f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_busy_chain)) {
// f_EPTF_NQueue_moveToHead(pl_queue, c_EPTF_FBQ_busy_chain, pl_idx);
// } else {
// if(c_EPTF_Common_debugSwitch) {
// var integer vl_tmp := pl_afteridx;
// if(f_EPTF_NQueue_getNextItemIdx(pl_queue, vl_tmp)) {
// if(vl_tmp != pl_beforeidx and pl_afteridx != f_EPTF_NQueue_getTailOfChain(pl_queue, c_EPTF_FBQ_busy_chain)) {
// f_EPTF_Common_warning(%definitionId&": the item after pl_afteridx is not pl_beforeidx!");
// }
// }
// }
// f_EPTF_NQueue_moveAfter(pl_queue, pl_afteridx, pl_idx);
// }
// }
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromFreeHeadToBusyTail
//
// Purpose:
// Function to simply move an a slot from the head of the free_chain to
// the tail of the busy_chain
//
// Parameters:
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromFreeHeadToBusyTail(
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToTail(
pl_queue,
c_EPTF_FBQ_busy_chain,
f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_free_chain));
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromFreeToBusyTail
//
// Purpose:
// Function to move a slot from the free_chain to the tail of busy_chain
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Detailed Description:
// This function can be used for a
// FIFO reuse policy of the slots. (The least recently used busy_chain slot
// will be reused first, which makes a round-robin reuse scheme).
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromFreeToBusyTail(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToTail(
pl_queue,
c_EPTF_FBQ_busy_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromBusyToFreeHead
//
// Purpose:
// Function to move an item from the busy_chain to the head of the free_chain
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Deatiled Description:
// This function (and the function <f_EPTF_FBQ_moveFromInvalidToFreeHead>) can be used for a
// LIFO reuse policy of the slots. (The most recently used free_chain slot will be
// reused first.)
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromBusyToFreeHead(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToHead(
pl_queue,
c_EPTF_FBQ_free_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromBusyToFreeTail
//
// Purpose:
// Function to move a slot from the busy_chain to the tail of free_chain
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Detailed Description:
// This function can be used for a
// FIFO reuse policy of the slots. (The least recently used free_chain slot
// will be reused first, which makes a round-robin reuse scheme).
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromBusyToFreeTail(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToTail(
pl_queue,
c_EPTF_FBQ_free_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromBusyToInvalid
//
// Purpose:
// Function to move a slot from busy_chain to invalid_chain.
// Might be useful if the item shall be "unchained" for whatever
// reason, such as during the event handling
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Detailed Comments:
// It effectively renders the item "invisible"
// for functions moving items between free/busy_chains
// in atomic steps,
// this is useful during the processing of an event, see
// <f_EPTF_FBQ_moveFromInvalidToFreeHead>
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromBusyToInvalid(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToTail(
pl_queue,
c_EPTF_FBQ_invalid_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromInvalidToFreeHead
//
// Purpose:
// Function to move a slot from invalid to free_chain head
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Detailed Comments:
// This function (and the function <f_moveBusyToFreeHead>) can be used for a
// LIFO reuse policy of the slots. (The most recently used free_chain slot will be
// reused first.)
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromInvalidToFreeHead(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToHead(
pl_queue,
c_EPTF_FBQ_free_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromInvalidToFreeTail
//
// Purpose:
// Function to move a slot from invalid to free_chain tail
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Detailed Comments:
// This function can be used for a
// FIFO reuse policy of the slots. (The least recently used free_chain slot
// will be reused first, which makes a round-robin reuse scheme).
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromInvalidToFreeTail(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToTail(
pl_queue,
c_EPTF_FBQ_free_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromInvalidToBusyHead
//
// Purpose:
// Function to move a slot from invalid to busy_chain head
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Detailed Comments:
// This function can be used for a
// LIFO reuse policy of the slots. (The most recently used busy_chain slot will be
// reused first.)
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromInvalidToBusyHead(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToHead(
pl_queue,
c_EPTF_FBQ_busy_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_moveFromInvalidToBusyTail
//
// Purpose:
// Function to move a slot from invalid to busy_chain tail
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be moved
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
// Detailed Comments:
// This function can be used for a
// FIFO reuse policy of the slots. (The least recently used busy_chain slot
// will be reused first, which makes a round-robin reuse scheme).
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_moveFromInvalidToBusyTail(
in integer pl_idx,
inout EPTF_FreeBusyQueue pl_queue)
{
f_EPTF_NQueue_moveToTail(
pl_queue,
c_EPTF_FBQ_busy_chain,
pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_logChain
//
// Purpose:
// Function to log a chain (for example, during debugging).
//
// Parameters:
// pl_chain - *in* <EPTF_chainType_enum_t> - the type of the chain to be logged
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_logChain(
in EPTF_chainType_enum_t pl_chain,
in EPTF_FreeBusyQueue pl_queue)
{
select(pl_chain) {
case(free_chain) {
f_EPTF_NQueue_logChain(pl_queue, c_EPTF_FBQ_free_chain);
}
case(busy_chain) {
f_EPTF_NQueue_logChain(pl_queue, c_EPTF_FBQ_busy_chain);
}
case else {
f_EPTF_NQueue_logChain(pl_queue, c_EPTF_FBQ_invalid_chain);
}
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_itemIsBusy
//
// Purpose:
// Function to check whether the item is within the busy_chain, or not.
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be checked
//
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if it is in the busy_chain, false otherwise
//
// Detailed Comments:
// This is trivial convenience function in order to hide
// the internal data structure from the users
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_itemIsBusy(
in integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
return c_EPTF_FBQ_busy_chain == f_EPTF_NQueue_getChainOfItem(pl_queue, pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_itemIsInvalid
//
// Purpose:
// Function to check whether a given slot is within the invalid_chain, or not.
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be checked
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if it is in the invalid_chain, false otherwise
//
// Detailed Comments:
// This is trivial convenience function in order to hide
// the internal data structure from the users
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_itemIsInvalid(
in integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
return c_EPTF_FBQ_invalid_chain == f_EPTF_NQueue_getChainOfItem(pl_queue, pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_itemIsFree
//
// Purpose:
// Function to check whether the item is within the free_chain, or not.
//
// Parameters:
// pl_idx - *in* *integer* - the index of the slot to be checked
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if the slot is in the free_chain, false otherwise
//
// Detailed Comments:
// This is trivial convenience function in order to hide
// the internal data structure from the users
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_itemIsFree(
in integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
return c_EPTF_FBQ_free_chain == f_EPTF_NQueue_getChainOfItem(pl_queue, pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getBusyHeadIdx
//
// Purpose:
// Function to get the head index of the busy_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the head idx.
//
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if idx has been set, false if it has not been // set, i.e.,
// it returns true if the busy chain is *not* empty. If the chain // *is*
// empty, then it returns false and pl_idx will retain its previous value
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getBusyHeadIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
if(f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_busy_chain) < 1) { return false; }
pl_idx := f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_busy_chain);
return true;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getBusyTailIdx
//
// Purpose:
// Function to get the tail index of the busy_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the tail idx.
//
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if idx has been set, false if it has not been // set, i.e.,
// it returns true if the busy chain is *not* empty. If the chain // *is*
// empty, then it returns false and pl_idx will retain its previous value
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getBusyTailIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
if(f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_busy_chain) < 1) { return false; }
pl_idx := f_EPTF_NQueue_getTailOfChain(pl_queue, c_EPTF_FBQ_busy_chain);
return true;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getFwdBusyItemIdx
//
// Purpose:
// Function to get the index of the next forward busy_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the forward idx
//
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if idx has been moved forward within the busy_chain,
// false if it has not been moved, or the item was not busy
//
// Detailed Comments:
// This function can be used to iterate forward through the members of the
// busy_chains
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getFwdBusyItemIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
return f_EPTF_NQueue_getNextItemIdx(pl_queue, pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getBwdBusyItemIdx
//
// Purpose:
// Function to get the index of the next backward busy_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the backward idx
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if pl_idx has been moved backward within the busy_chain,
// false if it has not been moved, or the item was not busy
//
// Detailed Comments:
// This function can be used to iterate backward through the members of the
// busy_chains.
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getBwdBusyItemIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
return f_EPTF_NQueue_getPrevItemIdx(pl_queue, pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getFreeHeadIdx
//
// Purpose:
// Function to get the head index of the free_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the head idx.
//
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if idx has been set, false if it has not been // set, i.e.,
// it returns true if the free chain is *not* empty. If the chain // *is*
// empty, then it returns false and pl_idx will retain its previous value
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getFreeHeadIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
if(f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_free_chain) < 1) { return false; }
pl_idx := f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_free_chain);
return true;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getFreeTailIdx
//
// Purpose:
// Function to get the tail index of the free_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the tail idx.
//
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if idx has been set, false if it has not been // set, i.e.,
// it returns true if the free chain is *not* empty. If the chain // *is*
// empty, then it returns false and pl_idx will retain its previous value
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getFreeTailIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
if(f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_free_chain) < 1) { return false; }
pl_idx := f_EPTF_NQueue_getTailOfChain(pl_queue, c_EPTF_FBQ_free_chain);
return true;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getFwdFreeItemIdx
//
// Purpose:
// Function to get the index of the next forward free_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the forward idx
//
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if idx has been moved forward within the free_chain,
// false if it has not been moved, or the item was not free
//
// Detailed Comments:
// This function can be used to iterate forward through the members of the
// free_chains
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getFwdFreeItemIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
return f_EPTF_NQueue_getNextItemIdx(pl_queue, pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getBwdFreeItemIdx
//
// Purpose:
// Function to get the index of the next backward free_chain slot
//
// Parameters:
// pl_idx - *inout* *integer* - the variable to set to the backward idx
//
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// boolean - true if pl_idx has been moved backward within the free_chain,
// false if it has not been moved, or the item was not free
//
// Detailed Comments:
// This function can be used to iterate backward through the members of the
// free_chains.
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getBwdFreeItemIdx(
inout integer pl_idx,
in EPTF_FreeBusyQueue pl_queue)
return boolean
{
return f_EPTF_NQueue_getPrevItemIdx(pl_queue, pl_idx);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getLengthOfBusyChain
//
// Purpose:
// Function to get the length of the busy_chain
//
// Parameters:
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// integer - the length of the busy_chain
//
// Detailed Comments:
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getLengthOfBusyChain(
in EPTF_FreeBusyQueue pl_queue)
return integer
{
return f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_busy_chain);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getLengthOfFreeChain
//
// Purpose:
// Function to get the length of the free_chain
//
// Parameters:
// pl_queue - *inout* <FreeFreeQueue> - the queue in question
//
// Return Value:
// integer - the length of the free_chain
//
// Detailed Comments:
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getLengthOfFreeChain(
in EPTF_FreeBusyQueue pl_queue)
return integer
{
return f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_free_chain);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getFreeSlot
//
// Purpose:
// Function to get the head of the free_chain of the <EPTF_FreeBusyQueue>,
// returns with negative index, if there is no more free slot.
//
// Parameters:
// pl_queue - *inout* <EPTF_FreeBusyQueue> - the queue in question
//
// Return Value:
// *integer* - the index of the head of the unused (free_chain) slot
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getFreeSlot(
in EPTF_FreeBusyQueue pl_queue)
return integer
{
if(f_EPTF_NQueue_getLengthOfChain(pl_queue, c_EPTF_FBQ_free_chain) == 0) {
f_EPTF_Common_user(%definitionId&"(): no more free slot(s)...");
return -1;
} else {
return f_EPTF_NQueue_getHeadOfChain(pl_queue, c_EPTF_FBQ_free_chain);
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_FBQ_getLengthOfQueue
//
// Purpose:
// Returns the length (total number of items) of the queue
//
// Parameters:
// pl_queue - *in* <EPTF_FreeBusyQueue> - the queue
//
// Return Value:
// *integer* - the length of the queue
///////////////////////////////////////////////////////////
public function f_EPTF_FBQ_getLengthOfQueue(in EPTF_FreeBusyQueue pl_queue)
return integer {
return f_EPTF_NQueue_getLengthOfQueue(pl_queue);
}
} // module EPTF_CLL_FBQ_Functions