Ejemplo n.º 1
0
void cm_QueueBKGRequest(cm_scache_t *scp, cm_bkgProc_t *procp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
	cm_user_t *userp)
{
    cm_bkgRequest_t *rp;
        
    rp = malloc(sizeof(*rp));
    memset(rp, 0, sizeof(*rp));
        
    cm_HoldSCache(scp);
    rp->scp = scp;
    cm_HoldUser(userp);
    rp->userp = userp;
    rp->procp = procp;
    rp->p1 = p1;
    rp->p2 = p2;
    rp->p3 = p3;
    rp->p4 = p4;

    lock_ObtainWrite(&cm_daemonLock);
    cm_bkgQueueCount++;
    osi_QAdd((osi_queue_t **) &cm_bkgListp, &rp->q);
    if (!cm_bkgListEndp) 
        cm_bkgListEndp = rp;
    lock_ReleaseWrite(&cm_daemonLock);

    osi_Wakeup((LONG_PTR) &cm_bkgListp);
}
Ejemplo n.º 2
0
/* create a new log, taking a name and a size in entries (not words) */
osi_log_t *osi_LogCreate(char *namep, size_t size)
{
    osi_log_t *logp;
    osi_fdType_t *typep;
    char tbuffer[256];
    LARGE_INTEGER bigFreq;
    LARGE_INTEGER bigTemp;
    LARGE_INTEGER bigJunk;

    if (osi_Once(&osi_logOnce)) {
        QueryPerformanceFrequency(&bigFreq);
        if (bigFreq.LowPart == 0 && bigFreq.HighPart == 0)
            osi_logFreq = 0;
        else {
            /* turn frequency into ticks per 10 micros */
            bigTemp.LowPart = 100000;
            bigTemp.HighPart = 0;
            osi_logTixToMicros = 10;
            bigFreq = LargeIntegerDivide(bigFreq, bigTemp, &bigJunk);

            /* check if resolution is too fine or to gross for this to work */
            if (bigFreq.HighPart > 0 || bigFreq.LowPart < 8)
                osi_logFreq = 0;	/* too big to represent as long */
            else
                osi_logFreq = bigFreq.LowPart;
        }

        /* done with init */
        osi_EndOnce(&osi_logOnce);
    }

    logp = malloc(sizeof(osi_log_t));
    memset(logp, 0, sizeof(osi_log_t));
    {
        size_t namelen = strlen(namep) + 1;

        logp->namep = malloc(namelen * sizeof(char));
        StringCchCopyA(logp->namep, namelen, namep);
    }
    osi_QAdd((osi_queue_t **) &osi_allLogsp, &logp->q);

    /* compute size we'll use */
    if (size == 0) size = osi_logSize;

    /* handle init for this size */
    logp->alloc = size;
    logp->datap = malloc(size * sizeof(osi_logEntry_t));

    /* init strings array */
    logp->maxstringindex = size/3;
    logp->stringindex = 0;
    logp->stringsp = malloc(logp->maxstringindex * OSI_LOG_STRINGSIZE);

    /* and sync */
    thrd_InitCrit(&logp->cs);

    StringCbCopyA(tbuffer, sizeof(tbuffer), "log:");
    StringCbCatA(tbuffer, sizeof(tbuffer), namep);
    typep = osi_RegisterFDType(tbuffer, &osi_logFDOps, logp);
    if (typep) {
        /* add formatting info */
        osi_AddFDFormatInfo(typep, OSI_DBRPC_REGIONINT, 0,
                            "Thread ID", OSI_DBRPC_HEX);
        osi_AddFDFormatInfo(typep, OSI_DBRPC_REGIONSTRING, 1,
                            "Time (mics)", 0);
    }

    return logp;
}