Home | History | Annotate | Download | only in b_BasicEm
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /* ---- includes ----------------------------------------------------------- */
     18 
     19 #include "b_BasicEm/Functions.h"
     20 #include "b_BasicEm/Context.h"
     21 #include "b_BasicEm/String.h"
     22 
     23 /* ------------------------------------------------------------------------- */
     24 
     25 /* ========================================================================= */
     26 /*                                                                           */
     27 /* ---- \ghd{ auxiliary functions } ---------------------------------------- */
     28 /*                                                                           */
     29 /* ========================================================================= */
     30 
     31 /* ------------------------------------------------------------------------- */
     32 
     33 /* ========================================================================= */
     34 /*                                                                           */
     35 /* ---- \ghd{ constructor / destructor } ----------------------------------- */
     36 /*                                                                           */
     37 /* ========================================================================= */
     38 
     39 /* ------------------------------------------------------------------------- */
     40 
     41 void bbs_Context_init( struct bbs_Context* cpA )
     42 {
     43 	uint32 iL;
     44 	for( iL = 0; iL < bbs_CONTEXT_MAX_ERRORS; iL++ )
     45 	{
     46 		cpA->errStackE[ iL ].errorE = bbs_ERR_OK;
     47 		cpA->errStackE[ iL ].fileE[ 0 ] = 0;
     48 		cpA->errStackE[ iL ].lineE = 0;
     49 		cpA->errStackE[ iL ].textE[ 0 ] = 0;
     50 	}
     51 
     52 	cpA->errIndexE = 0;
     53 
     54 	bbs_MemTbl_init( cpA, &cpA->memTblE );
     55 
     56 	for( iL = 0; iL < bbs_CONTEXT_MAX_MEM_MANAGERS; iL++ )
     57 	{
     58 		bbs_DynMemManager_init( cpA, &cpA->dynMemManagerArrE[ iL ] );
     59 	}
     60 
     61 	cpA->dynMemManagerArrSizeE = 0;
     62 	cpA->errorHandlerE = NULL;
     63 	cpA->callbackHandlerE = NULL;
     64 	cpA->userPtrE = NULL;
     65 }
     66 
     67 /* ------------------------------------------------------------------------- */
     68 
     69 void bbs_Context_exit( struct bbs_Context* cpA )
     70 {
     71 	uint32 iL;
     72 	for( iL = 0; iL < bbs_CONTEXT_MAX_ERRORS; iL++ )
     73 	{
     74 		cpA->errStackE[ iL ].errorE = bbs_ERR_OK;
     75 		cpA->errStackE[ iL ].fileE[ 0 ] = 0;
     76 		cpA->errStackE[ iL ].lineE = 0;
     77 		cpA->errStackE[ iL ].textE[ 0 ] = 0;
     78 	}
     79 
     80 	cpA->errIndexE = 0;
     81 
     82 	bbs_MemTbl_exit( cpA, &cpA->memTblE );
     83 
     84 	for( iL = 0; iL < cpA->dynMemManagerArrSizeE; iL++ )
     85 	{
     86 		bbs_DynMemManager_freeAll( cpA, &cpA->dynMemManagerArrE[ iL ] );
     87 	}
     88 
     89 	for( iL = 0; iL < bbs_CONTEXT_MAX_MEM_MANAGERS; iL++ )
     90 	{
     91 		bbs_DynMemManager_exit( cpA, &cpA->dynMemManagerArrE[ iL ] );
     92 	}
     93 
     94 	cpA->dynMemManagerArrSizeE = 0;
     95 	cpA->errorHandlerE = NULL;
     96 	cpA->callbackHandlerE = NULL;
     97 	cpA->userPtrE = NULL;
     98 }
     99 
    100 /* ------------------------------------------------------------------------- */
    101 
    102 /* ========================================================================= */
    103 /*                                                                           */
    104 /* ---- \ghd{ operators } -------------------------------------------------- */
    105 /*                                                                           */
    106 /* ========================================================================= */
    107 
    108 /* ------------------------------------------------------------------------- */
    109 
    110 void bbs_Context_copy( struct bbs_Context* cpA, const struct bbs_Context* srcPtrA )
    111 {
    112 	bbs_ERROR0( "void bbs_Context_copy( struct bbs_Context* cpA, const struct bbs_Context* srcPtrA ):\n"
    113 		        "A comtext object cannot be copied" );
    114 }
    115 
    116 /* ------------------------------------------------------------------------- */
    117 
    118 /* ========================================================================= */
    119 /*                                                                           */
    120 /* ---- \ghd{ query functions } -------------------------------------------- */
    121 /*                                                                           */
    122 /* ========================================================================= */
    123 
    124 /* ------------------------------------------------------------------------- */
    125 
    126 /* ========================================================================= */
    127 /*                                                                           */
    128 /* ---- \ghd{ modify functions } ------------------------------------------- */
    129 /*                                                                           */
    130 /* ========================================================================= */
    131 
    132 /* ------------------------------------------------------------------------- */
    133 
    134 struct bbs_Error bbs_Error_create( uint32 errorA,
    135 								   uint32 lineA,
    136 								   const char* fileA,
    137 								   const char* textA,
    138 								   ... )
    139 {
    140 	struct bbs_Error errorL;
    141 	errorL.errorE = errorA;
    142 	errorL.lineE = lineA;
    143 
    144 	if( fileA != NULL )
    145 	{
    146 		uint32 lenL = bbs_strlen( fileA );
    147 		uint32 ofsL = ( lenL + 1 > bbs_ERROR_MAX_FILE_CHARS ) ? lenL + 1 - bbs_ERROR_MAX_FILE_CHARS : 0;
    148 		bbs_strcpy( errorL.fileE, fileA + ofsL );
    149 	}
    150 	else
    151 	{
    152 		errorL.fileE[ 0 ] = 0;
    153 	}
    154 
    155 	if( textA != NULL )
    156 	{
    157 		va_list argsL;
    158 		va_start( argsL, textA );
    159 		bbs_vsnprintf( errorL.textE, bbs_ERROR_MAX_TEXT_CHARS, textA, argsL );
    160 		va_end( argsL );
    161 	}
    162 	else
    163 	{
    164 		errorL.textE[ 0 ] = 0;
    165 	}
    166 
    167 	return errorL;
    168 }
    169 
    170 /* ------------------------------------------------------------------------- */
    171 
    172 /* ========================================================================= */
    173 /*                                                                           */
    174 /* ---- \ghd{ I/O } -------------------------------------------------------- */
    175 /*                                                                           */
    176 /* ========================================================================= */
    177 
    178 /* ------------------------------------------------------------------------- */
    179 
    180 /* ========================================================================= */
    181 /*                                                                           */
    182 /* ---- \ghd{ exec functions } --------------------------------------------- */
    183 /*                                                                           */
    184 /* ========================================================================= */
    185 
    186 /* ------------------------------------------------------------------------- */
    187 
    188 flag bbs_Context_pushError( struct bbs_Context* cpA, struct bbs_Error errorA )
    189 {
    190 	flag returnL = FALSE;
    191 	if( cpA->errIndexE < bbs_CONTEXT_MAX_ERRORS )
    192 	{
    193 		cpA->errStackE[ cpA->errIndexE++ ] = errorA;
    194 		returnL = TRUE;
    195 	}
    196 
    197 	if( cpA->errorHandlerE != NULL )
    198 	{
    199 		cpA->errorHandlerE( cpA );
    200 	}
    201 
    202 	return returnL;
    203 }
    204 
    205 /* ------------------------------------------------------------------------- */
    206 
    207 struct bbs_Error bbs_Context_popError( struct bbs_Context* cpA )
    208 {
    209 	if( cpA->errIndexE > 0 )
    210 	{
    211 		return cpA->errStackE[ --( cpA->errIndexE ) ];
    212 	}
    213 	else
    214 	{
    215 		return cpA->errStackE[ 0 ];
    216 	}
    217 }
    218 
    219 /* ------------------------------------------------------------------------- */
    220 
    221 struct bbs_Error bbs_Context_peekError( struct bbs_Context* cpA )
    222 {
    223 	if( cpA->errIndexE > 0 )
    224 	{
    225 		return cpA->errStackE[ cpA->errIndexE - 1 ];
    226 	}
    227 	else
    228 	{
    229 		return cpA->errStackE[ 0 ];
    230 	}
    231 }
    232 
    233 /* ------------------------------------------------------------------------- */
    234 
    235 flag bbs_Context_error( struct bbs_Context* cpA )
    236 {
    237 	return cpA->errIndexE > 0;
    238 }
    239 
    240 /* ------------------------------------------------------------------------- */
    241 
    242 bbs_errorFPtr bbs_Context_setErrorHandler( struct bbs_Context* cpA,
    243 									       bbs_errorFPtr errorHandlerA )
    244 {
    245 	bbs_errorFPtr oldErrorHandlerL = cpA->errorHandlerE;
    246 	cpA->errorHandlerE = errorHandlerA;
    247 	return oldErrorHandlerL;
    248 }
    249 
    250 /* ------------------------------------------------------------------------- */
    251 
    252 void bbs_Context_doCallback( struct bbs_Context* cpA )
    253 {
    254 	if( cpA->callbackHandlerE != NULL )
    255 	{
    256 		uint32 errorL = ( *cpA->callbackHandlerE )( cpA );
    257 		if( errorL != bbs_ERR_OK )
    258 		{
    259 			bbs_Context_pushError( cpA, bbs_Error_create( errorL, 0, NULL, NULL ) );
    260 		}
    261 	}
    262 }
    263 
    264 /* ------------------------------------------------------------------------- */
    265 
    266 bbs_callbackFPtr bbs_Context_setCallbackHandler( struct bbs_Context* cpA,
    267 									       bbs_callbackFPtr callbackHandlerA )
    268 {
    269 	bbs_callbackFPtr oldCallbackHandlerL = cpA->callbackHandlerE;
    270 	cpA->callbackHandlerE = callbackHandlerA;
    271 	return oldCallbackHandlerL;
    272 }
    273 
    274 /* ------------------------------------------------------------------------- */
    275 
    276 /** adds a static memory segment to memory table of context */
    277 void bbs_Context_addStaticSeg(	struct bbs_Context* cpA,
    278 							    uint16* memPtrA, /* pointer to memory */
    279 								uint32 sizeA,    /* size of memory segment in 16 bit units */
    280 								flag sharedA,    /* Indicates that this segment is to be shared among multiple objects */
    281 								uint32 idA )     /* ID of segment, id=0: unspecified */
    282 {
    283 	struct bbs_MemSeg memSegL;
    284 	bbs_DEF_fNameL( "void bbs_Context_addStaticSeg(....)" )
    285 
    286 
    287 	/* checks */
    288 	if( sharedA && cpA->memTblE.ssSizeE == bbs_MAX_MEM_SEGS )
    289 	{
    290 		bbs_ERROR1( "%s:\nShared Memory Table is full! Increase bbs_MAX_MEM_SEGS", fNameL );
    291 		return;
    292 	}
    293 	if( sharedA && cpA->memTblE.esSizeE == bbs_MAX_MEM_SEGS )
    294 	{
    295 		bbs_ERROR1( "%s:\nExclusive Memory Table is full! Increase bbs_MAX_MEM_SEGS", fNameL );
    296 		return;
    297 	}
    298 
    299 
    300 	bbs_MemSeg_init( cpA, &memSegL );
    301 	memSegL.memPtrE = memPtrA;
    302 	memSegL.sizeE = sizeA;
    303 	memSegL.allocIndexE = 0;
    304 	memSegL.sharedE = sharedA;
    305 	memSegL.idE = idA;
    306 	memSegL.dynMemManagerPtrE = NULL;
    307 
    308 	if( sharedA )
    309 	{
    310 		cpA->memTblE.ssArrE[ cpA->memTblE.ssSizeE++ ] = memSegL;
    311 	}
    312 	else
    313 	{
    314 		cpA->memTblE.esArrE[ cpA->memTblE.esSizeE ] = memSegL;
    315 		cpA->memTblE.espArrE[ cpA->memTblE.esSizeE ] = &cpA->memTblE.esArrE[ cpA->memTblE.esSizeE ];
    316 		cpA->memTblE.esSizeE++;
    317 	}
    318 }
    319 
    320 /* ------------------------------------------------------------------------- */
    321 
    322 /* adds a dynamic memory segment to memory table of context
    323  * Upon destruction of the context object any residual will be freed automatically
    324  */
    325 void bbs_Context_addDynamicSeg(	struct bbs_Context* cpA,
    326 								bbs_mallocFPtr mallocFPtrA,	/* function pointer to external mem alloc function (s. comment of type declaration)*/
    327 								bbs_freeFPtr freeFPtrA,     /* function pointer to external mem free function */
    328 								flag sharedA,    /* Indicates that this segment is to be shared among multiple objects */
    329 								uint32 idA )     /* ID of segment, id=0: unspecified */
    330 {
    331 	struct bbs_DynMemManager memManagerL;
    332 	struct bbs_MemSeg memSegL;
    333 	bbs_DEF_fNameL( "void bbs_Context_addDynamicSeg(....)" )
    334 
    335 
    336 	/* checks */
    337 	if( cpA->dynMemManagerArrSizeE == bbs_CONTEXT_MAX_MEM_MANAGERS )
    338 	{
    339 		bbs_ERROR1( "%s:\nMemory Manager Table is full! Increase bbs_CONTEXT_MAX_MEM_MANAGERS", fNameL );
    340 		return;
    341 	}
    342 	if( sharedA && cpA->memTblE.ssSizeE == bbs_MAX_MEM_SEGS )
    343 	{
    344 		bbs_ERROR1( "%s:\nShared Memory Table is full! Increase bbs_MAX_MEM_SEGS", fNameL );
    345 		return;
    346 	}
    347 	if( sharedA && cpA->memTblE.esSizeE == bbs_MAX_MEM_SEGS )
    348 	{
    349 		bbs_ERROR1( "%s:\nExclusive Memory Table is full! Increase bbs_MAX_MEM_SEGS", fNameL );
    350 		return;
    351 	}
    352 
    353 	bbs_DynMemManager_init( cpA, &memManagerL );
    354 	memManagerL.mallocFPtrE = mallocFPtrA;
    355 	memManagerL.freeFPtrE = freeFPtrA;
    356 	memManagerL.memPtrE = NULL;
    357 	cpA->dynMemManagerArrE[ cpA->dynMemManagerArrSizeE++ ] = memManagerL;
    358 
    359 	bbs_MemSeg_init( cpA, &memSegL );
    360 	memSegL.memPtrE = NULL;
    361 	memSegL.sizeE = 0;
    362 	memSegL.allocIndexE = 0;
    363 	memSegL.sharedE = sharedA;
    364 	memSegL.idE = idA;
    365 	memSegL.dynMemManagerPtrE = &cpA->dynMemManagerArrE[ cpA->dynMemManagerArrSizeE - 1 ];
    366 
    367 	if( sharedA )
    368 	{
    369 		cpA->memTblE.ssArrE[ cpA->memTblE.ssSizeE++ ] = memSegL;
    370 	}
    371 	else
    372 	{
    373 		cpA->memTblE.esArrE[ cpA->memTblE.esSizeE ] = memSegL;
    374 		cpA->memTblE.espArrE[ cpA->memTblE.esSizeE ] = &cpA->memTblE.esArrE[ cpA->memTblE.esSizeE ];
    375 		cpA->memTblE.esSizeE++;
    376 	}
    377 }
    378 
    379 /* ------------------------------------------------------------------------- */
    380 
    381 uint32 bbs_Context_exclAllocSize( struct bbs_Context* cpA, uint32 segIndexA )
    382 {
    383 	return bbs_MemSeg_allocatedSize( cpA, &cpA->memTblE.esArrE[ segIndexA ] );
    384 }
    385 
    386 /* ------------------------------------------------------------------------- */
    387 
    388 uint32 bbs_Context_shrdAllocSize( struct bbs_Context* cpA, uint32 segIndexA )
    389 {
    390 	return bbs_MemSeg_allocatedSize( cpA, &cpA->memTblE.ssArrE[ segIndexA ] );
    391 }
    392 
    393 /* ------------------------------------------------------------------------- */
    394 
    395 void bbs_Context_quickInit( struct bbs_Context* cpA,
    396 	 					    bbs_mallocFPtr mallocFPtrA,	/* function pointer to external mem alloc function (s. comment of type declaration)*/
    397 						    bbs_freeFPtr freeFPtrA,
    398 						    bbs_errorFPtr errorHandlerA )
    399 {
    400 	bbs_Context_init( cpA );
    401 	bbs_Context_addDynamicSeg( cpA, mallocFPtrA, freeFPtrA, FALSE, 0 );
    402 	bbs_Context_addDynamicSeg( cpA, mallocFPtrA, freeFPtrA, TRUE, 0 );
    403 	bbs_Context_setErrorHandler( cpA, errorHandlerA );
    404 }
    405 
    406 /* ------------------------------------------------------------------------- */
    407 
    408 /* ========================================================================= */
    409 
    410 
    411