- simgrid::xbt::ReplayAction* action;
-
- std::queue<simgrid::xbt::ReplayAction*>* myqueue =
- (std::queue<simgrid::xbt::ReplayAction*>*)xbt_dict_get_or_null(xbt_action_queues, name);
- if (myqueue == nullptr || myqueue->empty()) { // nothing stored for me. Read the file further
- if (simgrid::xbt::action_fs == nullptr) { // File closed now. There's nothing more to read. I'm out of here
- goto todo_done;
- }
- // Read lines until I reach something for me (which breaks in loop body) or end of file reached
- while (!simgrid::xbt::action_fs->eof()) {
- std::string action_line;
- simgrid::xbt::read_and_trim_line(simgrid::xbt::action_fs, &action_line);
- if (action_line.length() > 0 && action_line.find("#") == std::string::npos) {
- /* we cannot split in place here because we parse&store several lines for the colleagues... */
- action = new simgrid::xbt::ReplayAction();
- boost::split(*action, action_line, boost::is_any_of(" \t"), boost::token_compress_on);
-
- // if it's for me, I'm done
- std::string evtname = action->front();
- if (evtname.compare(name) == 0) {
- return action;
- } else {
- // Else, I have to store it for the relevant colleague
- std::queue<simgrid::xbt::ReplayAction*>* otherqueue =
- (std::queue<simgrid::xbt::ReplayAction*>*)xbt_dict_get_or_null(xbt_action_queues, evtname.c_str());
- if (otherqueue == nullptr) { // Damn. Create the queue of that guy
- otherqueue = new std::queue<simgrid::xbt::ReplayAction*>();
- xbt_dict_set(xbt_action_queues, evtname.c_str(), otherqueue, nullptr);
- }
- otherqueue->push(action);
- }
- }
- }
- // end of file reached while searching in vain for more work
- } else {
- // Get something from my queue and return it
- action = myqueue->front();
- myqueue->pop();
- return action;
- }