00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #define ACEDIA_REDUCED_ANNOUNCE
00031
00032 #include "actorref.hpp"
00033 #include "acedia.hpp"
00034 #include "actorproxy.hpp"
00035
00036 namespace acedia
00037 {
00038 namespace details
00039 {
00040 class DummyActor : public AbstractActor
00041 {
00042 protected:
00043 virtual void enqueue(const Message&) { }
00044 virtual void linkTo(const ActorRef&) { }
00045 virtual bool backlinkTo(ActorRef &) { return false; }
00046 public:
00047 DummyActor() : AbstractActor(false, true) { }
00048 };
00049 }
00050 }
00051
00052 static acedia::util::Singleton<acedia::details::DummyActor> m_dummyActor;
00053
00054 namespace acedia
00055 {
00056 ActorRef::ActorRef(const ActorRef &other) :
00057 actor(other.actor), m_weak(false)
00058 {
00059 if (isValid()) actor->ref();
00060 else m_weak = true;
00061 }
00062
00063 ActorRef::~ActorRef()
00064 {
00065 if (!m_weak && !actor->deref()) delete actor;
00066 }
00067
00068 ActorRef::ActorRef() throw() :
00069 actor(m_dummyActor.instance()), m_weak(true)
00070 {
00071 }
00072
00073 ActorRef &ActorRef::operator=(const ActorRef &other)
00074 {
00075 if (!m_weak && !actor->deref()) delete actor;
00076 actor = other.actor;
00077 if (isValid())
00078 {
00079 m_weak = false;
00080 other.actor->ref();
00081 }
00082 else
00083 {
00084 m_weak = true;
00085 }
00086 return *this;
00087 }
00088
00089 bool ActorRef::isValid() const
00090 {
00091 return actor != m_dummyActor.instance();
00092 }
00093
00094 boost::uint32_t ActorRef::actorId() const
00095 {
00096 return isValid() ? actor->id() : 0;
00097 }
00098
00099 boost::uint32_t ActorRef::realActorId() const
00100 {
00101 return isFarRef()
00102 ? dynamic_cast<ActorProxy*>(actor)->originalActorId()
00103 : actorId();
00104 }
00105
00106 }