diff options
Diffstat (limited to 'src/misc2.c')
-rw-r--r-- | src/misc2.c | 306 |
1 files changed, 1 insertions, 305 deletions
diff --git a/src/misc2.c b/src/misc2.c index c5620e2103..e97d838477 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -31,6 +31,7 @@ #include "mbyte.h" #include "memfile.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "move.h" @@ -595,311 +596,6 @@ int leftcol_changed(void) return retval; } -/********************************************************************** - * Various routines dealing with allocation and deallocation of memory. - */ - -/* - * Note: if unsigned is 16 bits we can only allocate up to 64K with alloc(). - * Use lalloc for larger blocks. - */ -char_u *alloc(unsigned size) -{ - return lalloc((long_u)size, TRUE); -} - -/* - * Allocate memory and set all bytes to zero. - */ -char_u *alloc_clear(unsigned size) -{ - char_u *p; - - p = lalloc((long_u)size, TRUE); - if (p != NULL) - (void)memset(p, 0, (size_t)size); - return p; -} - -/* - * alloc() with check for maximum line length - */ -char_u *alloc_check(unsigned size) -{ -#if !defined(UNIX) && !defined(__EMX__) - if (sizeof(int) == 2 && size > 0x7fff) { - /* Don't hide this message */ - emsg_silent = 0; - EMSG(_("E340: Line is becoming too long")); - return NULL; - } -#endif - return lalloc((long_u)size, TRUE); -} - -/* - * Allocate memory like lalloc() and set all bytes to zero. - */ -char_u *lalloc_clear(long_u size, int message) -{ - char_u *p = lalloc(size, message); - memset(p, 0, (size_t)size); - return p; -} - -/// Try to free memory. Used when trying to recover from out of memory errors. -/// @see {xmalloc} -void try_to_free_memory() -{ - static bool trying_to_free = false; - // avoid recursive calls - if (trying_to_free) - return; - trying_to_free = true; - - // free any scrollback text - clear_sb_text(); - // Try to save all buffers and release as many blocks as possible - mf_release_all(); - // cleanup recursive lists/dicts - garbage_collect(); - - trying_to_free = false; -} - -/// malloc() wrapper -/// -/// xmalloc() succeeds or gracefully aborts when out of memory. -/// Before aborting try to free some memory and call malloc again. -/// -/// @see {try_to_free_memory} -/// @param size -/// @return pointer to allocated space. Never NULL -void *xmalloc(size_t size) -{ - void *ret = malloc(size); - - if (!ret && !size) - ret = malloc(1); - - if (!ret) { - try_to_free_memory(); - ret = malloc(size); - if (!ret && !size) - ret = malloc(1); - if (!ret) { - OUT_STR("Vim: Error: Out of memory.\n"); - preserve_exit(); - } - } - - return ret; -} - -/// realloc() wrapper -/// -/// @see {xmalloc} -/// @param size -/// @return pointer to reallocated space. Never NULL -void *xrealloc(void *ptr, size_t size) -{ - void *ret = realloc(ptr, size); - - if (!ret && !size) - ret = realloc(ptr, 1); - - if (!ret) { - try_to_free_memory(); - ret = realloc(ptr, size); - if (!ret && !size) - ret = realloc(ptr, 1); - if (!ret) { - OUT_STR("Vim: Error: Out of memory.\n"); - preserve_exit(); - } - } - - return ret; -} - -/// Old low level memory allocation function. -/// -/// @deprecated use xmalloc() directly instead -/// @param size -/// @return pointer to allocated space. Never NULL -char_u *lalloc(long_u size, int message) -{ - return (char_u *)xmalloc((size_t)size); -} - -/* - * Avoid repeating the error message many times (they take 1 second each). - * Did_outofmem_msg is reset when a character is read. - */ -void do_outofmem_msg(long_u size) -{ - if (!did_outofmem_msg) { - /* Don't hide this message */ - emsg_silent = 0; - - /* Must come first to avoid coming back here when printing the error - * message fails, e.g. when setting v:errmsg. */ - did_outofmem_msg = TRUE; - - EMSGN(_("E342: Out of memory! (allocating %lu bytes)"), size); - } -} - -#if defined(EXITFREE) || defined(PROTO) - -/* - * Free everything that we allocated. - * Can be used to detect memory leaks, e.g., with ccmalloc. - * NOTE: This is tricky! Things are freed that functions depend on. Don't be - * surprised if Vim crashes... - * Some things can't be freed, esp. things local to a library function. - */ -void free_all_mem(void) -{ - buf_T *buf, *nextbuf; - static int entered = FALSE; - - /* When we cause a crash here it is caught and Vim tries to exit cleanly. - * Don't try freeing everything again. */ - if (entered) - return; - entered = TRUE; - - block_autocmds(); /* don't want to trigger autocommands here */ - - /* Close all tabs and windows. Reset 'equalalways' to avoid redraws. */ - p_ea = FALSE; - if (first_tabpage->tp_next != NULL) - do_cmdline_cmd((char_u *)"tabonly!"); - if (firstwin != lastwin) - do_cmdline_cmd((char_u *)"only!"); - - /* Free all spell info. */ - spell_free_all(); - - /* Clear user commands (before deleting buffers). */ - ex_comclear(NULL); - - /* Clear menus. */ - do_cmdline_cmd((char_u *)"aunmenu *"); - do_cmdline_cmd((char_u *)"menutranslate clear"); - - /* Clear mappings, abbreviations, breakpoints. */ - do_cmdline_cmd((char_u *)"lmapclear"); - do_cmdline_cmd((char_u *)"xmapclear"); - do_cmdline_cmd((char_u *)"mapclear"); - do_cmdline_cmd((char_u *)"mapclear!"); - do_cmdline_cmd((char_u *)"abclear"); - do_cmdline_cmd((char_u *)"breakdel *"); - do_cmdline_cmd((char_u *)"profdel *"); - do_cmdline_cmd((char_u *)"set keymap="); - - free_titles(); - free_findfile(); - - /* Obviously named calls. */ - free_all_autocmds(); - clear_termcodes(); - free_all_options(); - free_all_marks(); - alist_clear(&global_alist); - free_homedir(); - free_users(); - free_search_patterns(); - free_old_sub(); - free_last_insert(); - free_prev_shellcmd(); - free_regexp_stuff(); - free_tag_stuff(); - free_cd_dir(); - free_signs(); - set_expr_line(NULL); - diff_clear(curtab); - clear_sb_text(); /* free any scrollback text */ - - /* Free some global vars. */ - vim_free(last_cmdline); - vim_free(new_last_cmdline); - set_keep_msg(NULL, 0); - - /* Clear cmdline history. */ - p_hi = 0; - init_history(); - - { - win_T *win; - tabpage_T *tab; - - qf_free_all(NULL); - /* Free all location lists */ - FOR_ALL_TAB_WINDOWS(tab, win) - qf_free_all(win); - } - - /* Close all script inputs. */ - close_all_scripts(); - - /* Destroy all windows. Must come before freeing buffers. */ - win_free_all(); - - /* Free all buffers. Reset 'autochdir' to avoid accessing things that - * were freed already. */ - p_acd = FALSE; - for (buf = firstbuf; buf != NULL; ) { - nextbuf = buf->b_next; - close_buffer(NULL, buf, DOBUF_WIPE, FALSE); - if (buf_valid(buf)) - buf = nextbuf; /* didn't work, try next one */ - else - buf = firstbuf; - } - - free_cmdline_buf(); - - /* Clear registers. */ - clear_registers(); - ResetRedobuff(); - ResetRedobuff(); - - - /* highlight info */ - free_highlight(); - - reset_last_sourcing(); - - free_tabpage(first_tabpage); - first_tabpage = NULL; - -# ifdef UNIX - /* Machine-specific free. */ - mch_free_mem(); -# endif - - /* message history */ - for (;; ) - if (delete_first_msg() == FAIL) - break; - - eval_clear(); - - free_termoptions(); - - /* screenlines (can't display anything now!) */ - free_screenlines(); - - clear_hl_tables(); - - vim_free(IObuff); - vim_free(NameBuff); -} - -#endif - /* * Copy "string" into newly allocated memory. */ |