diff options
| author | Paul Eggert | 2017-06-22 11:21:20 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-06-22 11:22:53 -0700 |
| commit | f6ef15cf84c1288e972ef0e6165b97e34d6033b6 (patch) | |
| tree | 7f3fcd101a6c1a02965ebe6fd8dbf070f8340f53 /src/image.c | |
| parent | 18896f79136bb7d6d4c0c6b1d066b4e82644db6a (diff) | |
| download | emacs-f6ef15cf84c1288e972ef0e6165b97e34d6033b6.tar.gz emacs-f6ef15cf84c1288e972ef0e6165b97e34d6033b6.zip | |
Use unlocked stdio more systematically
This can improve performance significantly on stdio-bottlenecked code.
E.g., make-docfile is 3x faster on my Fedora 25 x86-64 desktop.
* admin/merge-gnulib (GNULIB_MODULES): Add unlocked-io.
* lib-src/ebrowse.c, lib-src/emacsclient.c, lib-src/etags.c:
* lib-src/hexl.c, lib-src/make-docfile.c, lib-src/movemail.c:
* lib-src/profile.c, lib-src/update-game-score.c:
Include unlocked-io.h instead of stdio.h, since these programs are
single-threaded.
* lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate.
* lib/unlocked-io.h, m4/unlocked-io.m4: New files, copied from Gnulib.
* src/charset.c, src/cm.c, src/emacs.c, src/image.c, src/keyboard.c:
* src/lread.c, src/term.c:
Include sysstdio.h, possibly instead of stdio.h, to define
the unlocked functions if the system does not provide them.
* src/charset.c, src/lread.c (getc_unlocked):
Remove, since sysstdio.h now defines it if needed.
* src/cm.c (cmputc, cmcheckmagic):
* src/dispnew.c (update_frame, update_frame_with_menu)
(update_frame_1, Fsend_string_to_terminal, Fding, bitch_at_user):
* src/emacs.c (main, Fdump_emacs):
* src/fileio.c (Fdo_auto_save, Fset_binary_mode):
* src/image.c (slurp_file, png_read_from_file, png_load_body)
(our_stdio_fill_input_buffer):
* src/keyboard.c (record_char, kbd_buffer_get_event, handle_interrupt):
* src/lread.c (readbyte_from_file):
* src/minibuf.c (read_minibuf_noninteractive):
* src/print.c (printchar_to_stream, strout)
(Fredirect_debugging_output):
* src/sysdep.c (reset_sys_modes, procfs_ttyname)
(procfs_get_total_memory):
* src/term.c (tty_ring_bell, tty_send_additional_strings)
(tty_set_terminal_modes, tty_reset_terminal_modes)
(tty_update_end, tty_clear_end_of_line, tty_write_glyphs)
(tty_write_glyphs_with_face, tty_insert_glyphs)
(tty_menu_activate):
* src/xfaces.c (Fx_load_color_file):
Use unlocked stdio when it should be safe.
* src/sysstdio.h (clearerr_unlocked, feof_unlocked, ferror_unlocked)
(fflush_unlocked, fgets_unlocked, fputc_unlocked, fputs_unlocked)
(fread_unlocked, fwrite_unlocked, getc_unlocked, getchar_unlocked)
(putc_unlocked, putchar_unloced): Provide substitutes if not declared.
Diffstat (limited to 'src/image.c')
| -rw-r--r-- | src/image.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/image.c b/src/image.c index aedec7954ee..07c4769e9e3 100644 --- a/src/image.c +++ b/src/image.c | |||
| @@ -20,7 +20,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 20 | #include <config.h> | 20 | #include <config.h> |
| 21 | 21 | ||
| 22 | #include <fcntl.h> | 22 | #include <fcntl.h> |
| 23 | #include <stdio.h> | ||
| 24 | #include <unistd.h> | 23 | #include <unistd.h> |
| 25 | 24 | ||
| 26 | /* Include this before including <setjmp.h> to work around bugs with | 25 | /* Include this before including <setjmp.h> to work around bugs with |
| @@ -41,6 +40,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 41 | #include "buffer.h" | 40 | #include "buffer.h" |
| 42 | #include "dispextern.h" | 41 | #include "dispextern.h" |
| 43 | #include "blockinput.h" | 42 | #include "blockinput.h" |
| 43 | #include "sysstdio.h" | ||
| 44 | #include "systime.h" | 44 | #include "systime.h" |
| 45 | #include <epaths.h> | 45 | #include <epaths.h> |
| 46 | #include "coding.h" | 46 | #include "coding.h" |
| @@ -2361,7 +2361,7 @@ slurp_file (int fd, ptrdiff_t *size) | |||
| 2361 | This can happen if the file grows as we read it. */ | 2361 | This can happen if the file grows as we read it. */ |
| 2362 | ptrdiff_t buflen = st.st_size; | 2362 | ptrdiff_t buflen = st.st_size; |
| 2363 | buf = xmalloc (buflen + 1); | 2363 | buf = xmalloc (buflen + 1); |
| 2364 | if (fread (buf, 1, buflen + 1, fp) == buflen) | 2364 | if (fread_unlocked (buf, 1, buflen + 1, fp) == buflen) |
| 2365 | *size = buflen; | 2365 | *size = buflen; |
| 2366 | else | 2366 | else |
| 2367 | { | 2367 | { |
| @@ -5890,7 +5890,7 @@ png_read_from_file (png_structp png_ptr, png_bytep data, png_size_t length) | |||
| 5890 | { | 5890 | { |
| 5891 | FILE *fp = png_get_io_ptr (png_ptr); | 5891 | FILE *fp = png_get_io_ptr (png_ptr); |
| 5892 | 5892 | ||
| 5893 | if (fread (data, 1, length, fp) < length) | 5893 | if (fread_unlocked (data, 1, length, fp) < length) |
| 5894 | png_error (png_ptr, "Read error"); | 5894 | png_error (png_ptr, "Read error"); |
| 5895 | } | 5895 | } |
| 5896 | 5896 | ||
| @@ -5959,7 +5959,7 @@ png_load_body (struct frame *f, struct image *img, struct png_load_context *c) | |||
| 5959 | } | 5959 | } |
| 5960 | 5960 | ||
| 5961 | /* Check PNG signature. */ | 5961 | /* Check PNG signature. */ |
| 5962 | if (fread (sig, 1, sizeof sig, fp) != sizeof sig | 5962 | if (fread_unlocked (sig, 1, sizeof sig, fp) != sizeof sig |
| 5963 | || png_sig_cmp (sig, 0, sizeof sig)) | 5963 | || png_sig_cmp (sig, 0, sizeof sig)) |
| 5964 | { | 5964 | { |
| 5965 | fclose (fp); | 5965 | fclose (fp); |
| @@ -6598,7 +6598,8 @@ our_stdio_fill_input_buffer (j_decompress_ptr cinfo) | |||
| 6598 | { | 6598 | { |
| 6599 | ptrdiff_t bytes; | 6599 | ptrdiff_t bytes; |
| 6600 | 6600 | ||
| 6601 | bytes = fread (src->buffer, 1, JPEG_STDIO_BUFFER_SIZE, src->file); | 6601 | bytes = fread_unlocked (src->buffer, 1, JPEG_STDIO_BUFFER_SIZE, |
| 6602 | src->file); | ||
| 6602 | if (bytes > 0) | 6603 | if (bytes > 0) |
| 6603 | src->mgr.bytes_in_buffer = bytes; | 6604 | src->mgr.bytes_in_buffer = bytes; |
| 6604 | else | 6605 | else |