]> granicus.if.org Git - mutt/commitdiff
Use fgets_unlocked and fgetc_unlocked if available.
authorDavid Wilson <dw@botanicus.net>
Wed, 8 Nov 2017 21:40:34 +0000 (13:40 -0800)
committerDavid Wilson <dw@botanicus.net>
Wed, 8 Nov 2017 21:40:34 +0000 (13:40 -0800)
Since mutt does not use threads, there is no reason it should use the
locked variants of the FILE* IO functions. This checks if the unlocked
functions are available, and if so enables them globally via mutt.h.

Cuts load time for a 56k message, 1.8GB /var/mail mailbox from 14
seconds to ~6 seconds, since we avoid acquiring and releasing a mutex
for every character of input read.

Before: 0m14.376s

    74.98%          mutt  libc-2.18.so        [.] _IO_getc
    11.87%          mutt  mutt                [.] mbox_parse_mailbox
     0.94%          mutt  [kernel.kallsyms]   [k] copy_user_generic_string
     0.83%          mutt  libc-2.18.so        [.] __strchr_sse2
     0.53%          mutt  libc-2.18.so        [.] __memcpy_sse2
     0.44%          mutt  libc-2.18.so        [.] _int_malloc

After: 6 seconds

    68.92%     mutt  mutt                  [.] mbox_parse_mailbox
     2.25%     mutt  [kernel.kallsyms]     [k] copy_user_generic_string
     1.73%     mutt  libc-2.18.so          [.] __strchr_sse2
     1.24%     mutt  libc-2.18.so          [.] __memcpy_sse2
     1.17%     mutt  libc-2.18.so          [.] _int_malloc
     0.87%     mutt  libc-2.18.so          [.] __strspn_sse42

configure.ac
mutt.h

index a9c3206899e18408195c5879f42482467968c8f8..8618ddc32ecb9c0296f80c16c55c22cc9a8b0344 100644 (file)
@@ -333,6 +333,7 @@ AC_CHECK_HEADERS(sys/time.h sys/resource.h)
 AC_CHECK_HEADERS(unix.h)
 
 AC_CHECK_FUNCS(setrlimit getsid)
+AC_CHECK_FUNCS(fgets_unlocked fgetc_unlocked)
 
 AC_MSG_CHECKING(for sig_atomic_t in signal.h)
 AC_EGREP_HEADER(sig_atomic_t,signal.h,
diff --git a/mutt.h b/mutt.h
index 54a807fab03bb9731451472853c15f8c1487d6ad..9d3183020b5886f48c11062b6d327981d1797145 100644 (file)
--- a/mutt.h
+++ b/mutt.h
 # define MB_LEN_MAX 16
 #endif
 
+#ifdef HAVE_FGETS_UNLOCKED
+# define fgets fgets_unlocked
+#endif
+
+#ifdef HAVE_FGETC_UNLOCKED
+# define fgetc fgetc_unlocked
+#endif
+
 /* nifty trick I stole from ELM 2.5alpha. */
 #ifdef MAIN_C
 #define WHERE