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); }
/* 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; }