Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[APPROVAL] review/bsl-arm-atomics-drqs40879968 to master
Conflicts:
	etc/default.opts
	groups/bsl/bsls/bsls.gyp
  • Loading branch information
abeels committed Jan 16, 2014
2 parents b1e1062 + 169ca91 commit 715f48d
Show file tree
Hide file tree
Showing 10 changed files with 671 additions and 18 deletions.
24 changes: 17 additions & 7 deletions groups/bsl/bsls/bsls_alignmentfromtype.t.cpp
Expand Up @@ -739,27 +739,37 @@ int main(int argc, char *argv[])
ASSERT(sameType(bsls::AlignmentFromType<double>::Type(), long()));
ASSERT(sameType(bsls::AlignmentFromType<long double>::Type(), LD));
#else
#if defined(BSLS_PLATFORM_OS_CYGWIN)
#if defined(BSLS_PLATFORM_CPU_ARM)
ASSERT(sameType(bsls::AlignmentFromType<long long>::Type(),
LL));
ASSERT(sameType(bsls::AlignmentFromType<double>::Type(),
LL));
#elif defined(BSLS_PLATFORM_OS_CYGWIN)
ASSERT(sameType(bsls::AlignmentFromType<long long>::Type(),
_8BAT));
ASSERT(sameType(bsls::AlignmentFromType<double>::Type(),
_8BAT));
#else
#else
ASSERT(sameType(bsls::AlignmentFromType<long long>::Type(),
int()));
ASSERT(sameType(bsls::AlignmentFromType<double>::Type(),
int()));
#endif
#if defined(BSLS_PLATFORM_OS_LINUX) \
|| defined(BSLS_PLATFORM_OS_CYGWIN)
#endif
#if defined(BSLS_PLATFORM_OS_LINUX) || defined(BSLS_PLATFORM_OS_CYGWIN)
#if defined(BSLS_PLATFORM_CPU_ARM)
ASSERT(
sameType(bsls::AlignmentFromType<long double>::Type(),
int()));
LL));
#else
ASSERT(
sameType(bsls::AlignmentFromType<long double>::Type(),
LD));
int()));
#endif
#else
ASSERT(
sameType(bsls::AlignmentFromType<long double>::Type(),
LD));
#endif
#endif
#elif defined(BSLS_PLATFORM_OS_AIX)
#if defined(BSLS_PLATFORM_CPU_64_BIT)
Expand Down
21 changes: 18 additions & 3 deletions groups/bsl/bsls/bsls_alignmenttotype.t.cpp
Expand Up @@ -595,21 +595,36 @@ int main(int argc, char *argv[])
sameType(bsls::AlignmentToType<LONG_DOUBLE_ALIGNMENT>::Type(),
LD));
#else
#if defined(BSLS_PLATFORM_CPU_ARM)
LOOP_ASSERT(INT64_ALIGNMENT,
sameType(bsls::AlignmentToType<INT64_ALIGNMENT>::Type(),
LL));
LOOP_ASSERT(DOUBLE_ALIGNMENT,
sameType(bsls::AlignmentToType<DOUBLE_ALIGNMENT>::Type(),
LL));
#else
LOOP_ASSERT(INT64_ALIGNMENT,
sameType(bsls::AlignmentToType<INT64_ALIGNMENT>::Type(),
int()));
LOOP_ASSERT(DOUBLE_ALIGNMENT,
sameType(bsls::AlignmentToType<DOUBLE_ALIGNMENT>::Type(),
int()));
#endif

#ifdef BSLS_PLATFORM_OS_LINUX
#if defined(BSLS_PLATFORM_OS_LINUX)
#if defined(BSLS_PLATFORM_CPU_ARM)
LOOP_ASSERT(LONG_DOUBLE_ALIGNMENT,
sameType(bsls::AlignmentToType<LONG_DOUBLE_ALIGNMENT>::Type(),
int()));
LL));
#else
LOOP_ASSERT(LONG_DOUBLE_ALIGNMENT,
sameType(bsls::AlignmentToType<LONG_DOUBLE_ALIGNMENT>::Type(),
LD));
int()));
#endif
#else
LOOP_ASSERT(LONG_DOUBLE_ALIGNMENT,
sameType(bsls::AlignmentToType<LONG_DOUBLE_ALIGNMENT>::Type(),
LD));
#endif
#endif
#elif defined(BSLS_PLATFORM_OS_AIX)
Expand Down
53 changes: 46 additions & 7 deletions groups/bsl/bsls/bsls_atomic.t.cpp
Expand Up @@ -2,18 +2,24 @@
#include <bsls_atomic.h>

#include <bsls_types.h>
#include <bsls_platform.h>

