]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - src/trackfds.h
Add another debug() print to init_from_environment().
[coloredstderr/coloredstderr.git] / src / trackfds.h
index 9b2aaa6701c854f6c3c7ae3c570b4984ebf1b289..f84e20daee373c405c9b95642e4306232123245a 100644 (file)
@@ -56,7 +56,7 @@ static int init_tracked_fds_list(size_t count) {
 
     tracked_fds_list = malloc(count * sizeof(*tracked_fds_list));
     if (!tracked_fds_list) {
-#ifdef DEBUG
+#ifdef WARNING
         warning("malloc(tracked_fds_list, %d) failed [%d]\n",
                 count * sizeof(*tracked_fds_list), getpid());
 #endif
@@ -95,6 +95,9 @@ static void init_from_environment(void) {
         errno = saved_errno;
         return;
     }
+#ifdef DEBUG
+    debug("  getenv(\"%s\"): \"%s\"\n", ENV_NAME_FDS, env);
+#endif
     /* Environment is read-only. */
     char env_copy[strlen(env) + 1];
     strcpy(env_copy, env);
@@ -164,7 +167,7 @@ static char *update_environment_buffer_entry(char *x, int fd) {
     int length = snprintf(x, 10 + 1, "%d", fd);
     if (length >= 10 + 1) {
         /* Integer too big to fit the buffer, skip it. */
-#ifdef DEBUG
+#ifdef WARNING
         warning("update_environment_buffer_entry(): truncated fd: %d [%d]\n",
                 fd, getpid());
 #endif
@@ -217,7 +220,7 @@ static void update_environment(void) {
     update_environment_buffer(env);
 
 #if 0
-    debug("    setenv('%s', '%s', 1)\n", ENV_NAME_FDS, env);
+    debug("    setenv(\"%s\", \"%s\", 1)\n", ENV_NAME_FDS, env);
 #endif
 
     setenv(ENV_NAME_FDS, env, 1 /* overwrite */);
@@ -245,7 +248,7 @@ static void tracked_fds_add(int fd) {
             /* We can do nothing, just ignore the error. We made sure not to
              * destroy our state, so the new descriptor is ignored without any
              * other consequences. */
-#ifdef DEBUG
+#ifdef WARNING
             warning("realloc(tracked_fds_list, %zu) failed! [%d]\n",
                     sizeof(*tracked_fds_list) * new_space, getpid());
 #endif
@@ -299,10 +302,25 @@ static int tracked_fds_remove(int fd) {
     /* Not found. */
     return 0;
 }
+
+static int tracked_fds_find_slow(int fd) noinline;
+/*
+ * 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;
     }