tools/perf/util/thread_map.c

Source file repositories/reference/linux-study-clean/tools/perf/util/thread_map.c

File Facts

System
Linux kernel
Corpus path
tools/perf/util/thread_map.c
Extension
.c
Size
8207 bytes
Lines
398
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (items <= 0) {
			pr_debug("scandir for %d returned empty, skipping\n", pid);
			continue;
		}
		while (threads->nr + items >= max_threads) {
			max_threads *= 2;
			grow = true;
		}

		if (grow) {
			struct perf_thread_map *tmp;

			tmp = perf_thread_map__realloc(threads, max_threads);
			if (tmp == NULL)
				goto out_free_namelist;

			threads = tmp;
		}

		for (i = 0; i < items; i++) {
			perf_thread_map__set_pid(threads, threads->nr + i,
						    atoi(namelist[i]->d_name));
		}

		for (i = 0; i < items; i++)
			zfree(&namelist[i]);
		free(namelist);

		threads->nr += items;
	}

out_closedir:
	closedir(proc);
out:
	return threads;

out_free_threads:
	free(threads);
	return NULL;

out_free_namelist:
	for (i = 0; i < items; i++)
		zfree(&namelist[i]);
	free(namelist);
	zfree(&threads);
	goto out_closedir;
}

struct perf_thread_map *thread_map__new(pid_t pid, pid_t tid)
{
	if (pid != -1)
		return thread_map__new_by_pid(pid);

	return thread_map__new_by_tid(tid);
}

static struct perf_thread_map *thread_map__new_by_pid_str(const char *pid_str)
{
	struct perf_thread_map *threads = NULL, *nt;
	char name[256];
	int items, total_tasks = 0;
	struct dirent **namelist = NULL;
	int i, j = 0;
	pid_t pid, prev_pid = INT_MAX;
	struct str_node *pos;
	struct strlist *slist = strlist__new(pid_str, NULL);

	if (!slist)
		return NULL;

	strlist__for_each_entry(pos, slist) {
		pid = strtol(pos->s, NULL, 10);

		if (pid == INT_MIN || pid == INT_MAX)
			goto out_free_threads;

		if (pid == prev_pid)
			continue;

		sprintf(name, "/proc/%d/task", pid);
		items = scandir(name, &namelist, filter, NULL);
		if (items <= 0)
			goto out_free_threads;

		total_tasks += items;
		nt = perf_thread_map__realloc(threads, total_tasks);
		if (nt == NULL)
			goto out_free_namelist;

		threads = nt;

Annotation

Implementation Notes