On 1.08.2018 21:44, Steven Rostedt wrote:
+ +/** + * @brief In a given bin, start from the front end of the bin and go towards + * the back end, searching for an entry satisfying the Matching + * condition defined by a Matching condition function. + * @param histo: Input location for the model descriptor. + * @param bin: Bin id. + * @param vis_only: If true, a visible entry is requested. + * @param func: Matching condition function. + * @param val: Matching condition value, used by the Matching condition + * function. + * @param index: Optional output location for the index of the requested + * entry inside the array. + * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. + */ +const struct kshark_entry * +ksmodel_get_entry_front(struct kshark_trace_histo *histo, + int bin, bool vis_only, + matching_condition_func func, int val, + ssize_t *index) +{ + struct kshark_entry_request *req; + const struct kshark_entry *entry; + + if (index) + *index = KS_EMPTY_BIN; + + /* Set the position at the beginning of the bin and go forward. */ + req = ksmodel_entry_front_request_alloc(histo, bin, vis_only, + func, val); + if (!req) + return NULL; + + entry = kshark_get_entry_front(req, histo->data, index); + free(req); + + return entry; +}We could save on the allocation if we were to create the following: void kshark_entry_request_set(struct kshark_entry_request *req, size_t first, size_t n, matching_condition_func cond, int val, bool vis_only, int vis_mask) { req->first = first; req->n = n; req->cond = cond; req->val = val; req->vis_only = vis_only; req->vis_mask = vis_mask; } bool ksmodel_entry_front_request_set(struct kshark_trace_histo *histo, struct kshark_entry_request *req, int bin, bool vis_only, matching_condition_func func, int val) { size_t first, n; /* Get the number of entries in this bin. */ n = ksmodel_bin_count(histo, bin); if (!n) return false; first = ksmodel_first_index_at_bin(histo, bin); kshark_entry_request_set(first, n, func, val, vis_only, KS_GRAPH_VIEW_FILTER_MASK); return true; } const struct kshark_entry * ksmodel_get_entry_front(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int val, ssize_t *index) { struct kshark_entry_request req; const struct kshark_entry *entry; bool ret; if (index) *index = KS_EMPTY_BIN; /* Set the position at the beginning of the bin and go forward. */ ret = ksmodel_entry_front_request_set(histo, bin, vis_only, func, val); if (!ret) return NULL; entry = kshark_get_entry_front(req, histo->data, index); return entry; }
Hi Steven,I have tried implementing this, but it becomes a bit ugly in the following patches where the single request is transformed into a linked list of requests.
Thanks! Yordan