From defd8a66eade4cb11960cf6de2b45c2f42ec3388 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Wed, 28 Jul 2010 15:17:30 -0700 Subject: Rename rust_proxy_delegate to maybe_proxy, flesh out logic in it. Add strong-ref distinction on rust_proxy. --- src/rt/rust_proxy.h | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) (limited to 'src/rt/rust_proxy.h') diff --git a/src/rt/rust_proxy.h b/src/rt/rust_proxy.h index e2fa5e00..bf12e1d5 100644 --- a/src/rt/rust_proxy.h +++ b/src/rt/rust_proxy.h @@ -1,30 +1,55 @@ +#ifndef RUST_PROXY_H +#define RUST_PROXY_H + /** * A proxy object is a wrapper around other Rust objects. One use of the proxy * object is to mitigate access between tasks in different thread domains. */ -#ifndef RUST_PROXY_H -#define RUST_PROXY_H - +template struct rust_proxy; +/** + * The base class of all objects that may delegate. + */ template struct -rust_proxy_delegate : public rc_base { +maybe_proxy : public rc_base, public rust_cond { protected: T *_delegate; public: - rust_proxy_delegate(T * delegate) : _delegate(delegate) { + maybe_proxy(T * delegate) : _delegate(delegate) { + + } + T *delegate() { + return _delegate; + } + bool is_proxy() { + return _delegate != this; + } + rust_proxy *as_proxy() { + return (rust_proxy *) this; + } + T *as_delegate() { + I(_delegate->get_dom(), !is_proxy()); + return (T *) this; } - T *delegate() { return _delegate; } }; +/** + * A proxy object that delegates to another. + */ template struct -rust_proxy : public rust_proxy_delegate, +rust_proxy : public maybe_proxy, public dom_owned > { +private: + bool _strong; public: rust_dom *dom; - rust_proxy(rust_dom *dom, T *delegate) : - rust_proxy_delegate (delegate), - dom(dom) { - delegate->ref(); + rust_proxy(rust_dom *dom, T *delegate, bool strong) : + maybe_proxy (delegate), _strong(strong), dom(dom) { + this->dom->log(rust_log::COMM, + "new proxy: 0x%" PRIxPTR " => 0x%" PRIxPTR, this, delegate); + if (strong) { + delegate->ref(); + } } }; -- cgit v1.2.3