Do not allocate huge temporary memory areas and objects while encoding
for file I/O, thus reducing an enormous memory usage for large buffers. See http://lists.gnu.org/archive/html/emacs-devel/2013-10/msg00180.html. * coding.h (struct coding_system): New member raw_destination. * coding.c (setup_coding_system): Initialize it to zero. (encode_coding_object): If raw_destination is set, do not create dst_object. Add comment. * fileio.c (toplevel): New constant E_WRITE_MAX. (e_write): Do not encode more than E_WRITE_MAX characters per one loop iteration. Use raw_destination if E_WRITE_MAX characters is encoded.
This commit is contained in:
parent
b7d5bd823c
commit
f849808191
4 changed files with 57 additions and 8 deletions
|
@ -5761,6 +5761,7 @@ setup_coding_system (Lisp_Object coding_system, struct coding_system *coding)
|
|||
coding->safe_charsets = SDATA (val);
|
||||
coding->default_char = XINT (CODING_ATTR_DEFAULT_CHAR (attrs));
|
||||
coding->carryover_bytes = 0;
|
||||
coding->raw_destination = 0;
|
||||
|
||||
coding_type = CODING_ATTR_TYPE (attrs);
|
||||
if (EQ (coding_type, Qundecided))
|
||||
|
@ -8352,6 +8353,11 @@ encode_coding_object (struct coding_system *coding,
|
|||
{
|
||||
if (BUFFERP (coding->dst_object))
|
||||
coding->dst_object = Fbuffer_string ();
|
||||
else if (coding->raw_destination)
|
||||
/* This is used to avoid creating huge Lisp string.
|
||||
NOTE: caller who sets `raw_destination' is also
|
||||
responsible for freeing `destination' buffer. */
|
||||
coding->dst_object = Qnil;
|
||||
else
|
||||
{
|
||||
coding->dst_object
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue