Skip to content

Commit 2d1347f

Browse files
committed
Garbege collect closed file handles
Refactors TagFile to... 1. move file and mmap handle to __init__() to make clear, they are object-level attributes. 2. reset file and mmap handle to None after closing to make sure invalid access raises exceptions 3. rename those handles.
1 parent b777d82 commit 2d1347f

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

plugins/ctags.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -444,9 +444,6 @@ class TagFile(object):
444444
(prefix, suffix, exact), getting the directory of a tag and so forth.
445445
"""
446446

447-
file_o = None
448-
mapped = None
449-
450447
def __init__(self, path, column):
451448
"""
452449
Initialise object.
@@ -461,16 +458,18 @@ def __init__(self, path, column):
461458
"""
462459
self.path = path
463460
self.column = column
461+
self.file = None
462+
self.mmap = None
464463

465464
def __getitem__(self, index):
466465
"""
467466
Provide sequence-type interface to tag file.
468467
"""
469-
self.mapped.seek(index)
470-
result = self.mapped.readline()
468+
self.mmap.seek(index)
469+
result = self.mmap.readline()
471470

472471
if index != 0: # handle first line
473-
result = self.mapped.readline() # get a complete line
472+
result = self.mmap.readline() # get a complete line
474473

475474
result = result.strip()
476475
if not result:
@@ -482,7 +481,7 @@ def __len__(self):
482481
"""
483482
Get size of tag file in bytes.
484483
"""
485-
return len(self.mapped)
484+
return len(self.mmap)
486485

487486
def __enter__(self):
488487
"""
@@ -508,15 +507,17 @@ def open(self):
508507
"""
509508
Open file.
510509
"""
511-
self.file_o = open(self.path, "r", encoding="utf-8")
512-
self.mapped = mmap.mmap(self.file_o.fileno(), 0, access=mmap.ACCESS_READ)
510+
self.file = open(self.path, "r", encoding="utf-8")
511+
self.mmap = mmap.mmap(self.file.fileno(), 0, access=mmap.ACCESS_READ)
513512

514513
def close(self):
515514
"""
516515
Close file.
517516
"""
518-
self.mapped.close()
519-
self.file_o.close()
517+
self.mmap.close()
518+
self.mmap = None
519+
self.file.close()
520+
self.file = None
520521

521522
def search(self, exact_match=True, *tags):
522523
"""
@@ -529,8 +530,8 @@ def search(self, exact_match=True, *tags):
529530
:returns: matching tags
530531
"""
531532
if not tags:
532-
while self.mapped.tell() < self.mapped.size():
533-
result = Tag(self.mapped.readline().strip(), self.column)
533+
while self.mmap.tell() < self.mmap.size():
534+
result = Tag(self.mmap.readline().strip(), self.column)
534535
if result.line:
535536
yield result
536537
return
@@ -541,12 +542,12 @@ def search(self, exact_match=True, *tags):
541542
result = self[left_index]
542543
while result.line and result[result.column] == key:
543544
yield result
544-
result = Tag(self.mapped.readline().strip(), self.column)
545+
result = Tag(self.mmap.readline().strip(), self.column)
545546
else:
546547
result = self[left_index]
547548
while result.line and result[result.column].startswith(key):
548549
yield result
549-
result = Tag(self.mapped.readline().strip(), self.column)
550+
result = Tag(self.mmap.readline().strip(), self.column)
550551

551552
def search_by_suffix(self, suffix):
552553
"""
@@ -560,7 +561,7 @@ def search_by_suffix(self, suffix):
560561
561562
:returns: matching tags
562563
"""
563-
for line in self.file_o:
564+
for line in self.file:
564565
tag = Tag(line, self.column)
565566
if tag.key.endswith(suffix):
566567
yield tag

0 commit comments

Comments
 (0)