env.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "cpumap.h"
  2. #include "env.h"
  3. #include "util.h"
  4. struct perf_env perf_env;
  5. void perf_env__exit(struct perf_env *env)
  6. {
  7. zfree(&env->hostname);
  8. zfree(&env->os_release);
  9. zfree(&env->version);
  10. zfree(&env->arch);
  11. zfree(&env->cpu_desc);
  12. zfree(&env->cpuid);
  13. zfree(&env->cmdline);
  14. zfree(&env->cmdline_argv);
  15. zfree(&env->sibling_cores);
  16. zfree(&env->sibling_threads);
  17. zfree(&env->numa_nodes);
  18. zfree(&env->pmu_mappings);
  19. zfree(&env->cpu);
  20. }
  21. int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[])
  22. {
  23. int i;
  24. /* do not include NULL termination */
  25. env->cmdline_argv = calloc(argc, sizeof(char *));
  26. if (env->cmdline_argv == NULL)
  27. goto out_enomem;
  28. /*
  29. * Must copy argv contents because it gets moved around during option
  30. * parsing:
  31. */
  32. for (i = 0; i < argc ; i++) {
  33. env->cmdline_argv[i] = argv[i];
  34. if (env->cmdline_argv[i] == NULL)
  35. goto out_free;
  36. }
  37. env->nr_cmdline = argc;
  38. return 0;
  39. out_free:
  40. zfree(&env->cmdline_argv);
  41. out_enomem:
  42. return -ENOMEM;
  43. }
  44. int perf_env__read_cpu_topology_map(struct perf_env *env)
  45. {
  46. int cpu, nr_cpus;
  47. if (env->cpu != NULL)
  48. return 0;
  49. if (env->nr_cpus_avail == 0)
  50. env->nr_cpus_avail = sysconf(_SC_NPROCESSORS_CONF);
  51. nr_cpus = env->nr_cpus_avail;
  52. if (nr_cpus == -1)
  53. return -EINVAL;
  54. env->cpu = calloc(nr_cpus, sizeof(env->cpu[0]));
  55. if (env->cpu == NULL)
  56. return -ENOMEM;
  57. for (cpu = 0; cpu < nr_cpus; ++cpu) {
  58. env->cpu[cpu].core_id = cpu_map__get_core_id(cpu);
  59. env->cpu[cpu].socket_id = cpu_map__get_socket_id(cpu);
  60. }
  61. env->nr_cpus_avail = nr_cpus;
  62. return 0;
  63. }