From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.4 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT, USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7953FC5DF61 for ; Thu, 7 Nov 2019 22:15:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3F6B72075C for ; Thu, 7 Nov 2019 22:15:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dDOQDYZG" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727932AbfKGWPA (ORCPT ); Thu, 7 Nov 2019 17:15:00 -0500 Received: from mail-pl1-f202.google.com ([209.85.214.202]:48824 "EHLO mail-pl1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727872AbfKGWO6 (ORCPT ); Thu, 7 Nov 2019 17:14:58 -0500 Received: by mail-pl1-f202.google.com with SMTP id t5so2678266plz.15 for ; Thu, 07 Nov 2019 14:14:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=GYsTOK8xYRxAzUxpL4TGFf0MCdaNxbX2unbIlv+2Rhk=; b=dDOQDYZGFPLwMGpwr2hhtnIpsHI7U4swqrRNpgAChvbsTVUGuZPenhcLJdGAIc11Du DVf7vUNvjhCLem50JEixRT600aTgf98lEkkLCaALXfUBeIYBf6sgHo1oSZ+2hrnRpkc6 EMEEi/i4dirlukS8+KCZaJqiKWTBwj4TEGn+0QA/YsNAr+POQ3RUWEiIPDxO+D8C8JZf hY6QUp463dJe29T/Ae5hJYc2Pj1ESimAza8tUSUoDcSAs55MGI0ibtBwtCmud6t4P09V W1TTT1MH4ITFTBziDbFKaLQIuoq92ICWKXYtDZUVdZIcSUZ7xnxYefMSp+a81J+l9ahW oc0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=GYsTOK8xYRxAzUxpL4TGFf0MCdaNxbX2unbIlv+2Rhk=; b=NSun83HbWXnI5BShLiUSYM4Ug8OqcyxMFLIlVRGfcm/bXWqxZT+DlgMJQmvOYoDK9C hR5Cea8De8oXrkIC2iuUTtfYDnEZIDpZCQzGPy8wkwAdm9oxWqalp5t91MsYDKCDTDnV i497/akJCacM/sHPevhhhSZfY3VMm+BhzQAUPmjkYpIMs6Gnfon+yYtfkeLwkvGeOZ3R d/ySY8g3LzO7q8/mTawzy9mv7aq90HKhsQDGkpJmpIZZAOEiVZCWtMGjoLwNQ3IoJ0Ym PnhUzmQA9jNrALiPMb5udkMyxTLmRbtGuP+MHxhV94xnk4RhxpLzFY9DDuJcvWYK/Svt QLpg== X-Gm-Message-State: APjAAAVHIgIi3AohmXMXsPIeAQd8sB7iunXGrN4dIbFCFM+03xzIK412 Dizka+ZS/S2R2DRuP+zIozkB6Od3jfN1 X-Google-Smtp-Source: APXvYqyHnBkfFWSvF0SsHBpO7tRDjCvzidF9DaLZPcJPFcMSsf6lwjqg8g/em4GcJRBz9bO384nwjQLs08WO X-Received: by 2002:a63:f513:: with SMTP id w19mr7443214pgh.55.1573164897568; Thu, 07 Nov 2019 14:14:57 -0800 (PST) Date: Thu, 7 Nov 2019 14:14:24 -0800 In-Reply-To: <20191107221428.168286-1-irogers@google.com> Message-Id: <20191107221428.168286-7-irogers@google.com> Mime-Version: 1.0 References: <20191030223448.12930-1-irogers@google.com> <20191107221428.168286-1-irogers@google.com> X-Mailer: git-send-email 2.24.0.432.g9d3f5f5b63-goog Subject: [PATCH v6 06/10] perf tools: add destructors for parse event terms From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If parsing fails then destructors are ran to clean the up the stack. Rename the head union member to make the term and evlist use cases more distinct, this simplifies matching the correct destructor. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.y | 69 +++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 545ab7cefc20..035edfa8d42e 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -12,6 +12,7 @@ #include #include #include +#include #include "pmu.h" #include "evsel.h" #include "parse-events.h" @@ -37,6 +38,25 @@ static struct list_head* alloc_list() return list; } +static void free_list_evsel(struct list_head* list_evsel) +{ + struct evsel *evsel, *tmp; + + list_for_each_entry_safe(evsel, tmp, list_evsel, core.node) { + list_del_init(&evsel->core.node); + perf_evsel__delete(evsel); + } + free(list_evsel); +} + +static void free_term(struct parse_events_term *term) +{ + if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) + free(term->val.str); + zfree(&term->array.ranges); + free(term); +} + static void inc_group_count(struct list_head *list, struct parse_events_state *parse_state) { @@ -66,6 +86,7 @@ static void inc_group_count(struct list_head *list, %type PE_VALUE_SYM_TOOL %type PE_RAW %type PE_TERM +%type value_sym %type PE_NAME %type PE_BPF_OBJECT %type PE_BPF_SOURCE @@ -76,37 +97,43 @@ static void inc_group_count(struct list_head *list, %type PE_EVENT_NAME %type PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type PE_DRV_CFG_TERM -%type value_sym -%type event_config -%type opt_event_config -%type opt_pmu_config +%destructor { free ($$); } %type event_term -%type event_pmu -%type event_legacy_symbol -%type event_legacy_cache -%type event_legacy_mem -%type event_legacy_tracepoint +%destructor { free_term ($$); } +%type event_config +%type opt_event_config +%type opt_pmu_config +%destructor { parse_events_terms__delete ($$); } +%type event_pmu +%type event_legacy_symbol +%type event_legacy_cache +%type event_legacy_mem +%type event_legacy_tracepoint +%type event_legacy_numeric +%type event_legacy_raw +%type event_bpf_file +%type event_def +%type event_mod +%type event_name +%type event +%type events +%type group_def +%type group +%type groups +%destructor { free_list_evsel ($$); } %type tracepoint_name -%type event_legacy_numeric -%type event_legacy_raw -%type event_bpf_file -%type event_def -%type event_mod -%type event_name -%type event -%type events -%type group_def -%type group -%type groups +%destructor { free ($$.sys); free ($$.event); } %type array %type array_term %type array_terms +%destructor { free ($$.ranges); } %union { char *str; u64 num; - struct list_head *head; + struct list_head *list_evsel; + struct list_head *list_terms; struct parse_events_term *term; struct tracepoint_name { char *sys; -- 2.24.0.432.g9d3f5f5b63-goog