typename basic_otp_mailbox_registry<Alloc, Mutex>::mailbox_ptr basic_otp_mailbox_registry<Alloc, Mutex>::create_mailbox( const atom& a_name, boost::asio::io_service* a_svc) { lock_guard<Mutex> guard(m_lock); if (!a_name.empty()) { typename std::map<atom, mailbox_ptr>::iterator it = m_by_name.find(a_name); if (it != m_by_name.end()) return it->second; // Already registered! } epid<Alloc> l_pid = m_owner_node.create_pid(); mailbox_ptr mbox = new mailbox_type(m_owner_node, l_pid, a_name, a_svc); if (!a_name.empty()) m_by_name.insert(std::pair<atom, mailbox_ptr>(a_name, mbox)); m_by_pid.insert(std::pair<epid<Alloc>, mailbox_ptr>(l_pid, mbox)); return mbox; }
bool basic_otp_mailbox_registry<Alloc, Mutex>::unregister(const atom& a_name) { if (!a_name.empty()) return false; lock_guard<Mutex> guard(m_lock); typename std::map<atom, mailbox_ptr>::iterator it = m_by_name.find(a_name); if (it == m_by_name.end()) return; it->second.name(""); m_by_name.erase(it); }
bool basic_otp_mailbox_registry<Alloc, Mutex>::add(const atom& a_name, mailbox_ptr a_mbox) { if (a_name.empty()) throw err_bad_argument("Empty registering name!"); if (!a_mbox->name().empty()) throw err_bad_argument("Mailbox already registered as", a_mbox->name()); lock_guard<Mutex> guard(m_lock); if (m_by_name.find(a_name) != m_by_name.end()) return false; m_by_name.insert(std::pair<atom, mailbox_ptr>(a_name, a_mbox)); a_mbox->name(a_name); return true; }