Problem with setting up namespaces

Johannes Schlatow <[email protected]>
Newsgroups gmane.comp.micro-kernel.l4.devel
Message-ID <20130717220814.08488cc5@johanness-latitude>
Hi,

I was just trying to set up a simple application that uses L4Re namespaces.
I therefore took the clntsrv example and modified it as shown in the diff below with
the result that the server blocks on the bind_thread() call. Am I missing something?

Cheers
 Johannes

diff --git a/src/l4/pkg/examples/clntsrv/clntsrv.cfg b/src/l4/pkg/examples/clntsrv/clntsrv.cfg
index bb2ae50..dd7dfa5 100644
--- a/src/l4/pkg/examples/clntsrv/clntsrv.cfg
+++ b/src/l4/pkg/examples/clntsrv/clntsrv.cfg
@@ -9,13 +9,16 @@ local ld = L4.default_loader;
 -- Channel for the two programs to talk to each other.
 local calc_server = ld:new_channel();
 
+local server_ns   = ld:create_namespace({ calc_server = calc_server:svr()});
+local client_ns   = ld:create_namespace({ calc_server = calc_server});
+
 -- The server program, getting the channel in server mode.
-ld:start({ caps = { calc_server = calc_server:svr() },
+ld:start({ caps = { namespace = server_ns },
            log = { "server", "blue" } },
 	 "rom/ex_clntsrv-server");
 
 -- The client program, getting the 'calc_server' channel to be able to talk
 -- to the server. The client will be started with a green log output.
-ld:start({ caps = { calc_server = calc_server },
+ld:start({ caps = { namespace = client_ns },
            log = { "client", "green" } },
          "rom/ex_clntsrv-client");
diff --git a/src/l4/pkg/examples/clntsrv/server.cc b/src/l4/pkg/examples/clntsrv/server.cc
index 2f2e3fc..9c4c0b9 100644
--- a/src/l4/pkg/examples/clntsrv/server.cc
+++ b/src/l4/pkg/examples/clntsrv/server.cc
@@ -12,6 +12,7 @@
 #include <l4/re/util/cap_alloc>
 #include <l4/re/util/object_registry>
 #include <l4/cxx/ipc_server>
+#include <l4/re/namespace>
 
 #include "shared.h"
 
@@ -60,12 +61,34 @@ main()
 {
   static Calculation_server calc;
 
-  // Register calculation server
-  if (!server.registry()->register_obj(&calc, "calc_server").is_valid())
-    {
-      printf("Could not register my service, is there a 'calc_server' in the caps table?\n");
-      return 1;
-    }
+  L4::Cap<L4Re::Namespace> ns = L4Re::Env::env()->get_cap<L4Re::Namespace>("namespace");
+  if (!ns.is_valid()) {
+    printf("Could not get namespace cap from cap table.\n");
+    return 1;
+  }
+  L4::Cap<L4::Ipc_gate> calc_server = L4Re::Util::cap_alloc.alloc<L4::Ipc_gate>();
+
+  if (ns->query("calc_server", calc_server) != 0) {
+    printf("Could not get 'calc_server' cap from namespace\n");
+    return 1;
+  }
+
+  if (!calc_server.is_valid()) {
+    printf("calc_server cap is invalid\n");
+    return 1;
+  }
+
+  l4_umword_t id = l4_umword_t(0xcaffee);
+  L4::Cap<L4::Thread> tcap = L4Re::Env::env()->main_thread();
+
+  printf("bind_thread()...\n");
+  int err = l4_error(calc_server->bind_thread(tcap, id));
+  if (err < 0) {
+    printf("failed\n");
+    return 1;
+  }
+
+  printf("OK\n");
 
   printf("Welcome to the calculation server!\n"
          "I can do substractions and negations.\n");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.