/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef bbs_CONTEXT_EM_H #define bbs_CONTEXT_EM_H /* ---- includes ----------------------------------------------------------- */ #include "b_BasicEm/Basic.h" #include "b_BasicEm/MemTbl.h" #include "b_BasicEm/DynMemManager.h" /* ---- related objects --------------------------------------------------- */ struct bbs_Context; /* ---- typedefs ----------------------------------------------------------- */ /** error handler function pointer */ typedef void ( *bbs_errorFPtr )( struct bbs_Context* cpA ); /** callback handler function pointer */ typedef uint32 ( *bbs_callbackFPtr )( struct bbs_Context* cpA ); /* ---- constants ---------------------------------------------------------- */ #define bbs_CONTEXT_MAX_ERRORS 8 #define bbs_CONTEXT_MAX_MEM_MANAGERS 8 #ifdef bbs_COMPACT_MESSAGE_HANDLING /* characters allocated for file name string (string is stored rightbound) (minimum 1)*/ #define bbs_ERROR_MAX_FILE_CHARS 24 /* characters allocated for text message (minimum 1) */ #define bbs_ERROR_MAX_TEXT_CHARS 1 #else /* characters allocated for file name string (string is stored rightbound) (minimum 1)*/ #define bbs_ERROR_MAX_FILE_CHARS 52 /* characters allocated for text message (minimum 1) */ #define bbs_ERROR_MAX_TEXT_CHARS 256 #endif /* defined error codes */ #define bbs_ERR_OK 0 /* no error condition */ #define bbs_ERR_ERROR 1 /* generic error */ #define bbs_ERR_OUT_OF_MEMORY 2 /* malloc handler returns with NULL*/ #define bbs_ERR_MEMORY_OVERFLOW 3 /* not enough memory in a segment or no segment */ #define bbs_ERR_WRONG_VERSION 4 /* incompatible version in ..._memRead() */ #define bbs_ERR_CORRUPT_DATA 5 /* corrupt data in ..._memRead()*/ #define bbs_ERR_CALLBACK_ERROR 6 /* a defined error originiating from a callback function */ /* ---- object definition -------------------------------------------------- */ /** error object */ struct bbs_Error { /* error code */ uint32 errorE; /* line number */ uint32 lineE; /* file name */ char fileE[ bbs_ERROR_MAX_FILE_CHARS ]; /* error text */ char textE[ bbs_ERROR_MAX_TEXT_CHARS ]; }; /* ------------------------------------------------------------------------- */ /** context object */ struct bbs_Context { /* ---- private data --------------------------------------------------- */ /** error stack */ struct bbs_Error errStackE[ bbs_CONTEXT_MAX_ERRORS ]; /** error stack index */ uint32 errIndexE; /** memory table */ struct bbs_MemTbl memTblE; /** multiple purpose dynamic memory managers */ struct bbs_DynMemManager dynMemManagerArrE[ bbs_CONTEXT_MAX_MEM_MANAGERS ]; /** number of used memory managers */ uint32 dynMemManagerArrSizeE; /** error function handler */ bbs_errorFPtr errorHandlerE; /** callback function handler */ bbs_callbackFPtr callbackHandlerE; /** user-defined pointer */ void* userPtrE; /* ---- public data ---------------------------------------------------- */ }; /* ---- associated objects ------------------------------------------------- */ /* ---- external functions ------------------------------------------------- */ /* ---- \ghd{ constructor/destructor } ------------------------------------- */ /** initializes bbs_Context */ void bbs_Context_init( struct bbs_Context* cpA ); /** frees bbs_Context */ void bbs_Context_exit( struct bbs_Context* cpA ); /* ---- \ghd{ operators } -------------------------------------------------- */ /** copy operator */ void bbs_Context_copy( struct bbs_Context* cpA, const struct bbs_Context* srcPtrA ); /* ---- \ghd{ query functions } -------------------------------------------- */ /* ---- \ghd{ modify functions } ------------------------------------------- */ /** composes an error object */ struct bbs_Error bbs_Error_create( uint32 errorA, uint32 lineA, const char* fileA, const char* textA, ... ); /* ---- \ghd{ memory I/O } ------------------------------------------------- */ /* ---- \ghd{ exec functions } --------------------------------------------- */ /****** ERROR HANDLING *********/ /** puts an error onto the error stack (returns false if stack was already full) */ flag bbs_Context_pushError( struct bbs_Context* cpA, struct bbs_Error errorA ); /** takes the last error from stack and returns it (when stack is empty: returns the error at stack position 0)*/ struct bbs_Error bbs_Context_popError( struct bbs_Context* cpA ); /** returns the last error of stack without removing it (when stack is empty: returns the error at stack position 0)*/ struct bbs_Error bbs_Context_peekError( struct bbs_Context* cpA ); /** returns true if the error stack is not empty */ flag bbs_Context_error( struct bbs_Context* cpA ); /** sets error handler; returns pointer to previous error handler * Pointer to Error handler can be NULL (->no handler call) * The error handler is called by function pushError diectly after an error was posted */ bbs_errorFPtr bbs_Context_setErrorHandler( struct bbs_Context* cpA, bbs_errorFPtr errorHandlerA ); /*******************************/ /****** CALLBACK HANDLING ******/ /** call the callback handler, push error if return value is != bbs_ERR_OK */ void bbs_Context_doCallback( struct bbs_Context* cpA ); /** sets callback handler; returns pointer to previous callback handler * Pointer to callback handler can be NULL (->no handler call) * The callback handler is called by function doCallback */ bbs_callbackFPtr bbs_Context_setCallbackHandler( struct bbs_Context* cpA, bbs_callbackFPtr callbackHandlerA ); /*******************************/ /******* MEMORY HANDLING *******/ /** adds a static memory segment to memory table of context */ void bbs_Context_addStaticSeg( struct bbs_Context* cpA, uint16* memPtrA, /* pointer to memory (32bit aligned)*/ uint32 sizeA, /* size of memory segment in 16 bit units */ flag sharedA, /* Indicates that this segment is to be shared among multiple objects */ uint32 idA ); /* ID of segment, id=0: unspecified */ /* adds a dynamic memory segment to memory table of context * Upon destruction of the context object any residual will be freed automatically */ void bbs_Context_addDynamicSeg( struct bbs_Context* cpA, bbs_mallocFPtr mallocFPtrA, /* function pointer to external mem alloc function (s. comment of type declaration)*/ bbs_freeFPtr freeFPtrA, /* function pointer to external mem free function */ flag sharedA, /* Indicates that this segment is to be shared among multiple objects */ uint32 idA ); /* ID of segment, id=0: unspecified */ /** Returns allocated memory in selected exclusive segment in units of 16bits */ uint32 bbs_Context_exclAllocSize( struct bbs_Context* cpA, uint32 segIndexA ); /** Returns allocated memory in selected exclusive segment in units of 16bits * Note that in case of static memory the return value might not reflect * the actually allocated memory amount. */ uint32 bbs_Context_shrdAllocSize( struct bbs_Context* cpA, uint32 segIndexA ); /*******************************/ /** quick compact setup for dynamic memory management environment * creates an initialized segment with * - one dynamic exclusive segment * - one dynamic shared segment * - error handler (can be NULL) * * Don't forget to call bbs_Context_exit on returned context if it goes out of scope */ void bbs_Context_quickInit( struct bbs_Context* cpA, bbs_mallocFPtr mallocFPtrA, /* function pointer to external mem alloc function (s. comment of type declaration)*/ bbs_freeFPtr freeFPtrA, bbs_errorFPtr errorHandlerA ); #endif /* bbs_CONTEXT_EM_H */