windows-nt/Source/XPSP1/NT/net/jet500/jet/dae/inc/pib.h
2020-09-26 16:20:57 +08:00

107 lines
3.1 KiB
C

//============== DAE: OS/2 Database Access Engine ===================
//============== pib.h: Process Information Block ===================
/* JET API flags
/**/
#define FPIBVersion( ppib ) (!((ppib)->grbit & (JET_bitCIMCommitted | JET_bitCIMDirty)))
#define FPIBCommitted( ppib ) ((ppib)->grbit & JET_bitCIMCommitted)
#define FPIBDirty( ppib ) ((ppib)->grbit & JET_bitCIMDirty)
#define FPIBAggregateTransaction( ppib ) ((ppib)->grbit & JET_bitAggregateTransaction)
//
// Process Information Block
//
struct _pib
{
/* most used field has offset 0
/**/
TRX trx; // trx id
BOOL fUserSession; // user session
/* JET API fields
/**/
JET_SESID sesid; // JET session id
JET_GRBIT grbit; // session flags
struct _pib *ppibNext; // PIB list
LEVEL level; // transaction level of this session
struct _dab *pdabList; // list of open DAB's of this thread
USHORT rgcdbOpen[dbidUserMax]; // counter for open databases
struct _fucb *pfucb; // list of active fucb of this thread
/* logging/recovery fields
/**/
PROCID procid; // thread id
LGPOS lgposStart; // log time
LEVEL levelStart; // transaction level when first begin transaction operation
INT clgOpenT; // count of deferred open transactions
SIG sigWaitLogFlush;
LONG lWaitLogFlush;
struct _pib *ppibNextWaitFlush;
struct _pib *ppibPrevWaitFlush;
LGPOS *plgposCommit;
/* PIB flags
/**/
BOOL fAfterFirstBT:1; // for redo only
BOOL fLogDisabled:1; // temporary turn off the logging
BOOL fLGWaiting:1; // waiting for log to flush
BOOL fDeferFreeNodeSpace:1; // session has deferred node free space
/* version store fields
/**/
struct _bucket volatile *pbucket;
struct _rc *prcLast; // last node of this proc's RC list
INT ibOldestRCE;
#ifdef WIN16
struct _pha *phaUser; // pointer to User Handle Array
#endif /* WIN16 */
};
#define PpibMEMAlloc() (PIB*)PbMEMAlloc(iresPIB)
#ifdef DEBUG /* Debug check for illegal use of freed pib */
#define MEMReleasePpib(ppib) { MEMRelease(iresPIB, (BYTE*)(ppib)); ppib = ppibNil; }
#else
#define MEMReleasePpib(ppib) { MEMRelease(iresPIB, (BYTE*)(ppib)); }
#endif
/* CheckPIB macro.
/**/
#ifdef WIN16
#define CheckPIB(ppib) \
{ \
Assert( fRecovering || OffsetOf(ppib) == ppib->procid ); \
rghfUser = ppib->phaUser->rghfDatabase; \
hfLog = ppib->phaUser->hfLog; \
}
#else /* !WIN16 */
#define CheckPIB(ppib) \
Assert( ( fRecovering || OffsetOf(ppib) == ppib->procid ) && \
(ppib)->level < levelMax )
#endif /* !WIN16 */
#define FPIBDeferFreeNodeSpace( ppib ) ( (ppib)->fDeferFreeNodeSpace )
#define PIBSetDeferFreeNodeSpace( ppib ) ( (ppib)->fDeferFreeNodeSpace = fTrue )
#define PIBResetDeferFreeNodeSpace( ppib ) ( (ppib)->fDeferFreeNodeSpace = fFalse )
#define FPIBActive( ppib ) ( (ppib)->level != levelNil )
#define SesidOfPib( ppib ) ( (ppib)->sesid )
/* prototypes
/**/
ERR ErrPIBBeginSession( PIB **pppib );
VOID PIBEndSession( PIB *ppib );
#ifdef DEBUG
VOID PIBPurge( VOID );
#else
#define PIBPurge()
#endif