This is the latest WPILib src, VisionSample2013, cRIO image, ... pulled down from firstforge.wpi.edu.

There might be risks in using the top of tree rather than an official release, but the commit messages do mention fixes for some deadlocks and race conditions.

git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4066 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/azaleasource/WPILibCProgramming/trunk/WPILib/Synchronized.cpp b/azaleasource/WPILibCProgramming/trunk/WPILib/Synchronized.cpp
new file mode 100644
index 0000000..4043871
--- /dev/null
+++ b/azaleasource/WPILibCProgramming/trunk/WPILib/Synchronized.cpp
@@ -0,0 +1,35 @@
+/*----------------------------------------------------------------------------*/

+/* 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(ReentrantSemaphore& semaphore)

+{

+	m_semaphore = semaphore.m_semaphore;

+	semTake(m_semaphore, WAIT_FOREVER);

+}

+

+/**

+ * This destructor unlocks the semaphore.

+ */

+Synchronized::~Synchronized()

+{

+	semGive(m_semaphore);

+}