SPHLFLoggerHandle_t* SPHLFPortalIteratorNext (SPHLFPortalIterator_t *iterator, SPHLFLoggerHandle_t *handlespace) { SPHLFLoggerHandle_t *handle = NULL; SPHLogPortal_t portal = iterator->portal; SASLogPortalHeader *headerBlock = (SASLogPortalHeader*)portal; SPHLFLogger_t log, log0; if (SOMSASCheckBlockSigAndType ((SASBlockHeader*)headerBlock, SAS_RUNTIME_LOGPORTAL) ) { /* iterator refs a valid portal. */ log = iterator->logIter.logger; #ifdef __SASDebugPrint__ sas_printf("SPHLFPortalIteratorNext(%p, %p) logger= %p\n", iterator, handlespace, log); #endif if (log) { /* The iterator should point to a logger. */ handle = SPHLFLoggerIteratorNext(&iterator->logIter, handlespace); if (!handle) { /* implies we at then end of the current logger. */ longPtr_t cur = iterator->current; longPtr_t nxt = cur + 1; log0 = headerBlock->log_buff_list[cur]; if (log0 && (nxt <= iterator->next_free) && (nxt < iterator->capacity)) { /* nxt is within the allocated list. */ log = headerBlock->log_buff_list[nxt]; if (log) { /* and the list entry was filled in. */ SPHLFLogIterator_t *l_iter; l_iter = SPHLFLoggerCreateIterator(log, &iterator->logIter); if (l_iter) { /* and that pointer to a valid logger. */ iterator->current = nxt; handle = SPHLFLoggerIteratorNext(l_iter, handlespace); } } } } } #ifdef __SASDebugPrint__ } else { sas_printf("SPHLFPortalIteratorNext(%p, %p) type check failed\n", iterator, handlespace); #endif } return handle; }
SPHLFPortalIterator_t * SPHLFPortalCreateIterator(SPHLogPortal_t portal, SPHLFPortalIterator_t *Iterator_space) { SPHLFPortalIterator_t *iter = NULL; SASLogPortalHeader *headerBlock = (SASLogPortalHeader*)portal; SPHLFLogger_t log; if (SOMSASCheckBlockSigAndType ((SASBlockHeader*)headerBlock, SAS_RUNTIME_LOGPORTAL) ) { SPHLFLogIterator_t *l_iter = NULL; log = headerBlock->log_buff_list[0]; #ifdef __SASDebugPrint__ sas_printf("SPHLFPortalCreateIterator(%p, %p) log[0]= %p\n", portal, Iterator_space, log); #endif if (log) { l_iter = SPHLFLoggerCreateIterator(log, &Iterator_space->logIter); if (l_iter) { iter = Iterator_space; iter->portal = portal; iter->current = 0; iter->next_free = headerBlock->next_free; iter->capacity = headerBlock->list_size; } } #ifdef __SASDebugPrint__ } else { sas_printf("SPHLFPortalCreateIterator(%p, %p) type check failed\n", portal, Iterator_space); #endif } return iter; }
int test_unit (void) { SPHLFLogger_t logger; SPHLFLoggerHandle_t *handle, handle0; sphtimer_t tempt, startt, endt, freqt; unsigned int i, tempn_i, temp0_i, temp1_i, temp2_i; int rc, rtn = 0; int *tarray; double clock, nano, rate; block_size_t cap, units, p10, log_alloc; SPHLFLoggerHandle_t *handlex, handle4, handle5; sphtimer_t entry_timestamp, prev_timestamp; SPHLFLogIterator_t *iter, iter0; log_alloc = SegmentSize; logger = SPHLFLoggerCreate (log_alloc); if ( logger ) { printf("\nSPHLFLoggerCreate (%zu) success \n", log_alloc); cap = SPHLFLoggerFreeSpace( logger ); units = cap / 128; printf("SPHLFLoggerFreeSpace() = %zu units=%zu\n", cap, units); for ( i = 0; i < units; i++ ) { rc = lflogentry_test (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); printf("\ntest_unit() verify log contents\n"); iter = SPHLFLoggerCreateIterator(logger, &iter0); if (iter) { printf(" SPHLFLoggerCreateIterator(%p,%p) = %p succeeded\n", logger, &iter0, iter); } else { printf(" SPHLFLoggerCreateIterator(%p,%p) = %p failed\n", logger, &iter0, iter); return (rtn + 10); } handlex = SPHLFLoggerIteratorNext (iter, &handle4); printf(" SPHLFLoggerIteratorNext() [%p,%lx,%lx,%lx,%lx]\n", iter->logger, iter->current, iter->free, iter->start_log, iter->end_log); if (handlex) { printf(" SPHLFLoggerIteratorNext(%p,%p) = %p succeeded\n", logger, &handle4, handlex); printf(" @%p->id=%x\n", handlex->entry, handlex->entry->entryID.idUnit); entry_timestamp = SPHLFLogEntryTimeStamp (handlex); temp0_i = SPHLFlogEntryGetNextInt(handlex); temp1_i = SPHLFlogEntryGetNextInt(handlex); temp2_i = SPHLFlogEntryGetNextInt(handlex); if ((temp0_i != 0) || (temp1_i != 0x12345678) || (temp2_i != 0xdeadbeef)) { printf(" SPHLFLoggerIteratorNext() data mismatch found %d,%x,%x\n", temp0_i, temp1_i, temp2_i); rtn++; } } else { printf(" SPHLFLoggerIteratorNext(%p,%p) = %p failed\n", logger, &handle4, handlex); return (rtn + 10); } while (handlex) { tempn_i = temp0_i; prev_timestamp = entry_timestamp; handlex = SPHLFLoggerIteratorNext (iter, &handle5); if (handlex) { temp0_i = SPHLFlogEntryGetNextInt(handlex); temp1_i = SPHLFlogEntryGetNextInt(handlex); temp2_i = SPHLFlogEntryGetNextInt(handlex); entry_timestamp = SPHLFLogEntryTimeStamp (handlex); if ((temp0_i != (tempn_i+1)) || (temp1_i != 0x12345678) || (temp2_i != 0xdeadbeef) || (entry_timestamp < prev_timestamp)) { printf(" SPHLFLoggerIteratorNext() data mismatch found %d,%x,%x, %llu,%llu\n", temp0_i, temp1_i, temp2_i, prev_timestamp, entry_timestamp); rtn++; } } } printf("test_unit() verify log complete\n\n"); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 10000000; while (p10 > units) p10 = p10 / 10; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_test (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = p10 / (clock / (double)freqt); printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_test X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 10000000; while (p10 > units) p10 = p10 / 10; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_fasttest (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = p10 / (clock / (double)freqt); printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_fasttest X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); SPHLFLoggerSetCachePrefetch(logger, 1); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 10000000; while (p10 > units) p10 = p10 / 10; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_fasttest (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = p10 / (clock / (double)freqt); printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_fasttest prefetch0 X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); SPHLFLoggerSetCachePrefetch(logger, 2); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 10000000; while (p10 > units) p10 = p10 / 10; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_fasttest (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = p10 / (clock / (double)freqt); printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_fasttest prefetch1 X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 10000000; while (p10 > units) p10 = p10 / 10; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_fastteststrong (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = p10 / (clock / (double)freqt); printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_fastteststrong X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 10000000; while (p10 > units) p10 = p10 / 10; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_fasttestweak (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = p10 / (clock / (double)freqt); printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_fasttestweak X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 10000000; while (p10 > units) p10 = p10 / 10; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_fasttestnolockweak (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = p10 / (clock / (double)freqt); printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_fasttestnolockweak X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ printf("\nSPHLFLoggerDestroy (%p) \n", logger); SPHLFLoggerDestroy( logger ); } else printf("SPHLFLoggerCreate (%zu) failed \n", log_alloc); logger = SPHLFCircularLoggerCreate (log_alloc, 128); if ( logger ) { printf("\nSPHLFCirgularLoggerCreate (%zu) success \n", log_alloc); rc += SPHLFLoggerPrefetch(logger); cap = SPHLFLoggerFreeSpace( logger ); units = cap / 128; printf("SPHLFLoggerFreeSpace() = %zu, units=%zu\n", cap, units); for ( i = 0; i < units; i++ ) { handle = SPHLFLoggerAllocStrideTimeStamped (logger, 0, 0, &handle0); if ( handle ) { } else { printf("SPHLFLoggerAllocStrideTimeStamped (%p) failed\n", logger); } } #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 100000000; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_stridetest (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocStrideTimeStamped (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = 1000000000.0 / nano; printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_stridetest X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("\ntest_unit() verify log contents\n"); iter = SPHLFLoggerCreateIterator(logger, &iter0); if (iter) { printf(" SPHLFLoggerCreateIterator(%p,%p) = %p succeeded\n", logger, &iter0, iter); } else { printf(" SPHLFLoggerCreateIterator(%p,%p) = %p failed\n", logger, &iter0, iter); return (rtn + 10); } handlex = SPHLFLoggerIteratorNext (iter, &handle4); printf(" SPHLFLoggerIteratorNext() [%p,%lx,%lx,%lx,%lx]\n", iter->logger, iter->current, iter->free, iter->start_log, iter->end_log); if (handlex) { printf(" SPHLFLoggerIteratorNext(%p,%p) = %p succeeded\n", logger, &handle4, handlex); printf(" @%p->id=%x\n", handlex->entry, handlex->entry->entryID.idUnit); entry_timestamp = SPHLFLogEntryTimeStamp (handlex); tarray = (int*)SPHLFLogEntryGetFreePtr(handlex); temp0_i = tarray[0]; temp1_i = tarray[1]; temp2_i = tarray[2]; if ((temp1_i != 0x12345678) || (temp2_i != 0xdeadbeef)) { printf(" SPHLFLoggerIteratorNext() data mismatch found %d,%x,%x\n", temp0_i, temp1_i, temp2_i); rtn++; } } else { printf(" SPHLFLoggerIteratorNext(%p,%p) = %p failed\n", logger, &handle4, handlex); return (rtn + 10); } while (handlex) { tempn_i = temp0_i; prev_timestamp = entry_timestamp; handlex = SPHLFLoggerIteratorNext (iter, &handle5); if (handlex) { temp0_i = SPHLFlogEntryGetNextInt(handlex); temp1_i = SPHLFlogEntryGetNextInt(handlex); temp2_i = SPHLFlogEntryGetNextInt(handlex); entry_timestamp = SPHLFLogEntryTimeStamp (handlex); if ((temp0_i != (tempn_i+1)) || (temp1_i != 0x12345678) || (temp2_i != 0xdeadbeef) || (entry_timestamp < prev_timestamp)) { printf(" SPHLFLoggerIteratorNext() data mismatch found %d,%x,%x, %llu,%llu\n", temp0_i, temp1_i, temp2_i, prev_timestamp, entry_timestamp); rtn++; } } } printf("test_unit() verify log complete\n\n"); printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ SPHLFLoggerResetAsync (logger); #ifdef SPH_TIMERTEST_VERIFY printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ p10 = 100000000; startt = sphgettimer(); for ( i = 0; i < p10; i++ ) { rc = lflogentry_stridetestnolock (logger, i, 0x12345678, 0xdeadbeef); if ( !rc ) { } else { printf("SPHLFLoggerAllocStrideTimeStampedNoLock (%p) failed\n", logger); break; } } endt = sphgettimer(); tempt = endt -startt; clock = tempt; freqt = sphfastcpufreq(); nano = (clock * 1000000000.0) / (double)freqt; nano = nano / p10; rate = 1000000000.0 / nano; printf ("\nstartt=%lld, endt=%lld, deltat=%lld, freqt=%lld\n", startt, endt, tempt, freqt); printf ("lflogentry_stridetestnolock X %zu ave= %6.2fns rate=%10.1f/s\n", p10, nano, rate); #ifdef SPH_TIMERTEST_VERIFY printf("\ntest_unit() verify log contents\n"); iter = SPHLFLoggerCreateIterator(logger, &iter0); if (iter) { printf(" SPHLFLoggerCreateIterator(%p,%p) = %p succeeded\n", logger, &iter0, iter); } else { printf(" SPHLFLoggerCreateIterator(%p,%p) = %p failed\n", logger, &iter0, iter); return (rtn + 10); } handlex = SPHLFLoggerIteratorNext (iter, &handle4); printf(" SPHLFLoggerIteratorNext() [%p,%lx,%lx,%lx,%lx]\n", iter->logger, iter->current, iter->free, iter->start_log, iter->end_log); if (handlex) { printf(" SPHLFLoggerIteratorNext(%p,%p) = %p succeeded\n", logger, &handle4, handlex); printf(" @%p->id=%x\n", handlex->entry, handlex->entry->entryID.idUnit); entry_timestamp = SPHLFLogEntryTimeStamp (handlex); tarray = (int*)SPHLFLogEntryGetFreePtr(handlex); temp0_i = tarray[0]; temp1_i = tarray[1]; temp2_i = tarray[2]; if ((temp1_i != 0x12345678) || (temp2_i != 0xdeadbeef)) { printf(" SPHLFLoggerIteratorNext() data mismatch found %d,%x,%x\n", temp0_i, temp1_i, temp2_i); rtn++; } } else { printf(" SPHLFLoggerIteratorNext(%p,%p) = %p failed\n", logger, &handle4, handlex); return (rtn + 10); } while (handlex) { tempn_i = temp0_i; prev_timestamp = entry_timestamp; handlex = SPHLFLoggerIteratorNext (iter, &handle5); if (handlex) { temp0_i = SPHLFlogEntryGetNextInt(handlex); temp1_i = SPHLFlogEntryGetNextInt(handlex); temp2_i = SPHLFlogEntryGetNextInt(handlex); entry_timestamp = SPHLFLogEntryTimeStamp (handlex); if ((temp0_i != (tempn_i+1)) || (temp1_i != 0x12345678) || (temp2_i != 0xdeadbeef) || (entry_timestamp < prev_timestamp)) { printf(" SPHLFLoggerIteratorNext() data mismatch found %d,%x,%x, %llu,%llu\n", temp0_i, temp1_i, temp2_i, prev_timestamp, entry_timestamp); rtn++; } } } printf("test_unit() verify log complete\n\n"); printf("SPHLFLoggerFreeSpace() = %zu\n", SPHLFLoggerFreeSpace( logger )); #endif /* SPH_TIMERTEST_VERIFY */ printf("\nSPHLFLoggerDestroy (%p) \n", logger); SPHLFLoggerDestroy( logger ); } else printf("SPHLFLoggerCreate (%zu) failed \n", log_alloc); return rtn; }