dlm-loader-fix.patch
author Hajime Tazaki <tazaki@nict.go.jp>
Wed, 11 Apr 2012 11:21:19 +0900
changeset 18 1811be862c59
parent 11 ce3a1f87be3d
permissions -rw-r--r--
update test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
     1
diff -r 275f1c8a7f1d model/dlm-loader-factory.cc
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
     2
--- a/model/dlm-loader-factory.cc	Thu Mar 29 13:54:58 2012 +0900
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
     3
+++ b/model/dlm-loader-factory.cc	Thu Mar 29 13:55:03 2012 +0900
1
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
     4
@@ -3,6 +3,7 @@
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
     5
 #include "ns3/fatal-error.h"
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
     6
 #include <list>
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
     7
 #include <dlfcn.h>
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
     8
+#include <sys/stat.h>
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
     9
 
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    10
 NS_LOG_COMPONENT_DEFINE ("DlmLoaderFactory");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    11
 
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    12
@@ -34,6 +35,10 @@
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    13
   virtual void Unload (void *module);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    14
   virtual void *Lookup (void *module, std::string symbol);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    15
 private:
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    16
+  bool SearchFile (std::string filename, std::string *fullname) const;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    17
+  std::list<std::string> GetSearchDirectories (void) const;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    18
+  std::list<std::string> Split (std::string input, std::string sep) const;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    19
+  bool Exists (std::string filename) const;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    20
   Lmid_t m_lmid;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    21
   std::list<void *> m_loaded;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    22
 };
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    23
@@ -83,11 +88,98 @@
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    24
       ::dlclose (*i);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    25
     }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    26
 }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    27
+std::list<std::string>
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    28
+DlmLoader::Split (std::string input, std::string sep) const
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    29
+{
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    30
+  NS_LOG_FUNCTION (this << input << sep);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    31
+  std::list<std::string> retval;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    32
+  std::string::size_type cur = 0, next;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    33
+  while (true)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    34
+    {
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    35
+      next = input.find (sep, cur);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    36
+      if (next == cur)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    37
+	{
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    38
+	  cur ++;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    39
+	  continue;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    40
+	} 
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    41
+      else if (next == std::string::npos)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    42
+	{
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    43
+	  if (input.size () != cur)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    44
+	    {
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    45
+	      retval.push_back (input.substr (cur, input.size () - cur));
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    46
+	    }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    47
+	  break;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    48
+	}
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    49
+      retval.push_back (input.substr (cur, next - cur));
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    50
+      cur = next + 1;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    51
+    }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    52
+  return retval;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    53
+}
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    54
+std::list<std::string>
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    55
+DlmLoader::GetSearchDirectories (void) const
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    56
+{
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    57
+  NS_LOG_FUNCTION (this);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    58
+  std::list<std::string> directories;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    59
+  char *ldLibraryPath = getenv ("LD_LIBRARY_PATH");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    60
+  if (ldLibraryPath != 0)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    61
+    {
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    62
+      std::list<std::string> tmp = Split (ldLibraryPath, ":");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    63
+      directories.insert (directories.end (), 
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    64
+			  tmp.begin (),
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    65
+			  tmp.end ());
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    66
+    }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    67
+  char *path = getenv ("PATH");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    68
+  if (path != 0)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    69
+    {
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    70
+      std::list<std::string> tmp = Split (path, ":");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    71
+      directories.insert (directories.end (), 
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    72
+			  tmp.begin (),
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    73
+			  tmp.end ());
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    74
+    }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    75
+  directories.push_back ("/lib");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    76
+  directories.push_back ("/usr/lib");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    77
+  directories.push_back (".");
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    78
+  return directories;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    79
+}
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    80
+bool
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    81
+DlmLoader::Exists (std::string filename) const
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    82
+{
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    83
+  //NS_LOG_FUNCTION (this << filename);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    84
+  struct stat st;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    85
+  int retval = ::stat (filename.c_str (), &st);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    86
+  return retval == 0;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    87
+}
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    88
+bool
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    89
+DlmLoader::SearchFile (std::string filename, std::string *fullname) const
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    90
+{
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    91
+  NS_LOG_FUNCTION (this << filename);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    92
+  if (Exists (filename))
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    93
+    {
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    94
+      *fullname = filename;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    95
+      NS_LOG_DEBUG ("Found: " << filename << " as " << *fullname);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    96
+      return true;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    97
+    }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    98
+  std::list<std::string> dirs = GetSearchDirectories ();
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
    99
+  for (std::list<std::string>::const_iterator i = dirs.begin (); i != dirs.end (); i++)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   100
+    {
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   101
+      if (Exists (*i + "/" + filename))
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   102
+	{
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   103
+	  *fullname = *i + "/" + filename;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   104
+	  NS_LOG_DEBUG ("Found: " << filename << " as " << *fullname);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   105
+	  return true;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   106
+	}
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   107
+    }
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   108
+  return false;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   109
+}
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   110
 void *
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   111
 DlmLoader::Load (std::string filename, int flag)
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   112
 {
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   113
+  std::string fullname;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   114
+  bool found;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   115
   NS_LOG_FUNCTION (this << filename << flag);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   116
-  void *module = dlmopen (m_lmid, filename.c_str (), flag);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   117
+  found = SearchFile (filename, &fullname);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   118
+  NS_ASSERT (found);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   119
+  void *module = dlmopen (m_lmid, fullname.c_str (), flag);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   120
   m_loaded.push_back (module);
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   121
   return module;
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   122
 }
11
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
   123
diff -r 275f1c8a7f1d wscript
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
   124
--- a/wscript	Thu Mar 29 13:54:58 2012 +0900
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
   125
+++ b/wscript	Thu Mar 29 13:55:03 2012 +0900
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
   126
@@ -36,6 +36,8 @@
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
   127
     conf.check(header_name='dirent.h', define_name='HAVE_DIRENT_H', mandatory=False)
1
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   128
 
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   129
     conf.env.append_value('LINKFLAGS', '-pthread')
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   130
+    conf.env.append_value('LINKFLAGS', '-Wl,--dynamic-linker=' +
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   131
+                             os.path.abspath ('../build/lib/ldso'))
8604b19f35e5 update for USENIX ATC 2012
Hajime Tazaki <tazaki@nict.go.jp>
parents:
diff changeset
   132
     conf.check (lib='dl', mandatory = True)
11
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
   133
 
ce3a1f87be3d merge with HEAD
Hajime Tazaki <tazaki@nict.go.jp>
parents: 5
diff changeset
   134
     vg_h = conf.check(header_name='valgrind/valgrind.h', mandatory=False)