inline void PBFParser::ParseData() { while (true) { _ThreadData *threadData; threadDataQueue->wait_and_pop(threadData); if( NULL==threadData ) { SimpleLogger().Write() << "Parse Data Thread Finished"; threadDataQueue->push(NULL); // Signal end of data for other threads break; } loadBlock(threadData); for(int i = 0, groupSize = threadData->PBFprimitiveBlock.primitivegroup_size(); i < groupSize; ++i) { threadData->currentGroupID = i; loadGroup(threadData); if(threadData->entityTypeIndicator == TypeNode) { parseNode(threadData); } if(threadData->entityTypeIndicator == TypeWay) { parseWay(threadData); } if(threadData->entityTypeIndicator == TypeRelation) { parseRelation(threadData); } if(threadData->entityTypeIndicator == TypeDenseNode) { parseDenseNode(threadData); } } delete threadData; threadData = NULL; } }
inline void PBFParser::ParseData() { tbb::task_scheduler_init init(num_parser_threads); while (true) { ParserThreadData *thread_data; thread_data_queue->wait_and_pop(thread_data); if (nullptr == thread_data) { thread_data_queue->push(nullptr); // Signal end of data for other threads break; } loadBlock(thread_data); int group_size = thread_data->PBFprimitiveBlock.primitivegroup_size(); for (int i = 0; i < group_size; ++i) { thread_data->currentGroupID = i; loadGroup(thread_data); if (thread_data->entityTypeIndicator == TypeNode) { parseNode(thread_data); } if (thread_data->entityTypeIndicator == TypeWay) { parseWay(thread_data); } if (thread_data->entityTypeIndicator == TypeRelation) { parseRelation(thread_data); } if (thread_data->entityTypeIndicator == TypeDenseNode) { parseDenseNode(thread_data); } } delete thread_data; thread_data = nullptr; } }