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
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);
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
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 */);
/* 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
/* 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;
}