Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  expand-cgroup.c

  Sprache: C
 

// SPDX-License-Identifier: GPL-2.0
#include "tests.h"
#include "debug.h"
#include "evlist.h"
#include "cgroup.h"
#include "rblist.h"
#include "metricgroup.h"
#include "parse-events.h"
#include "pmu-events/pmu-events.h"
#include "pfm.h"
#include <subcmd/parse-options.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int test_expand_events(struct evlist *evlist)
{
 int i, ret = TEST_FAIL;
 int nr_events;
 bool was_group_event;
 int nr_members;  /* for the first evsel only */
 const char cgrp_str[] = "A,B,C";
 const char *cgrp_name[] = { "A""B""C" };
 int nr_cgrps = ARRAY_SIZE(cgrp_name);
 char **ev_name;
 struct evsel *evsel;

 TEST_ASSERT_VAL("evlist is empty", !evlist__empty(evlist));

 nr_events = evlist->core.nr_entries;
 ev_name = calloc(nr_events, sizeof(*ev_name));
 if (ev_name == NULL) {
  pr_debug("memory allocation failure\n");
  return TEST_FAIL;
 }
 i = 0;
 evlist__for_each_entry(evlist, evsel) {
  ev_name[i] = strdup(evsel->name);
  if (ev_name[i] == NULL) {
   pr_debug("memory allocation failure\n");
   goto out;
  }
  i++;
 }
 /* remember grouping info */
 was_group_event = evsel__is_group_event(evlist__first(evlist));
 nr_members = evlist__first(evlist)->core.nr_members;

 ret = evlist__expand_cgroup(evlist, cgrp_str, false);
 if (ret < 0) {
  pr_debug("failed to expand events for cgroups\n");
  goto out;
 }

 ret = TEST_FAIL;
 if (evlist->core.nr_entries != nr_events * nr_cgrps) {
  pr_debug("event count doesn't match\n");
  goto out;
 }

 i = 0;
 evlist__for_each_entry(evlist, evsel) {
  if (!evsel__name_is(evsel, ev_name[i % nr_events])) {
   pr_debug("event name doesn't match:\n");
   pr_debug("  evsel[%d]: %s\n  expected: %s\n",
     i, evsel->name, ev_name[i % nr_events]);
   goto out;
  }
  if (strcmp(evsel->cgrp->name, cgrp_name[i / nr_events])) {
   pr_debug("cgroup name doesn't match:\n");
   pr_debug("  evsel[%d]: %s\n  expected: %s\n",
     i, evsel->cgrp->name, cgrp_name[i / nr_events]);
   goto out;
  }

  if ((i % nr_events) == 0) {
   if (evsel__is_group_event(evsel) != was_group_event) {
    pr_debug("event group doesn't match: got %s, expect %s\n",
      evsel__is_group_event(evsel) ? "true" : "false",
      was_group_event ? "true" : "false");
    goto out;
   }
   if (evsel->core.nr_members != nr_members) {
    pr_debug("event group member doesn't match: %d vs %d\n",
      evsel->core.nr_members, nr_members);
    goto out;
   }
  }
  i++;
 }
 ret = TEST_OK;

out: for (i = 0; i < nr_events; i++)
  free(ev_name[i]);
 free(ev_name);
 return ret;
}

static int expand_default_events(void)
{
 int ret;
 struct evlist *evlist = evlist__new_default();

 TEST_ASSERT_VAL("failed to get evlist", evlist);

 ret = test_expand_events(evlist);
 evlist__delete(evlist);
 return ret;
}

static int expand_group_events(void)
{
 int ret;
 struct evlist *evlist;
 struct parse_events_error err;
 const char event_str[] = "{cycles,instructions}";

 symbol_conf.event_group = true;

 evlist = evlist__new();
 TEST_ASSERT_VAL("failed to get evlist", evlist);

 parse_events_error__init(&err);
 ret = parse_events(evlist, event_str, &err);
 if (ret < 0) {
  pr_debug("failed to parse event '%s', err %d\n", event_str, ret);
  parse_events_error__print(&err, event_str);
  goto out;
 }

 ret = test_expand_events(evlist);
out:
 parse_events_error__exit(&err);
 evlist__delete(evlist);
 return ret;
}

static int expand_libpfm_events(void)
{
 int ret;
 struct evlist *evlist;
 const char event_str[] = "CYCLES";
 struct option opt = {
  .value = &evlist,
 };

 symbol_conf.event_group = true;

 evlist = evlist__new();
 TEST_ASSERT_VAL("failed to get evlist", evlist);

 ret = parse_libpfm_events_option(&opt, event_str, 0);
 if (ret < 0) {
  pr_debug("failed to parse libpfm event '%s', err %d\n",
    event_str, ret);
  goto out;
 }
 if (evlist__empty(evlist)) {
  pr_debug("libpfm was not enabled\n");
  goto out;
 }

 ret = test_expand_events(evlist);
out:
 evlist__delete(evlist);
 return ret;
}

static int expand_metric_events(void)
{
 int ret;
 struct evlist *evlist;
 const char metric_str[] = "CPI";
 const struct pmu_metrics_table *pme_test;

 evlist = evlist__new();
 TEST_ASSERT_VAL("failed to get evlist", evlist);

 pme_test = find_core_metrics_table("testarch""testcpu");
 ret = metricgroup__parse_groups_test(evlist, pme_test, metric_str);
 if (ret < 0) {
  pr_debug("failed to parse '%s' metric\n", metric_str);
  goto out;
 }

 ret = test_expand_events(evlist);

out:
 evlist__delete(evlist);
 return ret;
}

static int test__expand_cgroup_events(struct test_suite *test __maybe_unused,
          int subtest __maybe_unused)
{
 int ret;

 ret = expand_default_events();
 TEST_ASSERT_EQUAL("failed to expand default events", ret, 0);

 ret = expand_group_events();
 TEST_ASSERT_EQUAL("failed to expand event group", ret, 0);

 ret = expand_libpfm_events();
 TEST_ASSERT_EQUAL("failed to expand event group", ret, 0);

 ret = expand_metric_events();
 TEST_ASSERT_EQUAL("failed to expand metric events", ret, 0);

 return ret;
}

DEFINE_SUITE("Event expansion for cgroups", expand_cgroup_events);

Messung V0.5 in Prozent
C=98 H=91 G=94

¤ Dauer der Verarbeitung: 0.14 Sekunden  (vorverarbeitet am  2026-06-07) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=277311
#Domains=752002