| 1 | /**************** Block H Declares Source Code File (.H) ***************/ |
| 2 | /* Name: BLOCK.H Version 2.0 */ |
| 3 | /* */ |
| 4 | /* (C) Copyright to the author Olivier BERTRAND 1998 */ |
| 5 | /* */ |
| 6 | /* This file contains the BLOCK pure virtual class definition. */ |
| 7 | /*---------------------------------------------------------------------*/ |
| 8 | /* Note: one of the main purpose of this base class is to take care */ |
| 9 | /* of the very specific way Plug handles memory allocation. */ |
| 10 | /* Instead of allocating small chunks of storage via new or malloc */ |
| 11 | /* Plug works in its private memory pool in which it does the sub- */ |
| 12 | /* allocation using the function PlugSubAlloc. These are never freed */ |
| 13 | /* separately but when a transaction is terminated, the entire pool */ |
| 14 | /* is set to empty, resulting in a very fast and efficient allocate */ |
| 15 | /* process, no garbage collection problem, and an automatic recovery */ |
| 16 | /* procedure (via LongJump) when the memory is exhausted. */ |
| 17 | /* For this to work new must be given two parameters, first the */ |
| 18 | /* global pointer of the Plug application, and an optional pointer to */ |
| 19 | /* the memory pool to use, defaulting to NULL meaning using the Plug */ |
| 20 | /* standard default memory pool, example: */ |
| 21 | /* tabp = new(g) XTAB("EMPLOYEE"); */ |
| 22 | /* allocates a XTAB class object in the standard Plug memory pool. */ |
| 23 | /***********************************************************************/ |
| 24 | #if !defined(BLOCK_DEFINED) |
| 25 | #define BLOCK_DEFINED |
| 26 | |
| 27 | #if defined(__WIN__) && !defined(NOEX) |
| 28 | #define DllExport __declspec( dllexport ) |
| 29 | #else // !__WIN__ |
| 30 | #define DllExport |
| 31 | #endif // !__WIN__ |
| 32 | |
| 33 | /***********************************************************************/ |
| 34 | /* Definition of class BLOCK with its method function new. */ |
| 35 | /***********************************************************************/ |
| 36 | typedef class BLOCK *PBLOCK; |
| 37 | |
| 38 | class DllExport BLOCK { |
| 39 | public: |
| 40 | void * operator new(size_t size, PGLOBAL g, void *p = NULL) { |
| 41 | if (trace(256)) |
| 42 | htrc("New BLOCK: size=%d g=%p p=%p\n" , size, g, p); |
| 43 | |
| 44 | return (PlugSubAlloc(g, p, size)); |
| 45 | } // end of new |
| 46 | |
| 47 | virtual void Printf(PGLOBAL, FILE *, uint) {} // Produce file desc |
| 48 | virtual void Prints(PGLOBAL, char *, uint) {} // Produce string desc |
| 49 | |
| 50 | #if !defined(__BORLANDC__) |
| 51 | // Avoid warning C4291 by defining a matching dummy delete operator |
| 52 | void operator delete(void *, PGLOBAL, void *) {} |
| 53 | void operator delete(void *, size_t) {} |
| 54 | #endif |
| 55 | virtual ~BLOCK() {} |
| 56 | |
| 57 | }; // end of class BLOCK |
| 58 | |
| 59 | #endif // !BLOCK_DEFINED |
| 60 | |