Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
L
libzmq
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
libzmq
Commits
016df8e8
Commit
016df8e8
authored
Apr 24, 2012
by
Ian Barber
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #322 from tranthamp/master
Atomic operations for armv7a
parents
c120f02d
135fdab0
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
67 additions
and
0 deletions
+67
-0
atomic_counter.hpp
src/atomic_counter.hpp
+32
-0
atomic_ptr.hpp
src/atomic_ptr.hpp
+35
-0
No files found.
src/atomic_counter.hpp
View file @
016df8e8
...
...
@@ -29,6 +29,8 @@
#define ZMQ_ATOMIC_COUNTER_MUTEX
#elif (defined __i386__ || defined __x86_64__) && defined __GNUC__
#define ZMQ_ATOMIC_COUNTER_X86
#elif defined __ARM_ARCH_7A__ && defined __GNUC__
#define ZMQ_ATOMIC_COUNTER_ARM
#elif defined ZMQ_HAVE_WINDOWS
#define ZMQ_ATOMIC_COUNTER_WINDOWS
#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD)
...
...
@@ -88,6 +90,19 @@ namespace zmq
:
"=r"
(
old_value
),
"=m"
(
value
)
:
"0"
(
increment_
),
"m"
(
value
)
:
"cc"
,
"memory"
);
#elif defined ZMQ_ATOMIC_COUNTER_ARM
integer_t
flag
,
tmp
;
__asm__
volatile
(
" dmb sy
\n\t
"
"1: ldrex %0, [%5]
\n\t
"
" add %2, %0, %4
\n\t
"
" strex %1, %2, [%5]
\n\t
"
" teq %1, #0
\n\t
"
" bne 1b
\n\t
"
" dmb sy
\n\t
"
:
"=&r"
(
old_value
),
"=&r"
(
flag
),
"=&r"
(
tmp
),
"+Qo"
(
value
)
:
"Ir"
(
increment_
),
"r"
(
&
value
)
:
"cc"
);
#elif defined ZMQ_ATOMIC_COUNTER_MUTEX
sync
.
lock
();
old_value
=
value
;
...
...
@@ -118,6 +133,20 @@ namespace zmq
:
"0"
(
oldval
),
"m"
(
*
val
)
:
"cc"
,
"memory"
);
return
oldval
!=
decrement
;
#elif defined ZMQ_ATOMIC_COUNTER_ARM
integer_t
old_value
,
flag
,
tmp
;
__asm__
volatile
(
" dmb sy
\n\t
"
"1: ldrex %0, [%5]
\n\t
"
" sub %2, %0, %4
\n\t
"
" strex %1, %2, [%5]
\n\t
"
" teq %1, #0
\n\t
"
" bne 1b
\n\t
"
" dmb sy
\n\t
"
:
"=&r"
(
old_value
),
"=&r"
(
flag
),
"=&r"
(
tmp
),
"+Qo"
(
value
)
:
"Ir"
(
decrement
),
"r"
(
&
value
)
:
"cc"
);
return
old_value
-
decrement
!=
0
;
#elif defined ZMQ_ATOMIC_COUNTER_MUTEX
sync
.
lock
();
value
-=
decrement
;
...
...
@@ -157,6 +186,9 @@ namespace zmq
#if defined ZMQ_ATOMIC_COUNTER_X86
#undef ZMQ_ATOMIC_COUNTER_X86
#endif
#if defined ZMQ_ATOMIC_COUNTER_ARM
#undef ZMQ_ATOMIC_COUNTER_ARM
#endif
#if defined ZMQ_ATOMIC_COUNTER_MUTEX
#undef ZMQ_ATOMIC_COUNTER_MUTEX
#endif
...
...
src/atomic_ptr.hpp
View file @
016df8e8
...
...
@@ -28,6 +28,8 @@
#define ZMQ_ATOMIC_PTR_MUTEX
#elif (defined __i386__ || defined __x86_64__) && defined __GNUC__
#define ZMQ_ATOMIC_PTR_X86
#elif defined __ARM_ARCH_7A__ && defined __GNUC__
#define ZMQ_ATOMIC_PTR_ARM
#elif defined ZMQ_HAVE_WINDOWS
#define ZMQ_ATOMIC_PTR_WINDOWS
#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD)
...
...
@@ -87,6 +89,20 @@ namespace zmq
:
"=r"
(
old
),
"=m"
(
ptr
)
:
"m"
(
ptr
),
"0"
(
val_
));
return
old
;
#elif defined ZMQ_ATOMIC_PTR_ARM
T
*
old
;
unsigned
int
flag
;
__asm__
volatile
(
" dmb sy
\n\t
"
"1: ldrex %1, [%3]
\n\t
"
" strex %0, %4, [%3]
\n\t
"
" teq %0, #0
\n\t
"
" bne 1b
\n\t
"
" dmb sy
\n\t
"
:
"=&r"
(
flag
),
"=&r"
(
old
),
"+Qo"
(
ptr
)
:
"r"
(
&
ptr
),
"r"
(
val_
)
:
"cc"
);
return
old
;
#elif defined ZMQ_ATOMIC_PTR_MUTEX
sync
.
lock
();
T
*
old
=
(
T
*
)
ptr
;
...
...
@@ -117,6 +133,22 @@ namespace zmq
:
"r"
(
val_
),
"m"
(
ptr
),
"0"
(
cmp_
)
:
"cc"
);
return
old
;
#elif defined ZMQ_ATOMIC_PTR_ARM
T
*
old
;
unsigned
int
flag
;
__asm__
volatile
(
" dmb sy
\n\t
"
"1: ldrex %1, [%3]
\n\t
"
" mov %0, #0
\n\t
"
" teq %1, %4
\n\t
"
" strexeq %0, %5, [%3]
\n\t
"
" teq %0, #0
\n\t
"
" bne 1b
\n\t
"
" dmb sy
\n\t
"
:
"=&r"
(
flag
),
"=&r"
(
old
),
"+Qo"
(
ptr
)
:
"r"
(
&
ptr
),
"r"
(
cmp_
),
"r"
(
val_
)
:
"cc"
);
return
old
;
#elif defined ZMQ_ATOMIC_PTR_MUTEX
sync
.
lock
();
T
*
old
=
(
T
*
)
ptr
;
...
...
@@ -152,6 +184,9 @@ namespace zmq
#if defined ZMQ_ATOMIC_PTR_X86
#undef ZMQ_ATOMIC_PTR_X86
#endif
#if defined ZMQ_ATOMIC_PTR_ARM
#undef ZMQ_ATOMIC_PTR_ARM
#endif
#if defined ZMQ_ATOMIC_PTR_MUTEX
#undef ZMQ_ATOMIC_PTR_MUTEX
#endif
...
...
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