Skip to content

Commit c5995ae

Browse files
committed
Kernel.py: wait for thread when exiting
Wait for thread loop to return when exiting
1 parent 7519836 commit c5995ae

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

pimdm/Kernel.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ def __init__(self, kernel_socket):
5151
self.tree_logger = Main.logger.getChild('KernelTree')
5252

5353
# receive signals from kernel with a background thread
54-
handler_thread = Thread(target=self.handler)
55-
handler_thread.daemon = True
56-
handler_thread.start()
54+
self.handler_thread = Thread(target=self.handler)
55+
self.handler_thread.daemon = True
56+
self.handler_thread.start()
5757

5858
'''
5959
Structure to create/remove virtual interfaces
@@ -177,9 +177,14 @@ def remove_multicast_route(self, kernel_entry: KernelEntry):
177177
raise NotImplementedError
178178

179179
@abstractmethod
180-
def exit(self):
180+
def close_socket(self):
181181
raise NotImplementedError
182182

183+
def exit(self):
184+
self.running = False
185+
self.close_socket()
186+
self.handler_thread.join()
187+
183188
@abstractmethod
184189
def handler(self):
185190
raise NotImplementedError
@@ -412,12 +417,15 @@ def remove_multicast_route(self, kernel_entry: KernelEntry):
412417
if len(self.routing[kernel_entry.source_ip]) == 0:
413418
self.routing.pop(kernel_entry.source_ip)
414419

415-
def exit(self):
416-
self.running = False
420+
def close_socket(self):
421+
with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IGMP) as s:
422+
s.sendto(b'', ('', 0))
423+
self.socket.close()
417424

425+
def exit(self):
418426
# MRT DONE
419427
self.socket.setsockopt(socket.IPPROTO_IP, self.MRT_DONE, 1)
420-
self.socket.close()
428+
super().exit()
421429

422430

423431
'''
@@ -660,12 +668,15 @@ def remove_multicast_route(self, kernel_entry: KernelEntry):
660668
if len(self.routing[kernel_entry.source_ip]) == 0:
661669
self.routing.pop(kernel_entry.source_ip)
662670

663-
def exit(self):
664-
self.running = False
671+
def close_socket(self):
672+
with socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_ICMPV6) as s:
673+
s.sendto(b'0000', ('', 0))
674+
self.socket.close()
665675

676+
def exit(self):
666677
# MRT DONE
667678
self.socket.setsockopt(socket.IPPROTO_IPV6, self.MRT6_DONE, 1)
668-
self.socket.close()
679+
super().exit()
669680

670681
'''
671682
/*

pimdm/Run.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,33 +180,28 @@ def main():
180180

181181
if args.start:
182182
start()
183-
sys.exit(0)
184183
elif args.stop:
185184
client_socket(args)
186-
sys.exit(0)
187185
elif args.config:
188186
try:
189187
from pimdm import Config
190188
conf_file_path = os.path.abspath(args.config[0])
191189
pim_globals.MULTICAST_TABLE_ID, pim_globals.UNICAST_TABLE_ID = Config.get_vrfs(conf_file_path)
192190
start(conf_file_path)
193191
except (ImportError, ModuleNotFoundError):
194-
sys.exit("PYYAML needs to be installed. Execute \"pip3 install pyyaml\"")
192+
raise Exception("PYYAML needs to be installed. Execute \"pip3 install pyyaml\"")
195193
elif args.verbose:
196194
os.system("tail -f {}".format(PROCESS_LOG_STDOUT_FILE.format(pim_globals.MULTICAST_TABLE_ID)))
197-
sys.exit(0)
198195
elif args.multicast_routes:
199196
if args.ipv4 or not args.ipv6:
200197
os.system("ip mroute show table " + str(pim_globals.MULTICAST_TABLE_ID))
201198
elif args.ipv6:
202199
os.system("ip -6 mroute show table " + str(pim_globals.MULTICAST_TABLE_ID))
203-
sys.exit(0)
204200
elif not is_running():
205201
print("PIM-DM is not running")
206202
parser.print_usage()
207-
sys.exit(0)
208-
209-
client_socket(args)
203+
else:
204+
client_socket(args)
210205

211206
def process_file_path():
212207
return os.path.join(PROCESS_DIRECTORY, str(pim_globals.MULTICAST_TABLE_ID))

0 commit comments

Comments
 (0)