示例#1
0
/* PROGRAM: shmCreateSegmentTable - initialize segment table for shared memory
 *                                  references
 *
 * RETURNS: Pointer to created segment table
 */
shmTable_t *
shmCreateSegmentTable(STPOOL *pstpool /* pointer to storage pool */)
{
    shmTable_t  *pshsgctl;	/* pointer to segment control */
    
    pshsgctl = (shmTable_t * )stGet(NULL, pstpool,sizeof(shmTable_t));
		/* Rich T. claims that we do not need pcontext here */

    stnclr((TEXT*)pshsgctl,sizeof(shmTable_t));
    pshsgctl->ipub = MAXPRIVSLT + 1; /* initialize start of public slots */
    pshsgctl->iprv = MAXPRIVSLT;     /* initialize start of private slots */
    
    return pshsgctl;
}
示例#2
0
/* PROGRAM: dbXAinit - Initialize the global xid free list
 *
 *
 * RETURNS: DSM_S_SUCCESS on success
 */
dsmStatus_t
dbxaInit(dsmContext_t *pcontext)
{
    dbcontext_t  *pdbcontext = pcontext->pdbcontext;
    dbshm_t      *pdbshm = pdbcontext->pdbpub;
    LONG          maxxids,amount;
    int           i;
    dbxaTransaction_t *pxids, *plastxid = NULL;
    
    if (!pdbshm->maxxids)
        return 0;

   
    amount = pdbshm->maxxids;
    for(pdbshm->maxxids = 0; pdbshm->maxxids < amount;
        pdbshm->maxxids += 64 )
    {
        /* Allocate the xids in chunks of 64         */
        pxids = (dbxaTransaction_t *)
            stGet(pcontext,
                  XSTPOOL(pdbcontext, pdbshm->qdbpool),
                  64 * sizeof(dbxaTransaction_t));
        if(!pxids)
        {
            MSGD_CALLBACK(pcontext,
                          "%gInsuffient storage to allocate xid table.");
        }
        if(plastxid)
        {
            /* Make last of previous batch of 64 point to this batch */
            plastxid->qnextXID = P_TO_QP(pcontext,pxids);
        }
        if(!pdbshm->qxidFree)
        {
            pdbshm->qxidFree = P_TO_QP(pcontext,pxids);
        }
        
        for(i = 0; i < 64;i++,pxids++)
        {
            QSELF(pxids) = P_TO_QP(pcontext,pxids);
            pxids->qnextXID = P_TO_QP(pcontext,pxids + 1);
        }
        plastxid = pxids--;
        plastxid->qnextXID = 0;
    }
    
    return 0;
}
示例#3
0
/* PROGRAM: rlaiseto - initialize aictl and buffers
*/
DSMVOID
rlaiseto (dsmContext_t *pcontext)
{
    dbcontext_t     *pdbcontext = pcontext->pdbcontext;
    dbshm_t     *pdbpub = pdbcontext->pdbpub;
    AICTL	*paictl;
    BKTBL	*pbktbl;
    AIBUF	*paibuf = (AIBUF *)0;
    AIBUF	*pn;
    int	i;

    /* *** TODO: there is a memory leak when peforming aimage begin on a
     * database that has 2phase on already rlaiseto is called twice.  Not
     * a big deal, but something to remember.
     */
    if (pdbcontext->paictl != NULL)
    {
	/* memory leak! */
    }

    /* allocate the ai control structure */
    paictl = (AICTL *)stGet(pcontext, (STPOOL *)QP_TO_P(pdbcontext, pdbpub->qdbpool),
                                              sizeof(AICTL));
    pdbpub->qaictl = P_TO_QP(pcontext, paictl);
    pdbcontext->paictl = paictl;

    /* initialize blocksize information based on masterblock info */
    paictl->aiblksize = pdbcontext->pmstrblk->mb_aiblksize;
    paictl->aiFileType = BKAI;

    /* initialize block size log and mask constants for quick calculations */
    paictl->aiblklog = bkblklog(paictl->aiblksize);
    paictl->aiblkmask = (ULONG)0xFFFFFFFF << paictl->aiblklog;

    /* 
     * allocate buffer for ai writer to use for writing. This buffer is
     * used for making a copy of the current buffer prior to writing
     * it so that the ai writer can be writing while others are storing
     * more data in the next output buffer.  Also used during extent switches.
     */

    pbktbl = &paictl->aiwbktbl;
    QSELF (pbktbl) = P_TO_QP(pcontext, pbktbl);

    pbktbl->bt_raddr = -1;
    pbktbl->bt_dbkey = -1;
    /* BUM - Assuming aiFileType < 256 */
    pbktbl->bt_ftype = (TEXT)paictl->aiFileType;
    if ( paictl->aiFileType == BKAI )
    {
       paictl->aiArea = rlaiGetNextArea(pcontext, 1);
       if( pdbcontext->pmstrblk->mb_aibusy_extent )
       {
	  paictl->aiArea = pdbcontext->pmstrblk->mb_aibusy_extent;
       }
    }
    else
    {
    	paictl->aiArea = DSMAREA_TL;
    }
    pbktbl->bt_area = paictl->aiArea;
    
    bmGetBufferPool(pcontext, pbktbl);

    /* must have at least one ai buffer */
    if (pdbpub->argaibufs < 1) pdbpub->argaibufs = 1;

    /* allocate a ring of output ai buffer control blocks */
    pn = NULL;
    for (i = pdbpub->argaibufs; i > 0; i--)
    {
        paibuf = (AIBUF *)stGet (pcontext, (STPOOL *)QP_TO_P(pdbcontext, pdbpub->qdbpool),
			 	 sizeof(AIBUF));
        QSELF (paibuf) = P_TO_QP(pcontext, paibuf);

	if (pn)
	{
	    /* set previous buffer's link to next buffer in chain */
	    pn->aiqnxtb = QSELF (paibuf);
	}
	else
	{
	    /* this is the first, current, and next to write buffer */
	    paictl->aiqbufs = QSELF (paibuf);
            paictl->aiqcurb = QSELF (paibuf);
            paictl->aiqwrtb = QSELF (paibuf);
	}
	pn = paibuf;
    }

    /* link the last one to the first one */
    paibuf->aiqnxtb = paictl->aiqbufs;

    /* now allocate the ai block buffers themselves */
    pn = XAIBUF(pdbcontext, paictl->aiqbufs);
    for (i = pdbpub->argaibufs; i > 0; i--)
    {
	pbktbl = &(pn->aibk);

        QSELF (pbktbl) = P_TO_QP(pcontext, pbktbl);

        pbktbl->bt_raddr = -1;
	pbktbl->bt_dbkey = -1;
        pbktbl->bt_area = paictl->aiArea;
        /* BUM - Assuming UCOUNT aiFileType < 256 */
        pbktbl->bt_ftype = (TEXT)paictl->aiFileType;
        bmGetBufferPool(pcontext, pbktbl);
	pn = XAIBUF(pdbcontext, pn->aiqnxtb);
    }

} /* rlaiseto */