- if (ownership->owner != nullptr) {
- XBT_CRITICAL("Unprotected concurent access to %s: %s at %s:%d vs. %s at %s:%d.", objname,
- ownership->owner->get_cname(), ownership->file, ownership->line, self->get_cname(), file, line);
+ if (ownership->owner == self) {
+ ownership->recursive_depth++;
+ return true;
+ } else if (ownership->owner != nullptr) {
+ auto msg = std::string("Unprotected concurent access to ") + objname + ": " + ownership->owner->get_name();
+ if (not xbt_log_no_loc) {
+ msg += simgrid::xbt::string_printf(" at %s:%d", ownership->file, ownership->line);
+ if (ownership->recursive_depth > 1) {
+ msg += simgrid::xbt::string_printf(" (and %d other locations)", ownership->recursive_depth - 1);
+ if (ownership->recursive_depth != 2)
+ msg += "s";
+ }
+ } else {
+ msg += simgrid::xbt::string_printf(" from %d location", ownership->recursive_depth);
+ if (ownership->recursive_depth != 1)
+ msg += "s";
+ }
+ msg += " vs " + self->get_name();
+ if (xbt_log_no_loc)
+ msg += std::string(" (locations hidden because of --log=no_loc).");
+ else
+ msg += simgrid::xbt::string_printf(" at %s:%d.", file, line);
+ XBT_CRITICAL("%s", msg.c_str());