| /*----------------------------------------------------------------------------*/ |
| /* Copyright (c) FIRST 2008. All Rights Reserved. */ |
| /* Open Source Software - may be modified and shared by FRC teams. The code */ |
| /* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */ |
| /*----------------------------------------------------------------------------*/ |
| |
| #include "Synchronized.h" |
| |
| /** |
| * Synchronized class deals with critical regions. |
| * Declare a Synchronized object at the beginning of a block. That will take the semaphore. |
| * When the code exits from the block it will call the destructor which will give the semaphore. |
| * This ensures that no matter how the block is exited, the semaphore will always be released. |
| * Use the CRITICAL_REGION(SEM_ID) and END_REGION macros to make the code look cleaner (see header file) |
| * @param semaphore The semaphore controlling this critical region. |
| */ |
| Synchronized::Synchronized(SEM_ID semaphore) |
| { |
| m_semaphore = semaphore; |
| semTake(m_semaphore, WAIT_FOREVER); |
| } |
| |
| Synchronized::Synchronized(const ReentrantSemaphore& semaphore) |
| { |
| m_semaphore = semaphore.m_semaphore; |
| semTake(m_semaphore, WAIT_FOREVER); |
| } |
| |
| /** |
| * This destructor unlocks the semaphore. |
| */ |
| Synchronized::~Synchronized() |
| { |
| semGive(m_semaphore); |
| } |