summaryrefslogtreecommitdiff
path: root/src/components/application_manager/include/application_manager/request_info.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/include/application_manager/request_info.h')
-rw-r--r--src/components/application_manager/include/application_manager/request_info.h322
1 files changed, 221 insertions, 101 deletions
diff --git a/src/components/application_manager/include/application_manager/request_info.h b/src/components/application_manager/include/application_manager/request_info.h
index b1409488f..3b48d78d4 100644
--- a/src/components/application_manager/include/application_manager/request_info.h
+++ b/src/components/application_manager/include/application_manager/request_info.h
@@ -1,34 +1,34 @@
-/**
-* \file request_info.h
-* \brief request information structure header file.
-*
-* Copyright (c) 2014, Ford Motor Company
-* All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are met:
-*
-* Redistributions of source code must retain the above copyright notice, this
-* list of conditions and the following disclaimer.
-*
-* Redistributions in binary form must reproduce the above copyright notice,
-* this list of conditions and the following
-* disclaimer in the documentation and/or other materials provided with the
-* distribution.
-*
-* Neither the name of the Ford Motor Company nor the names of its contributors
-* may be used to endorse or promote products derived from this software
-* without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+/*
+ * \file request_info.h
+ * \brief request information structure header file.
+ *
+ * Copyright (c) 2014, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@@ -37,6 +37,7 @@
#define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_REQUEST_INFO_H_
#include <stdint.h>
+#include <set>
#include "application_manager/commands/command_request_impl.h"
#include "commands/hmi/request_to_hmi.h"
@@ -52,56 +53,48 @@ namespace request_controller {
*
*/
typedef utils::SharedPtr<commands::Command> RequestPtr;
- typedef utils::SharedPtr<commands::CommandRequestImpl> MobileRequestPtr;
struct RequestInfo {
- RequestInfo(const uint64_t timeout_sec)
- : timeout_sec_(timeout_sec) {
- start_time_ = date_time::DateTime::getCurrentTime();
- updateEndTime();
- }
+ enum RequestType {MobileRequest, HMIRequest};
- RequestInfo(const TimevalStruct& start_time,const uint64_t timeout_sec)
- : start_time_(start_time),
+ RequestInfo() {}
+ virtual ~RequestInfo() {}
+
+ RequestInfo(RequestPtr request,
+ const RequestType requst_type,
+ const uint64_t timeout_sec)
+ : request_(request),
timeout_sec_(timeout_sec) {
+ start_time_ = date_time::DateTime::getCurrentTime();
updateEndTime();
- }
+ requst_type_ = requst_type;
+ }
- virtual ~RequestInfo(){}
+ RequestInfo(RequestPtr request, const RequestType requst_type,
+ const TimevalStruct& start_time, const uint64_t timeout_sec);
- virtual uint32_t requestId() = 0;
- virtual commands::Command* request() = 0;
+ void updateEndTime();
- void updateEndTime() {
- end_time_ = date_time::DateTime::getCurrentTime();
- end_time_.tv_sec += timeout_sec_;
+ void updateTimeOut(const uint64_t& timeout_sec);
- // possible delay during IPC
- const uint32_t hmi_delay_sec = 1;
- end_time_.tv_sec += hmi_delay_sec;
- }
-
- void updateTimeOut(const uint64_t& timeout_sec) {
- timeout_sec_ = timeout_sec;
- updateEndTime();
- }
-
- bool isExpired() {
- if ( date_time::GREATER ==
- date_time::DateTime::compareTime(end_time_, date_time::DateTime::getCurrentTime()) ) {
- return false;
- }
- return true;
- }
+ bool isExpired();
TimevalStruct start_time() {
return start_time_;
}
+ void update_start_time(TimevalStruct start_time) {
+ start_time_ = start_time;
+ }
+
uint64_t timeout_sec() {
return timeout_sec_;
}
+ void set_timeout_sec(uint64_t timeout) {
+ timeout_sec_ = timeout;
+ }
+
TimevalStruct end_time() {
return end_time_;
}
@@ -114,65 +107,194 @@ namespace request_controller {
return hmi_level_;
}
+ void set_hmi_level(const mobile_apis::HMILevel::eType& level) {
+ hmi_level_ = level;
+ }
+
+ RequestType requst_type() const {
+ return requst_type_;
+ }
+
+ uint32_t requestId() {
+ return correlation_id_;
+ }
+
+ commands::Command* request() {
+ return request_.get();
+ }
+ uint64_t hash();
+ static uint64_t GenerateHash(uint32_t var1, uint32_t var2);
+ static uint32_t HmiConnectoinKey;
protected:
+ RequestPtr request_;
TimevalStruct start_time_;
uint64_t timeout_sec_;
TimevalStruct end_time_;
uint32_t app_id_;
mobile_apis::HMILevel::eType hmi_level_;
+ RequestType requst_type_;
+ uint32_t correlation_id_;
};
typedef utils::SharedPtr<RequestInfo> RequestInfoPtr;
- struct RequestInfoComparator {
- bool operator() (const RequestInfoPtr lhs,
- const RequestInfoPtr rhs) const {
- date_time::TimeCompare compare_result =
- date_time::DateTime::compareTime(lhs->end_time(), rhs->end_time());
-
- return compare_result == date_time::LESS;
- }
+ struct MobileRequestInfo: public RequestInfo {
+ MobileRequestInfo(RequestPtr request,
+ const uint64_t timeout_sec);
+ MobileRequestInfo(RequestPtr request,
+ const TimevalStruct& start_time,
+ const uint64_t timeout_sec);
};
- typedef std::set<RequestInfoPtr,RequestInfoComparator> RequestInfoSet;
-
struct HMIRequestInfo: public RequestInfo {
HMIRequestInfo(RequestPtr request, const uint64_t timeout_sec);
HMIRequestInfo(RequestPtr request, const TimevalStruct& start_time,
const uint64_t timeout_sec);
+ };
- RequestPtr request_;
- uint32_t correlation_id_;
-
- virtual uint32_t requestId() {
- return correlation_id_;
- }
-
- virtual commands::Command* request() {
- return request_.get();
- }
+ // Request info, for searching in request info set by log_n time
+ // Returns correct hash by app_id and corr_id
+ struct FakeRequestInfo :public RequestInfo {
+ FakeRequestInfo(uint32_t app_id, uint32_t correaltion_id);
};
- struct MobileRequestInfo: public RequestInfo {
- MobileRequestInfo(RequestPtr request,
- const uint64_t timeout_sec);
+ struct RequestInfoTimeComparator {
+ bool operator() (const RequestInfoPtr lhs,
+ const RequestInfoPtr rhs) const;
+ };
- MobileRequestInfo(RequestPtr request,
- const TimevalStruct& start_time,
- const uint64_t timeout_sec);
+ struct RequestInfoHashComparator {
+ bool operator() (const RequestInfoPtr lhs,
+ const RequestInfoPtr rhs) const;
+ };
- RequestPtr request_;
- uint32_t mobile_correlation_id_;
- virtual uint32_t requestId() {
- return mobile_correlation_id_;
- }
+ typedef std::set<RequestInfoPtr, RequestInfoTimeComparator> TimeSortedRequestInfoSet;
+ typedef std::set<RequestInfoPtr, RequestInfoHashComparator> HashSortedRequestInfoSet;
- virtual commands::Command* request() {
- return request_.get();
- }
+ /*
+ * @brief RequestInfoSet provides uniue requests bu corralation_id and app_id
+ *
+ */
+ class RequestInfoSet {
+ public:
+ /*
+ * @brief Add requests into colletion by log(n) time
+ * @param request_info - request to add
+ * @return false is request with the same app_id and correlation_id exist
+ */
+ bool Add(RequestInfoPtr request_info);
+
+ /*
+ * @brief Find requests int colletion by log(n) time
+ * @param connection_key - connection_key of request
+ * @param correlation_id - correlation_id of request
+ * @return founded request or shared_ptr with NULL
+ */
+ RequestInfoPtr Find(const uint32_t connection_key,
+ const uint32_t correlation_id);
+
+ /*
+ * @brief Get request with smalest end_time_
+ * @return founded request or shared_ptr with NULL
+ */
+ RequestInfoPtr Front();
+
+ /*
+ * @brief Get request with smalest end_time_ != 0
+ * @return founded request or shared_ptr with NULL
+ */
+ RequestInfoPtr FrontWithNotNullTimeout();
+
+ /*
+ * @brief Erase request from colletion by log(n) time
+ * @param request_info - request to erase
+ * @return true if Erase succes, otherwise return false
+ */
+ bool RemoveRequest(const RequestInfoPtr request_info);
+
+ /*
+ * @brief Erase request from colletion by connection_key
+ * @param connection_key - connection_key of requests to erase
+ * @return count of erased requests
+ */
+ uint32_t RemoveByConnectionKey(uint32_t connection_key);
+
+ /*
+ * @brief Erase all mobile requests from controller
+ * @return count of erased requests
+ */
+ uint32_t RemoveMobileRequests();
+
+ /*
+ * @return count of requestd in collections
+ */
+ const size_t Size();
+
+ /**
+ * @brief Check if this app is able to add new requests,
+ * or limits was exceeded
+ * @param app_id - application id
+ * @param app_time_scale - time scale (seconds)
+ * @param max_request_per_time_scale - maximum count of request
+ * that should be allowed for app_time_scale seconds
+ * @return True if new request could be added, false otherwise
+ */
+ bool CheckTimeScaleMaxRequest(uint32_t app_id,
+ uint32_t app_time_scale,
+ uint32_t max_request_per_time_scale);
+
+ /**
+ * @brief Check if this app is able to add new requests
+ * in current hmi_level, or limits was exceeded
+ * @param hmi_level - hmi level
+ * @param app_id - application id
+ * @param app_time_scale - time scale (seconds)
+ * @param max_request_per_time_scale - maximum count of request
+ * that should be allowed for app_time_scale seconds
+ * @return True if new request could be added, false otherwise
+ */
+ bool CheckHMILevelTimeScaleMaxRequest(mobile_apis::HMILevel::eType hmi_level,
+ uint32_t app_id,
+ uint32_t app_time_scale,
+ uint32_t max_request_per_time_scale);
+ private:
+ /*
+ * @brief Comparator of connection key for std::find_if function
+ */
+ struct AppIdCompararator {
+ enum CompareType {Equal, NotEqual};
+ AppIdCompararator(CompareType compare_type, uint32_t app_id):
+ app_id_(app_id),
+ compare_type_(compare_type) {}
+ bool operator()(const RequestInfoPtr value_compare) const;
+
+ private:
+ uint32_t app_id_;
+ CompareType compare_type_;
+ };
+
+ bool Erase(const RequestInfoPtr request_info);
+
+ /*
+ * @brief Erase requests from collection if filter allows
+ * @param filter - filtering predicate
+ * @return count of erased requests
+ */
+ uint32_t RemoveRequests(const RequestInfoSet::AppIdCompararator& filter);
+
+ /*
+ * @brief Debug function, will raise assert if set sizes are noit equal
+ */
+ inline void CheckSetSizes();
+ TimeSortedRequestInfoSet time_sorted_pending_requests_;
+ HashSortedRequestInfoSet hash_sorted_pending_requests_;
+
+ // the lock caled this_lock_, since the class represent collection by itself.
+ sync_primitives::Lock this_lock_;
};
+
/**
* @brief Structure used in std algorithms to determine amount of request
* during time scale
@@ -186,7 +308,6 @@ namespace request_controller {
app_id_(app_id) {}
bool operator()(RequestInfoPtr setEntry) {
-
if (!setEntry.valid()) {
return false;
}
@@ -247,6 +368,7 @@ namespace request_controller {
return true;
}
+
private:
TimevalStruct start_;
TimevalStruct end_;
@@ -254,9 +376,7 @@ namespace request_controller {
mobile_apis::HMILevel::eType hmi_level_;
};
-
-
} // namespace request_controller
-} // namespace application_manager
+} // namespace application_manager
#endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_REQUEST_INFO_H_