| 
					
				 | 
			
			
				@@ -0,0 +1,146 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Protocol Buffers - Google's data interchange format 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Copyright 2012 Google Inc.  All rights reserved. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// http://code.google.com/p/protobuf/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Redistribution and use in source and binary forms, with or without 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// modification, are permitted provided that the following conditions are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// met: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     * Redistributions of source code must retain the above copyright 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// notice, this list of conditions and the following disclaimer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     * Redistributions in binary form must reproduce the above 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// copyright notice, this list of conditions and the following disclaimer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// in the documentation and/or other materials provided with the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// distribution. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     * Neither the name of Google Inc. nor the names of its 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// contributors may be used to endorse or promote products derived from 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// this software without specific prior written permission. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// This file is an internal atomic implementation, use atomicops.h instead. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// For _smp_cmpxchg() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <pthread.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace google { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace protobuf { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace internal { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 QNXCmpxchg(Atomic32 old_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           Atomic32 new_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           volatile Atomic32* ptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return static_cast<Atomic32>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      _smp_cmpxchg((volatile unsigned *)ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   (unsigned)old_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   (unsigned)new_value)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         Atomic32 old_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         Atomic32 new_value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Atomic32 prev_value = *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  do { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!QNXCmpxchg(old_value, new_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const_cast<Atomic32*>(ptr))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return old_value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    prev_value = *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } while (prev_value == old_value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return prev_value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         Atomic32 new_value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Atomic32 old_value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  do { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    old_value = *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } while (QNXCmpxchg(old_value, new_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      const_cast<Atomic32*>(ptr))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return old_value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          Atomic32 increment) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return Barrier_AtomicIncrement(ptr, increment); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        Atomic32 increment) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (;;) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Atomic exchange the old value with an incremented one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Atomic32 old_value = *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Atomic32 new_value = old_value + increment; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (QNXCmpxchg(old_value, new_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   const_cast<Atomic32*>(ptr)) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // The exchange took place as expected. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return new_value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Otherwise, *ptr changed mid-loop and we need to retry. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                       Atomic32 old_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                       Atomic32 new_value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return NoBarrier_CompareAndSwap(ptr, old_value, new_value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                       Atomic32 old_value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                       Atomic32 new_value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return NoBarrier_CompareAndSwap(ptr, old_value, new_value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *ptr = value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline void MemoryBarrier() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  __sync_synchronize(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *ptr = value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  MemoryBarrier(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  MemoryBarrier(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *ptr = value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Atomic32 value = *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  MemoryBarrier(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+inline Atomic32 Release_Load(volatile const Atomic32* ptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  MemoryBarrier(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}  // namespace internal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}  // namespace protobuf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}  // namespace google 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif  // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ 
			 |