]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
Inline fast part of tracked_fds_find().
authorSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2013 04:08:35 +0000 (06:08 +0200)
committerSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2013 12:05:51 +0000 (14:05 +0200)
configure.ac
src/compiler.h
src/trackfds.h

index ec5b65898d6d14f161557937e89f17406eb71732..3b007c5d29b51404c86d151d222ea5136acf31c5 100644 (file)
@@ -43,6 +43,7 @@ AC_TYPE_SIZE_T
 AC_TYPE_SSIZE_T
 
 AC_C_INLINE
+AX_C___ATTRIBUTE__
 
 AC_FUNC_FORK
 AC_CHECK_FUNCS([dup2 memmove setenv strdup])
index 3d92f2fac5f1e05eef2a93f4191e1dd489465df7..9e23e238efa2c30ec52e9be5a20f50b7ef097876 100644 (file)
 #ifndef COMPILER_H
 #define COMPILER_H 1
 
+/* Prevent/force inlining. Used to improve performance. */
+#undef __noinline
+#undef __always_inline
+#ifdef HAVE___ATTRIBUTE__
+# define __noinline      __attribute__((noinline))
+# define __always_inline __attribute__((always_inline))
+#else
+# define __noinline
+# define __always_inline
+#endif
+
 /* Branch prediction information for the compiler. */
 #ifdef HAVE___BUILTIN_EXPECT
 # define likely(x)   __builtin_expect(!!(x), 1)
index 9b2aaa6701c854f6c3c7ae3c570b4984ebf1b289..175f1e387d17fd9672c5bc066c088018bd32f8ab 100644 (file)
@@ -299,10 +299,25 @@ static int tracked_fds_remove(int fd) {
     /* Not found. */
     return 0;
 }
+
+static int tracked_fds_find_slow(int fd);
+/*
+ * tracked_fds_find() is called for each hook call and should be as fast as
+ * possible. As most file descriptors are < TRACKFDS_STATIC_COUNT, force the
+ * compiler to inline that part which is almost exclusively used.
+ *
+ * Inlining tracked_fds_add()/tracked_fds_remove() isn't worth the effort as
+ * they are not called often enough.
+ */
+inline static int tracked_fds_find(int fd) __always_inline;
 static int tracked_fds_find(int fd) {
     if (fd < TRACKFDS_STATIC_COUNT) {
         return tracked_fds[fd];
     }
+
+    return tracked_fds_find_slow(fd);
+}
+static int tracked_fds_find_slow(int fd) {
     if (tracked_fds_list_count == 0) {
         return 0;
     }