The second example was the reference counter, which is the more important one! The above example you give is just the basic example, while the reference counter shows the bigger problem.
No, the answer for the reference counter problem is simple: cooperation. Just as reminder:
Situation: S -> C -> (1 reference) A -> B
Goal: /-> (1 reference) A S-> C -> (1 reference) B
1. In the start situation A is trusted by B to provide the endpoint to S. Since A could unmap this endpoint everytime.
2. Therefore B can ask A for a new reference. Since A can not provide this service, it asks C and attaches a [1] return endpoint to B in its message.
3. C answers directly to B and maps them a new reference.
A transparent interpose of different endpoints with a single one is otherwise not possible.
This just shows that reintroducing global IDs through the backdoor is ill-advised.
What are the global IDs? We do not have one.
I mean here that if everybody can do a cmp() it is possible to detect, whether two "capabilities" pointing to endpoints, which are interposed e.g. by a monitor, are the same or not.
Bernhard
[1] the endpoint where C send its reply to the RPC