FreeCalypso > hg > tcs211-l1-reconst
diff g23m/condat/ms/src/bmi/MmiBlkResources.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/condat/ms/src/bmi/MmiBlkResources.c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,324 @@ +/******************************************************************************* + + CONDAT (UK) + +******************************************************************************** + + This software product is the property of Condat (UK) Ltd and may not be + disclosed to any third party without the express permission of the owner. + +******************************************************************************** + + $Project name: Basic MMI + $Project code: BMI (6349) + $Module: PhoneBook + $File: MmiBlkResources.c + $Revision: 1.0 + + $Author: Condat(UK) + $Date: 25/10/00 + +******************************************************************************** + + Description: + + This modules provides, in conjunction with the MmiBlkManager module, + the resource management facilities for the MMI. + +******************************************************************************** + + $History: MmiBlkResources.c + + 25/10/00 Original Condat(UK) BMI version. + + $End + +*******************************************************************************/ + + +/******************************************************************************* + + Include Files + +*******************************************************************************/ + +#define ENTITY_MFW + +/* includes */ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#if defined (NEW_FRAME) + +#include "typedefs.h" +#include "vsi.h" +#include "pei.h" +#include "custom.h" +#include "gsm.h" + +#else + +#include "STDDEFS.H" +#include "custom.h" +#include "gsm.h" +#include "vsi.h" + +#endif +// #include <malloc.h> + +#include "MmiBlkResources.h" + +/******************************************************************************* + + Local Structures + +*******************************************************************************/ + +/* Define the control structures used to implement the block resource + manager +*/ +#define RESOURCE_MANAGER_KEY 0x00BABE02L +#define RESOURCE_SEARCH_LIMIT 4 + +typedef struct _tBlkEntry_ +{ + tBlkId BlkId; + tBlkHandle BlkHandle; +} tBlkEntry, *pBlkEntry; + +typedef struct _tBlkControl_ +{ + long int BlkKey; + tBlkHandle BlkBase; + int BlkLength; + pBlkEntry BlkStartPtr; + tBlkHandle BlkMinAddress; + tBlkHandle BlkMaxAddress; +} tBlkControl, *pBlkControl; + + +/******************************************************************************* + + Private Routines + +*******************************************************************************/ + +/******************************************************************************* + + $Function: ValidBlockResource + + $Description: Verifies that the resource indicated by the handle is a valid + resource. + + $Returns: 0 If invalid, non-zero if valid. + + $Arguments: BlkRsrc, handle of resource + +*******************************************************************************/ + + +static int ValidBlockResource( tBlkHandle BlkRsrc ) +{ + pBlkControl BlkControl = (pBlkControl) BlkRsrc; + + /* Check for non-NULL handle + */ + if ( BlkControl == NULL ) + return 0; + + /* Check key has been set up correctly + */ + return ( BlkControl->BlkKey == RESOURCE_MANAGER_KEY ); +} + + +/******************************************************************************* + + Public Routines + +*******************************************************************************/ + +/******************************************************************************* + + $Function: mmibr_Initialise + + $Description: + + The initialisation routine must be called as part of the startup + phase of the system, it will allocate working space for the block + handler if required, and will initialise any structures required + to maintain the corect operation of the functions. This routine + must be called prior to invocation of any other block resource + function + + $Returns: Handle to a resource block, NULL if unsuccessful + + $Arguments: BlkBase, Base address of the block of data relating + to the resource + NumEntries, number of entries associated with the resource + +*******************************************************************************/ + +tBlkHandle mmibr_Initialise( tBlkHandle BlkBase, int NumEntries ) +{ + pBlkControl Blk; + int i; + + /* As part of the initialisation process, we need to allocate a + block of memory in which to store the control information + associated with this block resource manager + */ + if ( ( Blk = (pBlkControl) ALLOC_MEMORY( sizeof(tBlkControl) ) ) != NULL ) + { + /* Store the things we know straight off + */ + Blk->BlkKey = RESOURCE_MANAGER_KEY; + Blk->BlkBase = BlkBase; + Blk->BlkLength = NumEntries; + Blk->BlkStartPtr = (pBlkEntry) BlkBase; + + /* In order to detect memory allocations, we scan the list + of known entries, storing the maximum and minimum addresses + in the list. This scan allows us to detect when allocated + memory is being returned, since the address will be outside + the contiguous memory block we are managing. + */ + Blk->BlkMinAddress = Blk->BlkMaxAddress = BlkBase; + for ( i = 0; i < NumEntries; i++ ) + { + if ( Blk->BlkMaxAddress < Blk->BlkStartPtr[i].BlkHandle ) + Blk->BlkMaxAddress = Blk->BlkStartPtr[i].BlkHandle; + } + } + + return Blk; +} + +/******************************************************************************* + + $Function: mmibr_ShutDown + + $Description: + + The shutdown function can be called to free any allocations set up + by the Initialise routine. In a running system this is unlikely to + be called unless a catastrophic error has occurred and the system + needs to be restarted. + + $Returns: none. + + $Arguments: Pointer to a block resource handle (ie ptr to ptr) + +*******************************************************************************/ + +void mmibr_ShutDown( tBlkHandle *BlkRsrc ) +{ + /* Only allow the resource manager to be shutdown if the provided + handle is consistent + */ + if ( ValidBlockResource( *BlkRsrc ) ) + { + free( *BlkRsrc ); + *BlkRsrc = NULL; + } +} + +/******************************************************************************* + + $Function: mmibr_Fetch + + $Description: + + We will adopt a mechanism where each block of data being provided + will need to be returned to the block resource manager when it + is no longer being used, this will provide an orthogonal approach + when dealing with data coming from either ROM or dynamically + allocated memory. + + $Returns: pointer to resource, NULL if unsuccessful + + $Arguments: BlkRsrc, resource handle created by mmibr_Initialise + Id, identifier of the resource to be returned + +*******************************************************************************/ + +tBlkHandle mmibr_Fetch( tBlkHandle BlkRsrc, tBlkId Id ) +{ + int Start, End, Search; + tBlkId CurrentId; + tBlkHandle SearchPtr; + + /* convert the handle and verify it's valid + */ + pBlkControl BlkControl = (pBlkControl) BlkRsrc; + if ( ! ValidBlockResource( BlkRsrc ) ) + return NULL; + + /* When locating a specific entry, we need to search the list of + ids for one matching the input value. Since the Ids will be + organised as an ordered list, very important that bit, we can + perform a simple binary search to locate the items. + */ + Start = 0; + End = BlkControl->BlkLength - 1; + SearchPtr = NULL; + do + { + /* grab the entry midway between the current start and end + */ + Search = Start + ((End - Start) >> 1); + CurrentId = BlkControl->BlkStartPtr[Search].BlkId; + + /* Binary chop the search space + */ + if ( CurrentId == Id ) + { + /* Found a match, grab handle and terminate search + */ + SearchPtr = BlkControl->BlkStartPtr[Search].BlkHandle; + Start = End; + } + else if ( CurrentId > Id ) + { + /* Not got a match, but it's not in the top half so move + the End pointer down + */ + End = Search; + } + else + { + /* Not got a match, but it's not in the bottom half so + move the Start pointer up + */ + Start = Search; + } + + /* when we get down to the last three or four entries, just + search linearly to solve it, this is generally quicker for + a small number of entries than continuing the binary chop + */ + if ( ( End - Start ) < RESOURCE_SEARCH_LIMIT ) + { + /* search quickly through the possibles + */ + for ( Search = Start; Search <= End; Search++ ) + if ( Id == BlkControl->BlkStartPtr[Search].BlkId ) + SearchPtr = BlkControl->BlkStartPtr[Search].BlkHandle; + + /* And terminate the binary chop + */ + Start = End; + } + + } while ( Start != End ); + + return SearchPtr; +} + +/******************************************************************************* + + End of File + +*******************************************************************************/ +