Reducing RAM consumption by deleting unused caches
When the user deletes a buffer, we can delete the clang caches for that file. Fixes #184.
This commit is contained in:
parent
6d53c1cf5a
commit
c391bdcc62
@ -61,6 +61,7 @@ function! youcompleteme#Enable()
|
|||||||
" that happens *after" BufRead/BufEnter has already triggered for the
|
" that happens *after" BufRead/BufEnter has already triggered for the
|
||||||
" initial file.
|
" initial file.
|
||||||
autocmd BufRead,BufEnter * call s:OnBufferVisit()
|
autocmd BufRead,BufEnter * call s:OnBufferVisit()
|
||||||
|
autocmd BufDelete * call s:OnBufferDelete( expand( '<afile>:p' ) )
|
||||||
autocmd CursorHold,CursorHoldI * call s:OnCursorHold()
|
autocmd CursorHold,CursorHoldI * call s:OnCursorHold()
|
||||||
autocmd InsertLeave * call s:OnInsertLeave()
|
autocmd InsertLeave * call s:OnInsertLeave()
|
||||||
autocmd InsertEnter * call s:OnInsertEnter()
|
autocmd InsertEnter * call s:OnInsertEnter()
|
||||||
@ -183,6 +184,15 @@ function! s:OnBufferVisit()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! s:OnBufferDelete( deleted_buffer_file )
|
||||||
|
if !s:AllowedToCompleteInCurrentFile() || empty( a:deleted_buffer_file )
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
py ycm_state.OnBufferDelete( vim.eval( 'a:deleted_buffer_file' ) )
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! s:OnCursorHold()
|
function! s:OnCursorHold()
|
||||||
if !s:AllowedToCompleteInCurrentFile()
|
if !s:AllowedToCompleteInCurrentFile()
|
||||||
return
|
return
|
||||||
|
@ -262,6 +262,16 @@ ClangCompleter::CandidatesForQueryAndLocationInFileAsync(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ClangCompleter::DeleteCachesForFile( const std::string &filename ) {
|
||||||
|
// If the clang thread is currently parsing the file when the user deletes the
|
||||||
|
// buffer and thus we try to delete the caches, Vim's GUI thread would block
|
||||||
|
// until the clang thread releases the mutex. Move this operation to the clang
|
||||||
|
// thread.
|
||||||
|
lock_guard< mutex > lock( filename_to_translation_unit_mutex_ );
|
||||||
|
filename_to_translation_unit_.erase( filename );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ClangCompleter::ShouldSkipClangResultCache( const std::string &query,
|
bool ClangCompleter::ShouldSkipClangResultCache( const std::string &query,
|
||||||
int line,
|
int line,
|
||||||
int column ) {
|
int column ) {
|
||||||
|
@ -93,6 +93,8 @@ public:
|
|||||||
const std::vector< UnsavedFile > &unsaved_files,
|
const std::vector< UnsavedFile > &unsaved_files,
|
||||||
const std::vector< std::string > &flags );
|
const std::vector< std::string > &flags );
|
||||||
|
|
||||||
|
void DeleteCachesForFile( const std::string &filename );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// This is basically a union. Only one of the two tasks is set to something
|
// This is basically a union. Only one of the two tasks is set to something
|
||||||
|
@ -81,6 +81,8 @@ TranslationUnit::~TranslationUnit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TranslationUnit::Destroy() {
|
void TranslationUnit::Destroy() {
|
||||||
|
unique_lock< mutex > lock( clang_access_mutex_ );
|
||||||
|
|
||||||
if ( clang_translation_unit_ ) {
|
if ( clang_translation_unit_ ) {
|
||||||
clang_disposeTranslationUnit( clang_translation_unit_ );
|
clang_disposeTranslationUnit( clang_translation_unit_ );
|
||||||
clang_translation_unit_ = NULL;
|
clang_translation_unit_ = NULL;
|
||||||
|
@ -115,6 +115,7 @@ BOOST_PYTHON_MODULE(ycm_core)
|
|||||||
class_< ClangCompleter, boost::noncopyable >( "ClangCompleter" )
|
class_< ClangCompleter, boost::noncopyable >( "ClangCompleter" )
|
||||||
.def( "EnableThreading", &ClangCompleter::EnableThreading )
|
.def( "EnableThreading", &ClangCompleter::EnableThreading )
|
||||||
.def( "DiagnosticsForFile", &ClangCompleter::DiagnosticsForFile )
|
.def( "DiagnosticsForFile", &ClangCompleter::DiagnosticsForFile )
|
||||||
|
.def( "DeleteCachesForFile", &ClangCompleter::DeleteCachesForFile )
|
||||||
.def( "UpdatingTranslationUnit", &ClangCompleter::UpdatingTranslationUnit )
|
.def( "UpdatingTranslationUnit", &ClangCompleter::UpdatingTranslationUnit )
|
||||||
.def( "UpdateTranslationUnitAsync",
|
.def( "UpdateTranslationUnitAsync",
|
||||||
&ClangCompleter::UpdateTranslationUnitAsync )
|
&ClangCompleter::UpdateTranslationUnitAsync )
|
||||||
|
@ -235,6 +235,10 @@ class Completer( object ):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def OnBufferDelete( self, deleted_buffer_file ):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def OnCursorHold( self ):
|
def OnCursorHold( self ):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -147,6 +147,10 @@ class ClangCompleter( Completer ):
|
|||||||
flags )
|
flags )
|
||||||
|
|
||||||
|
|
||||||
|
def OnBufferDelete( self, deleted_buffer_file ):
|
||||||
|
self.completer.DeleteCachesForFile( deleted_buffer_file )
|
||||||
|
|
||||||
|
|
||||||
def DiagnosticsForCurrentFileReady( self ):
|
def DiagnosticsForCurrentFileReady( self ):
|
||||||
if not self.parse_future:
|
if not self.parse_future:
|
||||||
return False
|
return False
|
||||||
|
@ -139,6 +139,13 @@ class YouCompleteMe( object ):
|
|||||||
self.GetFiletypeCompleter().OnFileReadyToParse()
|
self.GetFiletypeCompleter().OnFileReadyToParse()
|
||||||
|
|
||||||
|
|
||||||
|
def OnBufferDelete( self, deleted_buffer_file ):
|
||||||
|
self.identcomp.OnBufferDelete( deleted_buffer_file )
|
||||||
|
|
||||||
|
if self.FiletypeCompletionUsable():
|
||||||
|
self.GetFiletypeCompleter().OnBufferDelete( deleted_buffer_file )
|
||||||
|
|
||||||
|
|
||||||
def OnInsertLeave( self ):
|
def OnInsertLeave( self ):
|
||||||
self.identcomp.OnInsertLeave()
|
self.identcomp.OnInsertLeave()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user