]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib/util: inline iov_{buflen,buf,advance}()
authorStefan Metzmacher <metze@samba.org>
Tue, 25 Apr 2023 17:55:16 +0000 (17:55 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 6 Sep 2023 19:30:35 +0000 (19:30 +0000)
The main reason for this change was the use of
iov_advance() in the next commits in
source3/smbd/smb2_server.c

And the function calls to iov_advance() showed up
in profiling with callgrind.

While there iov_buf() and iov_buflen() are moved as
well, as they are also used there.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/util/iov_buf.c
lib/util/iov_buf.h

index a9224164068314af93a0a21d8f41dac66f065ae5..0c1846697212a0bf41e8b61f0907ca575bf46246 100644 (file)
 #include "iov_buf.h"
 #include <talloc.h>
 
-ssize_t iov_buflen(const struct iovec *iov, int iovcnt)
-{
-       return iov_buf(iov, iovcnt, NULL, 0);
-}
-
-ssize_t iov_buf(const struct iovec *iov, int iovcnt,
-               uint8_t *buf, size_t buflen)
-{
-       size_t needed = 0;
-       uint8_t *p = buf;
-       int i;
-
-       for (i=0; i<iovcnt; i++) {
-               size_t thislen = iov[i].iov_len;
-               size_t tmp;
-
-               tmp = needed + thislen;
-
-               if (tmp < needed) {
-                       /* wrap */
-                       return -1;
-               }
-               needed = tmp;
-
-               if ((p != NULL) && needed <= buflen && thislen > 0) {
-                       memcpy(p, iov[i].iov_base, thislen);
-                       p += thislen;
-               }
-       }
-
-       return needed;
-}
-
-bool iov_advance(struct iovec **iov, int *iovcnt, size_t n)
-{
-       struct iovec *v = *iov;
-       int cnt = *iovcnt;
-
-       while (n > 0) {
-               if (cnt == 0) {
-                       return false;
-               }
-               if (n < v->iov_len) {
-                       v->iov_base = (char *)v->iov_base + n;
-                       v->iov_len -= n;
-                       break;
-               }
-               n -= v->iov_len;
-               v += 1;
-               cnt -= 1;
-       }
-
-       /*
-        * Skip 0-length iovec's
-        *
-        * There might be empty buffers at the end of iov. Next time we do a
-        * readv/writev based on this iov would give 0 transferred bytes, also
-        * known as EPIPE. So we need to be careful discarding them.
-        */
-
-       while ((cnt > 0) && (v->iov_len == 0)) {
-               v += 1;
-               cnt -= 1;
-       }
-
-       *iov = v;
-       *iovcnt = cnt;
-       return true;
-}
-
 uint8_t *iov_concat(TALLOC_CTX *mem_ctx, const struct iovec *iov, int count)
 {
        ssize_t buflen;
index 07e08e1650bf5f7dc61e51e6b801ee40d60090a5..cb330dea07a42c27009ee6804e3996d5bb4a7a76 100644 (file)
 #include <talloc.h>
 #include "system/filesys.h"
 
-ssize_t iov_buflen(const struct iovec *iov, int iovlen);
+static inline
 ssize_t iov_buf(const struct iovec *iov, int iovcnt,
-               uint8_t *buf, size_t buflen);
-bool iov_advance(struct iovec **iov, int *iovcnt, size_t n);
+               uint8_t *buf, size_t buflen)
+{
+       size_t needed = 0;
+       uint8_t *p = buf;
+       int i;
+
+       for (i=0; i<iovcnt; i++) {
+               size_t thislen = iov[i].iov_len;
+               size_t tmp;
+
+               tmp = needed + thislen;
+
+               if (tmp < needed) {
+                       /* wrap */
+                       return -1;
+               }
+               needed = tmp;
+
+               if ((p != NULL) && needed <= buflen && thislen > 0) {
+                       memcpy(p, iov[i].iov_base, thislen);
+                       p += thislen;
+               }
+       }
+
+       return needed;
+}
+
+static inline
+ssize_t iov_buflen(const struct iovec *iov, int iovcnt)
+{
+       return iov_buf(iov, iovcnt, NULL, 0);
+}
+
+static inline
+bool iov_advance(struct iovec **iov, int *iovcnt, size_t n)
+{
+       struct iovec *v = *iov;
+       int cnt = *iovcnt;
+
+       while (n > 0) {
+               if (cnt == 0) {
+                       return false;
+               }
+               if (n < v->iov_len) {
+                       v->iov_base = (char *)v->iov_base + n;
+                       v->iov_len -= n;
+                       break;
+               }
+               n -= v->iov_len;
+               v += 1;
+               cnt -= 1;
+       }
+
+       /*
+        * Skip 0-length iovec's
+        *
+        * There might be empty buffers at the end of iov. Next time we do a
+        * readv/writev based on this iov would give 0 transferred bytes, also
+        * known as EPIPE. So we need to be careful discarding them.
+        */
+
+       while ((cnt > 0) && (v->iov_len == 0)) {
+               v += 1;
+               cnt -= 1;
+       }
+
+       *iov = v;
+       *iovcnt = cnt;
+       return true;
+}
+
 uint8_t *iov_concat(TALLOC_CTX *mem_ctx, const struct iovec *iov, int count);
 
 #endif