[CRIU] [PATCH 1/4] parse_proc: move parse_threads from cr-dump.c

Andrey Vagin avagin at openvz.org
Fri Sep 13 09:08:19 EDT 2013


It will be used in cr-restore.c for stopping threads on the exit from
sigreturn.

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 cr-dump.c            | 41 ++---------------------------------------
 include/proc_parse.h |  3 +++
 proc_parse.c         | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 42 insertions(+), 39 deletions(-)

diff --git a/cr-dump.c b/cr-dump.c
index f55bf02..799d3b7 100644
--- a/cr-dump.c
+++ b/cr-dump.c
@@ -678,46 +678,9 @@ err:
 	return ret;
 }
 
-static int parse_threads(const struct pstree_item *item, struct pid **_t, int *_n)
-{
-	struct dirent *de;
-	DIR *dir;
-	struct pid *t = NULL;
-	int nr = 1;
-
-	dir = opendir_proc(item->pid.real, "task");
-	if (!dir)
-		return -1;
-
-	while ((de = readdir(dir))) {
-		struct pid *tmp;
-
-		/* We expect numbers only here */
-		if (de->d_name[0] == '.')
-			continue;
-
-		tmp = xrealloc(t, nr * sizeof(struct pid));
-		if (!tmp) {
-			xfree(t);
-			return -1;
-		}
-		t = tmp;
-		t[nr - 1].real = atoi(de->d_name);
-		t[nr - 1].virt = -1;
-		nr++;
-	}
-
-	closedir(dir);
-
-	*_t = t;
-	*_n = nr - 1;
-
-	return 0;
-}
-
 static int get_threads(struct pstree_item *item)
 {
-	return parse_threads(item, &item->threads, &item->nr_threads);
+	return parse_threads(item->pid.real, &item->threads, &item->nr_threads);
 }
 
 static int check_threads(const struct pstree_item *item)
@@ -725,7 +688,7 @@ static int check_threads(const struct pstree_item *item)
 	struct pid *t;
 	int nr, ret;
 
-	ret = parse_threads(item, &t, &nr);
+	ret = parse_threads(item->pid.real, &t, &nr);
 	if (ret)
 		return ret;
 
diff --git a/include/proc_parse.h b/include/proc_parse.h
index a1245cb..71bf00b 100644
--- a/include/proc_parse.h
+++ b/include/proc_parse.h
@@ -164,4 +164,7 @@ extern int parse_file_locks(void);
 
 extern int parse_posix_timers(pid_t pid, struct proc_posix_timers_stat * args);
 
+struct pid;
+extern int parse_threads(int pid, struct pid **_t, int *_n);
+
 #endif /* __CR_PROC_PARSE_H__ */
diff --git a/proc_parse.c b/proc_parse.c
index 3409a85..dd56ed1 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -1238,3 +1238,40 @@ out:
 	fclose(file);
 	return ret;
 }
+
+int parse_threads(int pid, struct pid **_t, int *_n)
+{
+	struct dirent *de;
+	DIR *dir;
+	struct pid *t = NULL;
+	int nr = 1;
+
+	dir = opendir_proc(pid, "task");
+	if (!dir)
+		return -1;
+
+	while ((de = readdir(dir))) {
+		struct pid *tmp;
+
+		/* We expect numbers only here */
+		if (de->d_name[0] == '.')
+			continue;
+
+		tmp = xrealloc(t, nr * sizeof(struct pid));
+		if (!tmp) {
+			xfree(t);
+			return -1;
+		}
+		t = tmp;
+		t[nr - 1].real = atoi(de->d_name);
+		t[nr - 1].virt = -1;
+		nr++;
+	}
+
+	closedir(dir);
+
+	*_t = t;
+	*_n = nr - 1;
+
+	return 0;
+}
-- 
1.8.3.1



More information about the CRIU mailing list