From e0452f1052e69dc838ab77e40f10e1949a382156 Mon Sep 17 00:00:00 2001 From: Alex Nikiforov <nika@gentoo> Date: Thu, 21 Jul 2011 13:26:28 +0400 Subject: [PATCH 2/2] api: replace read/write with readv/writev
Put the pid and flags into iovec structure for processing via writev/readv according to manual. Vector read/write syscall process multiple iovec buffers in array order (man 2 writev). It's reduce the number of syscalls and make code more clear (less read/write if pairs) Signed-off-by: Alex Nikiforov <a.nikifo...@samsung.com> --- src/api.c | 11 ++++++++--- src/daemon/cgrulesengd.c | 25 +++++++++++++++---------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/api.c b/src/api.c index d5022c2..8c6dd1e 100644 --- a/src/api.c +++ b/src/api.c @@ -43,6 +43,7 @@ #include <sys/socket.h> #include <fcntl.h> #include <sys/syscall.h> +#include <sys/uio.h> #include <unistd.h> #include <fts.h> #include <ctype.h> @@ -3704,6 +3705,7 @@ int cgroup_register_unchanged_process(pid_t pid, int flags) int ret = 1; char buff[sizeof(CGRULE_SUCCESS_STORE_PID)]; struct sockaddr_un addr; + struct iovec iov[2] = {}; sk = socket(PF_UNIX, SOCK_STREAM, 0); if (sk < 0) @@ -3720,10 +3722,13 @@ int cgroup_register_unchanged_process(pid_t pid, int flags) ret = 0; goto close; } - if (write(sk, &pid, sizeof(pid)) < 0) - goto close; - if (write(sk, &flags, sizeof(flags)) < 0) + iov[0].iov_base = &pid; + iov[0].iov_len = sizeof(pid); + iov[1].iov_base = &flags; + iov[1].iov_len = sizeof(flags); + + if (writev(sk, iov, 2) < 0) goto close; if (read(sk, buff, sizeof(buff)) < 0) diff --git a/src/daemon/cgrulesengd.c b/src/daemon/cgrulesengd.c index 2f42a57..14887bb 100644 --- a/src/daemon/cgrulesengd.c +++ b/src/daemon/cgrulesengd.c @@ -40,6 +40,7 @@ #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> +#include <sys/uio.h> #include <sys/syslog.h> #include <string.h> #include <linux/netlink.h> @@ -552,6 +553,7 @@ static void cgre_receive_unix_domain_msg(int sk_unix) socklen_t caddr_len; struct stat buff_stat; char path[FILENAME_MAX]; + struct iovec iov[2] = {}; caddr_len = sizeof(caddr); fd_client = accept(sk_unix, (struct sockaddr *)&caddr, &caddr_len); @@ -559,16 +561,19 @@ static void cgre_receive_unix_domain_msg(int sk_unix) cgroup_dbg("accept error: %s\n", strerror(errno)); return; } - if (read(fd_client, &pid, sizeof(pid)) < 0) { - cgroup_dbg("read error: %s\n", strerror(errno)); - goto close; - } - sprintf(path, "/proc/%d", pid); - if (stat(path, &buff_stat)) { - cgroup_dbg("There is not such process (PID: %d)", pid); - goto close; - } - if (read(fd_client, &flags, sizeof(flags)) < 0) { + + iov[0].iov_base = &pid; + iov[0].iov_len = sizeof(pid); + iov[1].iov_base = &flags; + iov[1].iov_len = sizeof(flags); + + if (readv(fd_client, iov, 2) < 0) { + sprintf(path, "/proc/%d", pid); + if (stat(path, &buff_stat)) { + cgroup_dbg("There is not such process (PID: %d)", pid); + goto close; + } + cgroup_dbg("read error: %s\n", strerror(errno)); goto close; } -- 1.7.4.1 ------------------------------------------------------------------------------ 10 Tips for Better Web Security Learn 10 ways to better secure your business today. Topics covered include: Web security, SSL, hacker attacks & Denial of Service (DoS), private keys, security Microsoft Exchange, secure Instant Messaging, and much more. http://www.accelacomm.com/jaw/sfnl/114/51426210/ _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel