Skip to content

Commit dda78db

Browse files
authored
Merge pull request #250 from avinxshKD/fix/mkconcore-file-handle-leaks
Fix/mkconcore file handle leaks
2 parents 5612cfe + 64e483c commit dda78db

1 file changed

Lines changed: 67 additions & 56 deletions

File tree

mkconcore.py

Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
# - Sets the executable permission (`stat.S_IRWXU`) for the generated scripts on POSIX systems.
6464

6565
from bs4 import BeautifulSoup
66+
import atexit
6667
import logging
6768
import re
6869
import sys
@@ -129,13 +130,16 @@ def _resolve_concore_path():
129130
M_IS_OCTAVE = True #treat .m as octave 9/27/21
130131

131132
if os.path.exists(CONCOREPATH+"/concore.mcr"): # 11/12/21
132-
MCRPATH = open(CONCOREPATH+"/concore.mcr", "r").readline().strip() #path to local Ubunta Matlab Compiler Runtime
133+
with open(CONCOREPATH+"/concore.mcr", "r") as f:
134+
MCRPATH = f.readline().strip() #path to local Ubunta Matlab Compiler Runtime
133135

134136
if os.path.exists(CONCOREPATH+"/concore.sudo"): # 12/04/21
135-
DOCKEREXE = open(CONCOREPATH+"/concore.sudo", "r").readline().strip() #to omit sudo in docker
137+
with open(CONCOREPATH+"/concore.sudo", "r") as f:
138+
DOCKEREXE = f.readline().strip() #to omit sudo in docker
136139

137140
if os.path.exists(CONCOREPATH+"/concore.repo"): # 12/04/21
138-
DOCKEREPO = open(CONCOREPATH+"/concore.repo", "r").readline().strip() #docker id for repo
141+
with open(CONCOREPATH+"/concore.repo", "r") as f:
142+
DOCKEREPO = f.readline().strip() #docker id for repo
139143

140144

141145
prefixedgenode = ""
@@ -195,6 +199,12 @@ def _resolve_concore_path():
195199
funlock = open("unlock", "w") # 12/4/21
196200
fparams = open("params", "w") # 9/18/22
197201

202+
def cleanup_script_files():
203+
for fh in [fbuild, frun, fdebug, fstop, fclear, fmaxtime, funlock, fparams]:
204+
if not fh.closed:
205+
fh.close()
206+
atexit.register(cleanup_script_files)
207+
198208
os.mkdir("src")
199209
os.chdir("..")
200210

@@ -208,8 +218,8 @@ def _resolve_concore_path():
208218
logging.info(f"MCR path: {MCRPATH}")
209219
logging.info(f"Docker repository: {DOCKEREPO}")
210220

211-
f = open(GRAPHML_FILE, "r")
212-
text_str = f.read()
221+
with open(GRAPHML_FILE, "r") as f:
222+
text_str = f.read()
213223

214224
soup = BeautifulSoup(text_str, 'xml')
215225

@@ -455,121 +465,125 @@ def _resolve_concore_path():
455465
#copy proper concore.py into /src
456466
try:
457467
if concoretype=="docker":
458-
fsource = open(CONCOREPATH+"/concoredocker.py")
468+
with open(CONCOREPATH+"/concoredocker.py") as fsource:
469+
source_content = fsource.read()
459470
else:
460-
fsource = open(CONCOREPATH+"/concore.py")
471+
with open(CONCOREPATH+"/concore.py") as fsource:
472+
source_content = fsource.read()
461473
except (FileNotFoundError, IOError) as e:
462474
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
463475
quit()
464476
with open(outdir+"/src/concore.py","w") as fcopy:
465-
fcopy.write(fsource.read())
466-
fsource.close()
477+
fcopy.write(source_content)
467478

468479
#copy proper concore.hpp into /src 6/22/21
469480
try:
470481
if concoretype=="docker":
471-
fsource = open(CONCOREPATH+"/concoredocker.hpp")
482+
with open(CONCOREPATH+"/concoredocker.hpp") as fsource:
483+
source_content = fsource.read()
472484
else:
473-
fsource = open(CONCOREPATH+"/concore.hpp")
485+
with open(CONCOREPATH+"/concore.hpp") as fsource:
486+
source_content = fsource.read()
474487
except (FileNotFoundError, IOError) as e:
475488
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
476489
quit()
477490
with open(outdir+"/src/concore.hpp","w") as fcopy:
478-
fcopy.write(fsource.read())
479-
fsource.close()
491+
fcopy.write(source_content)
480492

481493
#copy proper concore.v into /src 6/25/21
482494
try:
483495
if concoretype=="docker":
484-
fsource = open(CONCOREPATH+"/concoredocker.v")
496+
with open(CONCOREPATH+"/concoredocker.v") as fsource:
497+
source_content = fsource.read()
485498
else:
486-
fsource = open(CONCOREPATH+"/concore.v")
499+
with open(CONCOREPATH+"/concore.v") as fsource:
500+
source_content = fsource.read()
487501
except (FileNotFoundError, IOError) as e:
488502
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
489503
quit()
490504
with open(outdir+"/src/concore.v","w") as fcopy:
491-
fcopy.write(fsource.read())
492-
fsource.close()
505+
fcopy.write(source_content)
493506

494507
#copy mkcompile into /src 5/27/21
495508
try:
496-
fsource = open(CONCOREPATH+"/mkcompile")
509+
with open(CONCOREPATH+"/mkcompile") as fsource:
510+
source_content = fsource.read()
497511
except (FileNotFoundError, IOError) as e:
498512
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
499513
quit()
500514
with open(outdir+"/src/mkcompile","w") as fcopy:
501-
fcopy.write(fsource.read())
502-
fsource.close()
515+
fcopy.write(source_content)
503516
os.chmod(outdir+"/src/mkcompile",stat.S_IRWXU)
504517

505518
#copy concore*.m into /src 4/2/21
506519
try: #maxtime in matlab 11/22/21
507-
fsource = open(CONCOREPATH+"/concore_default_maxtime.m")
520+
with open(CONCOREPATH+"/concore_default_maxtime.m") as fsource:
521+
source_content = fsource.read()
508522
except (FileNotFoundError, IOError) as e:
509523
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
510524
quit()
511525
with open(outdir+"/src/concore_default_maxtime.m","w") as fcopy:
512-
fcopy.write(fsource.read())
513-
fsource.close()
526+
fcopy.write(source_content)
514527
try:
515-
fsource = open(CONCOREPATH+"/concore_unchanged.m")
528+
with open(CONCOREPATH+"/concore_unchanged.m") as fsource:
529+
source_content = fsource.read()
516530
except (FileNotFoundError, IOError) as e:
517531
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
518532
quit()
519533
with open(outdir+"/src/concore_unchanged.m","w") as fcopy:
520-
fcopy.write(fsource.read())
521-
fsource.close()
534+
fcopy.write(source_content)
522535
try:
523-
fsource = open(CONCOREPATH+"/concore_read.m")
536+
with open(CONCOREPATH+"/concore_read.m") as fsource:
537+
source_content = fsource.read()
524538
except (FileNotFoundError, IOError) as e:
525539
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
526540
quit()
527541
with open(outdir+"/src/concore_read.m","w") as fcopy:
528-
fcopy.write(fsource.read())
529-
fsource.close()
542+
fcopy.write(source_content)
530543
try:
531-
fsource = open(CONCOREPATH+"/concore_write.m")
544+
with open(CONCOREPATH+"/concore_write.m") as fsource:
545+
source_content = fsource.read()
532546
except (FileNotFoundError, IOError) as e:
533547
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
534548
quit()
535549
with open(outdir+"/src/concore_write.m","w") as fcopy:
536-
fcopy.write(fsource.read())
537-
fsource.close()
550+
fcopy.write(source_content)
538551
try: #4/9/21
539-
fsource = open(CONCOREPATH+"/concore_initval.m")
552+
with open(CONCOREPATH+"/concore_initval.m") as fsource:
553+
source_content = fsource.read()
540554
except (FileNotFoundError, IOError) as e:
541555
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
542556
quit()
543557
with open(outdir+"/src/concore_initval.m","w") as fcopy:
544-
fcopy.write(fsource.read())
545-
fsource.close()
558+
fcopy.write(source_content)
546559
try: #11/19/21
547-
fsource = open(CONCOREPATH+"/concore_iport.m")
560+
with open(CONCOREPATH+"/concore_iport.m") as fsource:
561+
source_content = fsource.read()
548562
except (FileNotFoundError, IOError) as e:
549563
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
550564
quit()
551565
with open(outdir+"/src/concore_iport.m","w") as fcopy:
552-
fcopy.write(fsource.read())
553-
fsource.close()
566+
fcopy.write(source_content)
554567
try: #11/19/21
555-
fsource = open(CONCOREPATH+"/concore_oport.m")
568+
with open(CONCOREPATH+"/concore_oport.m") as fsource:
569+
source_content = fsource.read()
556570
except (FileNotFoundError, IOError) as e:
557571
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
558572
quit()
559573
with open(outdir+"/src/concore_oport.m","w") as fcopy:
560-
fcopy.write(fsource.read())
561-
fsource.close()
574+
fcopy.write(source_content)
562575
try: # 4/4/21
563576
if concoretype=="docker":
564-
fsource = open(CONCOREPATH+"/import_concoredocker.m")
577+
with open(CONCOREPATH+"/import_concoredocker.m") as fsource:
578+
source_content = fsource.read()
565579
else:
566-
fsource = open(CONCOREPATH+"/import_concore.m")
580+
with open(CONCOREPATH+"/import_concore.m") as fsource:
581+
source_content = fsource.read()
567582
except (FileNotFoundError, IOError) as e:
568583
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
569584
quit()
570585
with open(outdir+"/src/import_concore.m","w") as fcopy:
571-
fcopy.write(fsource.read())
572-
fsource.close()
586+
fcopy.write(source_content)
573587

574588
# --- Generate iport and oport mappings ---
575589
logging.info("Generating iport/oport mappings...")
@@ -638,25 +652,27 @@ def _resolve_concore_path():
638652
if not os.path.exists(outdir+"/src/Dockerfile."+dockername): # 3/30/21
639653
try:
640654
if langext=="py":
641-
fsource = open(CONCOREPATH+"/Dockerfile.py")
655+
src_path = CONCOREPATH+"/Dockerfile.py"
642656
logging.info("assuming .py extension for Dockerfile")
643657
elif langext == "cpp": # 6/22/21
644-
fsource = open(CONCOREPATH+"/Dockerfile.cpp")
658+
src_path = CONCOREPATH+"/Dockerfile.cpp"
645659
logging.info("assuming .cpp extension for Dockerfile")
646660
elif langext == "v": # 6/26/21
647-
fsource = open(CONCOREPATH+"/Dockerfile.v")
661+
src_path = CONCOREPATH+"/Dockerfile.v"
648662
logging.info("assuming .v extension for Dockerfile")
649663
elif langext == "sh": # 5/19/21
650-
fsource = open(CONCOREPATH+"/Dockerfile.sh")
664+
src_path = CONCOREPATH+"/Dockerfile.sh"
651665
logging.info("assuming .sh extension for Dockerfile")
652666
else:
653-
fsource = open(CONCOREPATH+"/Dockerfile.m")
667+
src_path = CONCOREPATH+"/Dockerfile.m"
654668
logging.info("assuming .m extension for Dockerfile")
669+
with open(src_path) as fsource:
670+
source_content = fsource.read()
655671
except:
656672
logging.error(f"{CONCOREPATH} is not correct path to concore")
657673
quit()
658674
with open(outdir+"/src/Dockerfile."+dockername,"w") as fcopy:
659-
fcopy.write(fsource.read())
675+
fcopy.write(source_content)
660676
if langext=="py":
661677
fcopy.write('CMD ["python", "-i", "'+sourcecode+'"]\n')
662678
if langext=="m":
@@ -667,7 +683,6 @@ def _resolve_concore_path():
667683
if langext=="v":
668684
fcopy.write('RUN iverilog ./'+sourcecode+'\n') # 7/02/21
669685
fcopy.write('CMD ["./a.out"]\n') # 7/02/21
670-
fsource.close()
671686

672687
fbuild.write('#!/bin/bash' + "\n")
673688
for node in nodes_dict:
@@ -1198,10 +1213,6 @@ def _resolve_concore_path():
11981213
frun.close()
11991214
fbuild.close()
12001215
fdebug.close()
1201-
fstop.close()
1202-
fclear.close()
1203-
fmaxtime.close()
1204-
fparams.close()
12051216
if concoretype != "windows":
12061217
os.chmod(outdir+"/build",stat.S_IRWXU)
12071218
os.chmod(outdir+"/run",stat.S_IRWXU)

0 commit comments

Comments
 (0)