コード例 #1
0
ファイル: main.cpp プロジェクト: Marcelswacha/SuperSample
int main(int argc, char** argv)
{

	std::thread t1([&]{
		std::cout << "Sample" << std::endl; 
		printSample();
	});

	t1.join();

	return 0;
}
コード例 #2
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;
}