mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
Initial checkin of unified hierarchy of WPILib 2015
This commit is contained in:
49
hal/Athena/src/main/native/cpp/Synchronized.cpp
Normal file
49
hal/Athena/src/main/native/cpp/Synchronized.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* 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 "HAL/cpp/Synchronized.h"
|
||||
#include "HAL/Semaphore.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(MUTEX_ID semaphore)
|
||||
{
|
||||
m_mutex = semaphore;
|
||||
m_semaphore = NULL;
|
||||
takeMutex(m_mutex, SEMAPHORE_WAIT_FOREVER);
|
||||
}
|
||||
|
||||
Synchronized::Synchronized(SEMAPHORE_ID semaphore)
|
||||
{
|
||||
m_mutex = NULL;
|
||||
m_semaphore = semaphore;
|
||||
takeSemaphore(m_semaphore, SEMAPHORE_WAIT_FOREVER);
|
||||
}
|
||||
|
||||
Synchronized::Synchronized(ReentrantSemaphore& semaphore)
|
||||
{
|
||||
m_mutex = semaphore.m_semaphore;
|
||||
m_semaphore = NULL;
|
||||
takeMutex(m_mutex, SEMAPHORE_WAIT_FOREVER);
|
||||
}
|
||||
|
||||
/**
|
||||
* This destructor unlocks the semaphore.
|
||||
*/
|
||||
Synchronized::~Synchronized()
|
||||
{
|
||||
if (m_mutex != NULL) {
|
||||
giveMutex(m_mutex);
|
||||
} else {
|
||||
giveSemaphore(m_semaphore);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user