Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Better warning message for max-depth
[simgrid.git] / src / sthread / ObjectAccess.cpp
index 93224388f0452a881d9c922c0e55a1fda4a602a7..6e38668af81bfe3b6a93ca26c84b643f24db3149 100644 (file)
@@ -11,6 +11,7 @@
 #include "src/kernel/actor/ActorImpl.hpp"
 #include "src/kernel/actor/SimcallObserver.hpp"
 #include "src/sthread/sthread.h"
+#include "xbt/string.hpp"
 
 #include <unordered_map>
 
@@ -34,7 +35,6 @@ public:
   }
   void serialize(std::stringstream& stream) const override;
   std::string to_string() const override;
-  bool is_visible() const override { return true; }
 };
 void ObjectAccessObserver::serialize(std::stringstream& stream) const
 {
@@ -51,7 +51,7 @@ struct ObjectOwner {
   simgrid::kernel::actor::ActorImpl* owner = nullptr;
   const char* file                         = nullptr;
   int line                                 = -1;
-  ObjectOwner(simgrid::kernel::actor::ActorImpl* o) : owner(o) {}
+  explicit ObjectOwner(simgrid::kernel::actor::ActorImpl* o) : owner(o) {}
 };
 
 std::unordered_map<void*, ObjectOwner*> owners;
@@ -66,8 +66,7 @@ static ObjectOwner* get_owner(void* object)
 {
   if (owners.empty())
     std::atexit(clean_owners);
-  auto it = owners.find(object);
-  if (it != owners.end())
+  if (auto it = owners.find(object); it != owners.end())
     return it->second;
   auto* o = new ObjectOwner(nullptr);
   owners.emplace(object, o);
@@ -85,8 +84,15 @@ int sthread_access_begin(void* objaddr, const char* objname, const char* file, i
         XBT_INFO("%s takes %s", self->get_cname(), objname);
         auto* ownership = get_owner(objaddr);
         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);
+          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);
+          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());
           return false;
         }
         ownership->owner = self;
@@ -107,10 +113,11 @@ void sthread_access_end(void* objaddr, const char* objname, const char* file, in
   simgrid::sthread::ObjectAccessObserver observer(self, simgrid::sthread::AccessType::EXIT, objaddr, objname, file,
                                                   line);
   simgrid::kernel::actor::simcall_answered(
-      [self, objaddr, objname, file, line]() -> void {
+      [self, objaddr, objname]() -> void {
         XBT_INFO("%s releases %s", self->get_cname(), objname);
         auto* ownership = get_owner(objaddr);
-        xbt_assert(ownership->owner == self, "safety check failed: I'm not owner of the object I'm releasing.");
+        xbt_assert(ownership->owner == self, "safety check failed: %s is not owner of the object it's releasing.",
+                   self->get_cname());
         ownership->owner = nullptr;
       },
       &observer);