Source code for spinnman.utilities.appid_tracker

# Copyright (c) 2017-2019 The University of Manchester
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

_MIN_APP_ID = 17
_MAX_APP_ID = 254


[docs]class AppIdTracker(object): """ A tracker of application IDs to make it easier to allocate new IDs. """ __slots__ = [ "_free_ids", "_max_app_id", "_min_app_id"] # Keep a class-global reference to the free ID range, so IDs are # allocated globally def __init__( self, app_ids_in_use=None, min_app_id=_MIN_APP_ID, max_app_id=_MAX_APP_ID): """ :param app_ids_in_use: The IDs that are already in use :type app_ids_in_use: list[int] or None :param min_app_id: The smallest application ID to use :type min_app_id: int :param max_app_id: The largest application ID to use :type max_app_id: int """ self._free_ids = set(range(min_app_id, max_app_id)) if app_ids_in_use is not None: self._free_ids.difference_update(app_ids_in_use) self._min_app_id = min_app_id self._max_app_id = max_app_id
[docs] def get_new_id(self): """ Get a new unallocated ID :rtype: int """ return self._free_ids.pop()
[docs] def allocate_id(self, allocated_id): """ Allocate a given ID. :param allocated_id: The ID to allocate :raises KeyError: If the ID is not present """ self._free_ids.remove(allocated_id)
[docs] def free_id(self, id_to_free): """ Free a given ID. :param id_to_free: The ID to free :raises KeyError: If the ID is out of range """ if id_to_free < self._min_app_id or id_to_free > self._max_app_id: raise KeyError("ID {} out of allowed range of {} to {}".format( id_to_free, self._min_app_id, self._max_app_id)) self._free_ids.add(id_to_free)