diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/publisher/trex_publisher.h | 3 | ||||
-rw-r--r-- | src/stateless/cp/trex_stateless.cpp | 2 | ||||
-rw-r--r-- | src/stateless/cp/trex_stateless_port.cpp | 39 | ||||
-rw-r--r-- | src/stateless/cp/trex_stateless_port.h | 10 |
4 files changed, 35 insertions, 19 deletions
diff --git a/src/publisher/trex_publisher.h b/src/publisher/trex_publisher.h index f086babb..f8843758 100644 --- a/src/publisher/trex_publisher.h +++ b/src/publisher/trex_publisher.h @@ -46,7 +46,8 @@ public: EVENT_PORT_PAUSED = 2, EVENT_PORT_RESUMED = 3, EVENT_PORT_FINISHED_TX = 4, - EVENT_PORT_FORCE_ACQUIRED = 5, + EVENT_PORT_ACQUIRED = 5, + EVENT_PORT_RELEASED = 6, EVENT_SERVER_STOPPED = 100, diff --git a/src/stateless/cp/trex_stateless.cpp b/src/stateless/cp/trex_stateless.cpp index c86c5f65..5bbe9faf 100644 --- a/src/stateless/cp/trex_stateless.cpp +++ b/src/stateless/cp/trex_stateless.cpp @@ -54,7 +54,7 @@ TrexStateless::TrexStateless(const TrexStatelessCfg &cfg) { m_publisher = cfg.m_publisher; /* API core version */ - m_api_classes[APIClass::API_CLASS_TYPE_CORE].init(APIClass::API_CLASS_TYPE_CORE, 1, 1); + m_api_classes[APIClass::API_CLASS_TYPE_CORE].init(APIClass::API_CLASS_TYPE_CORE, 1, 2); } /** diff --git a/src/stateless/cp/trex_stateless_port.cpp b/src/stateless/cp/trex_stateless_port.cpp index 605995ae..90142d9b 100644 --- a/src/stateless/cp/trex_stateless_port.cpp +++ b/src/stateless/cp/trex_stateless_port.cpp @@ -119,23 +119,10 @@ TrexStatelessPort::~TrexStatelessPort() { void TrexStatelessPort::acquire(const std::string &user, uint32_t session_id, bool force) { - /* if port is free - just take it */ - if (get_owner().is_free()) { - get_owner().own(user); - return; - } - - if (force) { - get_owner().own(user); - - /* inform the other client of the steal... */ - Json::Value data; + bool used_force = !get_owner().is_free() && force; - data["port_id"] = m_port_id; - data["who"] = user; - data["session_id"] = session_id; - - get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_FORCE_ACQUIRED, data); + if (get_owner().is_free() || force) { + get_owner().own(user, session_id); } else { /* not same user or session id and not force - report error */ @@ -146,11 +133,30 @@ TrexStatelessPort::acquire(const std::string &user, uint32_t session_id, bool fo } } + Json::Value data; + + data["port_id"] = m_port_id; + data["who"] = user; + data["session_id"] = session_id; + data["force"] = used_force; + + get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_ACQUIRED, data); + } void TrexStatelessPort::release(void) { + + + Json::Value data; + + data["port_id"] = m_port_id; + data["who"] = get_owner().get_name(); + data["session_id"] = get_owner().get_session_id(); + get_owner().release(); + + get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_RELEASED, data); } /** @@ -776,6 +782,7 @@ TrexStatelessPort::remove_and_delete_all_streams() { TrexPortOwner::TrexPortOwner() { m_is_free = true; + m_session_id = 0; /* for handlers random generation */ m_seed = time(NULL); diff --git a/src/stateless/cp/trex_stateless_port.h b/src/stateless/cp/trex_stateless_port.h index 2167e735..520940d8 100644 --- a/src/stateless/cp/trex_stateless_port.h +++ b/src/stateless/cp/trex_stateless_port.h @@ -54,16 +54,18 @@ public: m_is_free = true; m_owner_name = ""; m_handler = ""; + m_session_id = 0; } bool is_owned_by(const std::string &user) { return ( !m_is_free && (m_owner_name == user) ); } - void own(const std::string &owner_name) { + void own(const std::string &owner_name, uint32_t session_id) { /* save user data */ m_owner_name = owner_name; + m_session_id = session_id; /* internal data */ m_handler = utl_generate_random_str(m_seed, 8); @@ -82,6 +84,9 @@ public: return (!m_is_free ? m_handler : g_unowned_handler); } + const uint32_t get_session_id() { + return m_session_id; + } private: @@ -91,6 +96,9 @@ private: /* user provided info */ std::string m_owner_name; + /* which session of the user holds this port*/ + uint32_t m_session_id; + /* handler genereated internally */ std::string m_handler; |