mirror of
https://github.com/craigerl/aprsd.git
synced 2024-09-28 08:06:37 -04:00
Hemna
9bdfd166fd
The packet msgNo field is a string, but is typically is an integer counter to keep track of a specific packet id. The counter was returning an int, but the packet.msgNo is a string. So, when trying to delete a packet from the packet tracker, the key for accessing the packet is the msgNo, which has to be a string. Passing an int, will cause the packet tracker to not find the packet, and hence silently fail. This patch forces the msgNo counter to be a string.
49 lines
1.1 KiB
Python
49 lines
1.1 KiB
Python
from multiprocessing import RawValue
|
|
import threading
|
|
|
|
import wrapt
|
|
|
|
|
|
class PacketCounter:
|
|
"""
|
|
Global Packet id counter class.
|
|
|
|
This is a singleton based class that keeps
|
|
an incrementing counter for all packets to
|
|
be sent. All new Packet objects gets a new
|
|
message id, which is the next number available
|
|
from the PacketCounter.
|
|
|
|
"""
|
|
|
|
_instance = None
|
|
max_count = 9999
|
|
lock = threading.Lock()
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
"""Make this a singleton class."""
|
|
if cls._instance is None:
|
|
cls._instance = super().__new__(cls, *args, **kwargs)
|
|
cls._instance.val = RawValue("i", 1)
|
|
return cls._instance
|
|
|
|
@wrapt.synchronized(lock)
|
|
def increment(self):
|
|
if self.val.value == self.max_count:
|
|
self.val.value = 1
|
|
else:
|
|
self.val.value += 1
|
|
|
|
@property
|
|
@wrapt.synchronized(lock)
|
|
def value(self):
|
|
return str(self.val.value)
|
|
|
|
@wrapt.synchronized(lock)
|
|
def __repr__(self):
|
|
return str(self.val.value)
|
|
|
|
@wrapt.synchronized(lock)
|
|
def __str__(self):
|
|
return str(self.val.value)
|