Source code for simulator.core.DtnSemaphore
# -*- coding: utf-8 -*-
from simulator.core.DtnCore import Simulable
[docs]class DtnSemaphore(Simulable):
""" Semaphore for a simpy simulation
The semaphore controller can turn the semaphore green/red by simply doing
``semaphore.turn_green()`` or ``semaphore.turn_red()``
Users that want to cross the semaphore have to first see if it is green by
doing: ``if semaphore.is_red: yield semaphore.green``
Users can only wait until the semaphore turns red by doing
``if semaphore.is_green: yield semaphore.red``
.. Warning:: User **must** always check the state of the semaphore before yielding to green.
If you yield an event that has already that has already succeed, it will crash
"""
def __init__(self, env, green=False):
super().__init__(env)
# Initialize variables
self.green = env.event()
self.red = env.event()
# Set the initial state. Do not use the turn_red/green() functions
# because you do not want to check if things are processed at this point
if green: self.green.succeed()
else: self.red.succeed()
def turn_green(self):
# Prevent turning green if already green
if self.green.triggered: return
# Indicate not green state
self.red = self.env.event()
# Succeed the green event
self.green.succeed()
def turn_red(self):
# Prevent turning red if already red
if self.red.triggered: return
# Indicate red state
self.red.succeed()
# Create a new event to stop everyone
self.green = self.env.event()
@property
def is_green(self):
return self.green.triggered
@property
def is_red(self):
return self.red.triggered
[docs]class DtnSemaphoreOld(Simulable):
""" Semaphore for a simpy simulation
The semaphore controller can turn the semaphore green/red by simply doing
``semaphore.turn_green()`` or ``semaphore.turn_red()``
Users that want to cross the semaphore have to first see if the semaphore
is green. For that they can do ``if semaphore.red: yield semaphore.green``
.. Warning:: User **must** always check if the semaphore is red before yielding to green.
In other words, the ``if semaphore.red:`` part is mandatory, if you ``yield``
and the semaphore is green, it will crash
"""
def __init__(self, env, green=False):
super().__init__(env)
# Flag that is true if the semaphore is red
self.red = True
# Event used to stop everyone at the semaphore
self.green = env.event()
# If the semaphore should be green, note it
if green: self.turn_green()
def turn_green(self):
# Indicate not green state
self.red = False
# Succeed the green event
self.green.succeed()
def turn_red(self):
# Indicate red state
self.red = True
# Create a new event to stop everyone
self.green = self.env.event()
@property
def is_green(self):
return not self.red
@property
def is_red(self):
return self.red