Exemplo n.º 1
0
dsmStatus_t
dsmBlobPut(
    dsmContext_t        *pcontext,      /* IN database context */
    dsmBlob_t           *pBlob,         /* IN blob descriptor */
    dsmText_t           *pName)         /* IN reference name for messages */
{
    dsmStatus_t returnCode = DSM_S_BLOBLIMIT;

    TRACE_CB(pcontext, "dsmBlobPut");

    pcontext->pdbcontext->inservice++; /* "post-pone" signal handling while in DSM API */

    SETJMP_ERROREXIT(pcontext, returnCode) /* Ensure error exit address set */

    returnCode = dsmThreadSafeEntry(pcontext);
    if (DSM_S_SUCCESS == returnCode)
    {
      returnCode = dbBlobPut(pcontext, pBlob, pName);
    }
    else
    {
      returnCode = dsmEntryProcessError(pcontext, returnCode,
                      (TEXT *)"dsmBlobPut");
    }

#ifdef DSM_BLOB_PUT_TEST
    MSGD_CALLBACK(pcontext, "%LdsmBlobPut: maxLength = %l", pBlob->maxLength);
    MSGD_CALLBACK(pcontext, "%LdsmBlobPut: segLength = %l", pBlob->segLength);
    MSGD_CALLBACK(pcontext, "%LdsmBlobPut: totLength = %l", pBlob->totLength);
#endif

done:
    dsmThreadSafeExit(pcontext);

    pcontext->pdbcontext->inservice--;
    return returnCode;

} /* end dsmBlobPut */
Exemplo n.º 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;
}