#include <stdlib.h> // atoi(), rand()
#include <iostream>

// For thread support
#ifdef BSLS_PLATFORM_OS_WINDOWS
#include <windows.h>
# include <windows.h>

typedef HANDLE thread_t;

#else
#include <pthread.h>
#include <unistd.h>
# include <pthread.h>
# include <unistd.h>
# include <sched.h> // sched_yield

typedef pthread_t thread_t;

#endif

using namespace BloombergLP;
Expand Down Expand Up @@ -162,6 +168,17 @@ typedef bsls::Types::Int64 Int64;

namespace {

const int g_spinCount = 100;

void yield()
{
#ifdef BSLS_PLATFORM_OS_WINDOWS
SwitchToThread();
#else
sched_yield();
#endif
}

template <class INT>
struct LockData
{
Expand Down Expand Up @@ -192,12 +209,17 @@ class PetersonsLock
d().flags[d_id].storeRelaxed(1);
d().turn.swapAcqRel(1 - d_id);

int spin = g_spinCount;

while (d().flags[1 - d_id].loadAcquire()
&& d().turn.loadAcquire() == 1 - d_id)
// Contrary to justsoftwaresolutions 'turn' load needs to be
// 'loadAcquire'.
{
continue;
if (--spin == 0) {
yield();
spin = g_spinCount;
}
}
}

Expand Down Expand Up @@ -236,9 +258,14 @@ class PetersonsLockSeqCst
d().flags[d_id] = 1;
d().turn.swap(1 - d_id);

int spin = g_spinCount;

while (d().flags[1 - d_id] && d().turn == 1 - d_id)
{
continue;
if (--spin == 0) {
yield();
spin = g_spinCount;
}
}
}

Expand Down Expand Up @@ -356,7 +383,7 @@ void joinThread(thread_t thr)

void sleepSeconds(int sec)
{
#if defined(BSLS_PLATFORM_OS_WINDOWS)
#ifdef BSLS_PLATFORM_OS_WINDOWS
Sleep(sec * 1000);
#else
sleep(sec);
Expand Down Expand Up @@ -463,11 +490,18 @@ void testSharedCountWrite(int& data,
bsls::AtomicInt& done,
int)
{
int spin = g_spinCount;

while (!done.loadRelaxed()) {
while (shared.loadRelaxed() > 1) {
const_cast<int volatile &>(data) = shared.loadRelaxed();
shared.addAcqRel(-1); // plays the role of store release
}

if (--spin == 0) {
yield();
spin = g_spinCount;
}
}
}

Expand All @@ -479,8 +513,13 @@ void testSharedCountRead(int& data,
for (int i = 0; i < iterations; ++i) {
shared.storeRelease(10);

int spin = g_spinCount;

while (shared.loadRelaxed() != 1) {
;
if (--spin == 0) {
yield();
spin = g_spinCount;
}
}

if (shared.addAcqRel(-1) == 0) { // plays the role of load acquire
Expand Down
7 changes: 7 additions & 0 deletions groups/bsl/bsls/bsls_atomicoperations.h
Expand Up @@ -730,6 +730,13 @@ BSLS_IDENT("$Id: $")
#elif defined(BSLS_PLATFORM_CPU_IA64) && defined(BSLS_PLATFORM_OS_HPUX)
# include <bsls_atomicoperations_ia64_hp_acc.h>

#elif defined(BSLS_PLATFORM_CPU_ARM)
# if defined(BSLS_PLATFORM_CMP_GNU) || defined(BSLS_PLATFORM_CMP_CLANG)
# include <bsls_atomicoperations_arm_all_gcc.h>
# else
# define BSLS_ATOMICOPERATIONS_ERROR
# endif

#else
# define BSLS_ATOMICOPERATIONS_ERROR
#endif
Expand Down
37 changes: 37 additions & 0 deletions groups/bsl/bsls/bsls_atomicoperations_arm_all_gcc.cpp
@@ -0,0 +1,37 @@
// bsls_atomicoperations_arm_all_gcc.cpp -*-C++-*-

#include <bsls_atomicoperations_arm_all_gcc.h>

#include <bsls_ident.h>
BSLS_IDENT("$Id$ $CSID$")

#if defined(BSLS_PLATFORM_CPU_ARM) \
&& (defined(BSLS_PLATFORM_CMP_GNU) || defined(BSLS_PLATFORM_CMP_CLANG))

namespace BloombergLP {
} // close namespace BloombergLP

#endif

// ----------------------------------------------------------------------------
// Copyright (C) 2013 Bloomberg L.P.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
// ----------------------------- END-OF-FILE ----------------------------------

0 comments on commit 715f48d

Please sign in to comment.