qint64 QV4ProfilerAdapter::sendMessages(qint64 until, QList<QByteArray> &messages) { QByteArray message; while (true) { while (!stack.empty() && (data.empty() || stack.top() <= data.front().start)) { if (stack.top() > until) { qint64 memory_next = appendMemoryEvents(until, messages); return memory_next == -1 ? stack.top() : qMin(stack.top(), memory_next); } appendMemoryEvents(stack.top(), messages); QQmlDebugStream d(&message, QIODevice::WriteOnly); d << stack.pop() << RangeEnd << Javascript; messages.append(message); } while (!data.empty() && (stack.empty() || data.front().start < stack.top())) { const QV4::Profiling::FunctionCallProperties &props = data.front(); if (props.start > until) { qint64 memory_next = appendMemoryEvents(until, messages); return memory_next == -1 ? props.start : qMin(props.start, memory_next); } appendMemoryEvents(props.start, messages); QQmlDebugStream d_start(&message, QIODevice::WriteOnly); d_start << props.start << RangeStart << Javascript; messages.push_back(message); message.clear(); QQmlDebugStream d_location(&message, QIODevice::WriteOnly); d_location << props.start << RangeLocation << Javascript << props.file << props.line << props.column; messages.push_back(message); message.clear(); QQmlDebugStream d_data(&message, QIODevice::WriteOnly); d_data << props.start << RangeData << Javascript << props.name; messages.push_back(message); message.clear(); stack.push(props.end); data.pop_front(); } if (stack.empty() && data.empty()) return appendMemoryEvents(until, messages); } }
qint64 QV4ProfilerAdapter::sendMessages(qint64 until, QList<QByteArray> &messages) { QByteArray message; while (true) { while (!stack.isEmpty() && (dataPos == data.length() || stack.top() <= data[dataPos].start)) { if (stack.top() > until) return finalizeMessages(until, messages, stack.top()); appendMemoryEvents(stack.top(), messages); QQmlDebugStream d(&message, QIODevice::WriteOnly); d << stack.pop() << RangeEnd << Javascript; messages.append(message); } while (dataPos != data.length() && (stack.empty() || data[dataPos].start < stack.top())) { const QV4::Profiling::FunctionCallProperties &props = data[dataPos]; if (props.start > until) return finalizeMessages(until, messages, props.start); appendMemoryEvents(props.start, messages); QQmlDebugStream d_start(&message, QIODevice::WriteOnly); d_start << props.start << RangeStart << Javascript; messages.push_back(message); message.clear(); QQmlDebugStream d_location(&message, QIODevice::WriteOnly); d_location << props.start << RangeLocation << Javascript << props.file << props.line << props.column; messages.push_back(message); message.clear(); QQmlDebugStream d_data(&message, QIODevice::WriteOnly); d_data << props.start << RangeData << Javascript << props.name; messages.push_back(message); message.clear(); stack.push(props.end); ++dataPos; } if (stack.empty() && dataPos == data.length()) return finalizeMessages(until, messages, -1); } }
Data::Data(char const *filename, int bootSeed, bool const parallel) : d_cur(NONE), d_bootSeed(bootSeed) { if (parallel) { int mpirank; MPI_Comm_rank(MPI_COMM_WORLD, &mpirank); // Broken LUSTRE forces us to use POSIX, then broadcast unsigned long int filesize = 0; char *buffer; // Detect if the data file even exists (otherwise things crash in a nasty way) size_t error = 0; if (mpirank == 0) { struct stat sbuf; if (stat(filename, &sbuf)) { std::cerr << "Data file appears to be non-existent!" << std::endl; error = 1; } } MPI_Bcast(&error, 1, MPI_UNSIGNED_LONG, 0, MPI_COMM_WORLD); if (error) { MPI_Finalize(); exit(1); } if (mpirank == 0) { std::ifstream instream(filename); instream.seekg(0, std::ios::end); filesize = instream.tellg(); instream.seekg(0, std::ios::beg); MPI_Bcast(&filesize, 1, MPI_UNSIGNED_LONG, 0, MPI_COMM_WORLD); buffer = new char[filesize + 1]; // To avoid weirdness, assign a little extra memory instream.read(buffer, filesize); instream.close(); buffer[filesize] = '\0'; } else { MPI_Bcast(&filesize, 1, MPI_UNSIGNED_LONG, 0, MPI_COMM_WORLD); buffer = new char[filesize + 1]; // To avoid weirdness, assign a little extra memory } MPI_Bcast(buffer, filesize, MPI_CHAR, 0, MPI_COMM_WORLD); // Now buffer should be equal for everybody -- we can continue as before std::istringstream input(buffer + 1); // Skip comment # input >> d_nSamp >> d_minEv >> d_maxEv; d_data.resize(d_nSamp, d_maxEv - d_minEv); // Assuming minEv < 0 and the 0 is not included! for (size_t row = 0; row < d_nSamp; ++row) for (size_t col = 0; col < (d_maxEv - d_minEv); ++col) input >> d_data(row, col); delete[] buffer; } else {
int main() { std::cout << "Lets start" << std::endl; struct settings_t settings; try { settings = ConfigReader::read_settings(); } catch (std::exception& e) { std::cout << "Config file is incorrect: " << e.what() <<std::endl; return 0; } std::ifstream v_data(settings.v_data_file); std::ifstream d_data(settings.d_data_file); std::ifstream j_data(settings.j_data_file); std::ofstream output(settings.output_file); std::set<std::string> uniq_reads; std::map<std::string, Alignment> v_reads, d_reads, j_reads; std::cout << "Reading V data..." << std::endl; getMapForFile(v_data, v_reads, uniq_reads); std::cout << "Done.\nReading D data..." << std::endl; getMapForFile(d_data, d_reads, uniq_reads); std::cout << "Done.\nReading J data..." << std::endl; getMapForFile(j_data, j_reads, uniq_reads); std::cout << "Done." << std::endl; v_data.close(); d_data.close(); j_data.close(); std::cout << "Start processing..." << std::endl; int counter = 0; for (auto it = uniq_reads.begin(); it != uniq_reads.end(); ++it) { output << *it << "\t"; auto iter = v_reads.find(*it); if (v_reads.end() == iter) { output << "-\t-\t"; } else { output << iter->second.getReadBegin() << "\t" << iter->second.getReadEnd() << "\t"; } iter = d_reads.find(*it); if (d_reads.end() == iter) { output << "-\t-\t"; } else { output << iter->second.getReadBegin() << "\t" << iter->second.getReadEnd() << "\t"; } iter = j_reads.find(*it); if (j_reads.end() == iter) { output << "-\t-\t"; } else { output << iter->second.getReadBegin() << "\t" << iter->second.getReadEnd() << "\t"; } output << std::endl; if (++counter % 100) { std::cout << counter << " reads of " << uniq_reads.size() << " processed\r"; } } output.close(); std::cout << std::endl << "Done" << std::endl; return 0; }