int main(int argc, char** argv) { std::thread t1([&]{ std::cout << "Sample" << std::endl; printSample(); }); t1.join(); return 0; }
int CAPerfCfg::readMmapBuffers() { CAPerfMmap *mmapBuffer; struct perf_event_mmap_page *mmapMetaData; // first page in mmapBuffer unsigned int dataHead; unsigned int dataTail; unsigned char *dataBuf; void *data; // Iterate over all the mmaps and read them.. for (int i = 0; i < m_nbrMmaps; i++) { mmapBuffer = &m_mmap[i]; if (mmapBuffer->m_base != NULL) { mmapMetaData = (struct perf_event_mmap_page*)mmapBuffer->m_base; dataHead = mmapMetaData->data_head; dataTail = mmapMetaData->data_tail; rmb(); dataBuf = (unsigned char*)mmapMetaData + m_pageSize; CA_DBG_PRINTF(3, "dataHead(%u), prevHead(%u)\n", dataHead, mmapBuffer->m_prev); if (dataHead == dataTail) { CA_DBG_PRINTF(3, "No Samples collected so far..dataHead(%d)," " dataTail(%d)\n", dataHead, dataTail); } unsigned int prevHead = mmapBuffer->m_prev; if ( (dataHead - prevHead) <= 0) { CA_DBG_PRINTF(3, "Invalid data.. Current Head(%u), Prev Head(%u).\n", dataHead, prevHead); // dataHead = prevHead; continue; } unsigned long dataSize = dataHead - prevHead; unsigned long tmp = 0; if ( ((prevHead & mmapBuffer->m_mask) + dataSize) != (dataHead & mmapBuffer->m_mask)) { data = &dataBuf[prevHead & mmapBuffer->m_mask]; dataSize = mmapBuffer->m_mask + 1 - (prevHead & mmapBuffer->m_mask); prevHead += dataSize; errno = 0; memcpy(m_pData, data, dataSize); CA_DBG_PRINTF(3, "memcpy.. errno(%d).\n", errno); CA_DBG_PRINTF(3, "1 - dataSize(%u), prevHead(%u)\n", dataSize, prevHead); tmp = dataSize; // printSample(data); } data = &dataBuf[prevHead & mmapBuffer->m_mask]; dataSize = dataHead - prevHead; prevHead += dataSize; CA_DBG_PRINTF(3, "2 - dataSize(%u), prevHead(%u)\n", dataSize, prevHead); errno = 0; memcpy((void*)((uintptr_t)m_pData+tmp), data, dataSize); CA_DBG_PRINTF(3, "memcpy.. errno(%d).\n", errno); m_dataWriter.writePMUSampleData(m_pData, tmp+dataSize); // printSample(data); printSample(m_pData); mmapBuffer->m_prev = prevHead; // TODO: // when the mapping is PROT_WRITE, the data_tail value should be // writen by userspace to reflect the last read data. In this case // the kernel will not overwrite unread data. #if 0 if (! overwrite) { mmapMetaData->data_tail = prevHead; } #endif // 0 } } return S_OK; }