Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
e9ee3096
Commit
e9ee3096
authored
Jan 10, 2013
by
liujisi@google.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add missing qnx files.
parent
4d8c2f94
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
146 additions
and
0 deletions
+146
-0
atomicops_internals_arm_qnx.h
src/google/protobuf/stubs/atomicops_internals_arm_qnx.h
+146
-0
No files found.
src/google/protobuf/stubs/atomicops_internals_arm_qnx.h
0 → 100644
View file @
e9ee3096
// 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_
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment