summaryrefslogtreecommitdiff
path: root/src/atomic_bitmap.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/atomic_bitmap.hpp')
-rw-r--r--src/atomic_bitmap.hpp310
1 files changed, 0 insertions, 310 deletions
diff --git a/src/atomic_bitmap.hpp b/src/atomic_bitmap.hpp
deleted file mode 100644
index 29bdc13..0000000
--- a/src/atomic_bitmap.hpp
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- Copyright (c) 2007-2010 iMatix Corporation
-
- This file is part of 0MQ.
-
- 0MQ is free software; you can redistribute it and/or modify it under
- the terms of the Lesser GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- 0MQ is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- Lesser GNU General Public License for more details.
-
- You should have received a copy of the Lesser GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __ZMQ_ATOMIC_BITMAP_HPP_INCLUDED__
-#define __ZMQ_ATOMIC_BITMAP_HPP_INCLUDED__
-
-#include "stdint.hpp"
-#include "platform.hpp"
-
-// These are the conditions to choose between different implementations
-// of atomic_bitmap.
-
-#if defined ZMQ_FORCE_MUTEXES
-#define ZMQ_ATOMIC_BITMAP_MUTEX
-#elif (defined __i386__ || defined __x86_64__) && defined __GNUC__
-#define ZMQ_ATOMIC_BITMAP_X86
-#elif 0 && defined __sparc__ && defined __GNUC__
-#define ZMQ_ATOMIC_BITMAP_SPARC
-#elif defined ZMQ_HAVE_WINDOWS
-#define ZMQ_ATOMIC_BITMAP_WINDOWS
-#elif defined sun
-#define ZMQ_ATOMIC_COUNTER_SUN
-#elif defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
-#define ZMQ_ATOMIC_COUNTER_GNU
-#else
-#define ZMQ_ATOMIC_BITMAP_MUTEX
-#endif
-
-#if defined ZMQ_ATOMIC_BITMAP_MUTEX
-#include "mutex.hpp"
-#elif defined ZMQ_ATOMIC_BITMAP_WINDOWS
-#include "windows.hpp"
-#elif defined ZMQ_ATOMIC_BITMAP_SUN
-#include <atomic.h>
-#endif
-
-namespace zmq
-{
-
- // This class encapuslates several bitwise atomic operations on unsigned
- // integer. Selection of operations is driven specifically by the needs
- // of ypollset implementation.
-
- class atomic_bitmap_t
- {
- public:
-
-#if (defined ZMQ_ATOMIC_BITMAP_X86 || defined ZMQ_FORCE_MUTEXES) \
- && defined __x86_64__
- typedef uint64_t bitmap_t;
-#else
- typedef uint32_t bitmap_t;
-#endif
-
- inline atomic_bitmap_t (bitmap_t value_ = 0) :
- value (value_)
- {
- }
-
- inline ~atomic_bitmap_t ()
- {
- }
-
- // Bit-test-set-and-reset. Sets one bit of the value and resets
- // another one. Returns the original value of the reset bit.
- inline bool btsr (int set_index_, int reset_index_)
- {
-#if defined ZMQ_ATOMIC_BITMAP_WINDOWS
- while (true) {
- bitmap_t oldval = value;
- bitmap_t newval = (oldval | (bitmap_t (1) << set_index_)) &
- ~(bitmap_t (1) << reset_index_);
- if (InterlockedCompareExchange ((volatile LONG*) &value, newval,
- oldval) == (LONG) oldval)
- return (oldval & (bitmap_t (1) << reset_index_)) ?
- true : false;
- }
-#elif defined ZMQ_ATOMIC_BITMAP_GNU
- while (true) {
- bitmap_t oldval = value;
- bitmap_t newval = (oldval | (bitmap_t (1) << set_index_)) &
- ~(bitmap_t (1) << reset_index_);
- if (__sync_val_compare_and_swap (&value, oldval, newval) == oldval)
- return (oldval & (bitmap_t (1) << reset_index_)) ?
- true : false;
- }
-#elif defined ZMQ_ATOMIC_BITMAP_SUN
- while (true) {
- bitmap_t oldval = value;
- bitmap_t newval = (oldval | (bitmap_t (1) << set_index_)) &
- ~(bitmap_t (1) << reset_index_);
- if (atomic_cas_32 (&value, oldval, newval) == oldval)
- return (oldval & (bitmap_t (1) << reset_index_)) ?
- true : false;
- }
-#elif defined ZMQ_ATOMIC_BITMAP_X86
- bitmap_t oldval, dummy;
- __asm__ volatile (
- "mov %0, %1\n\t"
- "1:"
- "mov %1, %2\n\t"
- "bts %3, %2\n\t"
- "btr %4, %2\n\t"
- "lock cmpxchg %2, %0\n\t"
- "jnz 1b\n\t"
- : "+m" (value), "=&a" (oldval), "=&r" (dummy)
- : "r" (bitmap_t(set_index_)), "r" (bitmap_t(reset_index_))
- : "cc");
- return (bool) (oldval & (bitmap_t(1) << reset_index_));
-#elif defined ZMQ_ATOMIC_BITMAP_SPARC
- volatile bitmap_t* valptr = &value;
- bitmap_t set_val = bitmap_t(1) << set_index_;
- bitmap_t reset_val = ~(bitmap_t(1) << reset_index_);
- bitmap_t tmp;
- bitmap_t oldval;
- __asm__ volatile(
- "ld [%5], %2 \n\t"
- "1: \n\t"
- "or %2, %0, %3 \n\t"
- "and %3, %1, %3 \n\t"
- "cas [%5], %2, %3 \n\t"
- "cmp %2, %3 \n\t"
- "bne,a,pn %%icc, 1b \n\t"
- "mov %3, %2 \n\t"
- : "+r" (set_val), "+r" (reset_val), "=&r" (tmp),
- "=&r" (oldval), "+m" (*valptr)
- : "r" (valptr)
- : "cc");
- return oldval;
-#elif defined ZMQ_ATOMIC_BITMAP_MUTEX
- sync.lock ();
- bitmap_t oldval = value;
- value = (oldval | (bitmap_t (1) << set_index_)) &
- ~(bitmap_t (1) << reset_index_);
- sync.unlock ();
- return (oldval & (bitmap_t (1) << reset_index_)) ? true : false;
-#else
-#error
-#endif
- }
-
- // Sets value to newval. Returns the original value.
- inline bitmap_t xchg (bitmap_t newval_)
- {
- bitmap_t oldval;
-#if defined ZMQ_ATOMIC_BITMAP_WINDOWS
- oldval = InterlockedExchange ((volatile LONG*) &value, newval_);
-#elif defined ZMQ_ATOMIC_BITMAP_GNU
- oldval = __sync_lock_test_and_set (&value, newval_);
-#elif defined ZMQ_ATOMIC_BITMAP_SUN
- oldval = atomic_swap_32 (&value, newval_);
-#elif defined ZMQ_ATOMIC_BITMAP_X86
- oldval = newval_;
- __asm__ volatile (
- "lock; xchg %0, %1"
- : "=r" (oldval)
- : "m" (value), "0" (oldval)
- : "memory");
-#elif defined ZMQ_ATOMIC_BITMAP_SPARC
- oldval = value;
- volatile bitmap_t* ptrin = &value;
- bitmap_t tmp;
- bitmap_t prev;
- __asm__ __volatile__(
- "ld [%4], %1\n\t"
- "1:\n\t"
- "mov %0, %2\n\t"
- "cas [%4], %1, %2\n\t"
- "cmp %1, %2\n\t"
- "bne,a,pn %%icc, 1b\n\t"
- "mov %2, %1\n\t"
- : "+r" (newval_), "=&r" (tmp), "=&r" (prev), "+m" (*ptrin)
- : "r" (ptrin)
- : "cc");
- return prev;
-#elif defined ZMQ_ATOMIC_BITMAP_MUTEX
- sync.lock ();
- oldval = value;
- value = newval_;
- sync.unlock ();
-#else
-#error
-#endif
- return oldval;
- }
-
- // izte is "if-zero-then-else" atomic operation - if the value is zero
- // it substitutes it by 'thenval' else it rewrites it by 'elseval'.
- // Original value of the integer is returned from this function.
- inline bitmap_t izte (bitmap_t thenval_,
- bitmap_t elseval_)
- {
-#if defined ZMQ_ATOMIC_BITMAP_WINDOWS
- while (true) {
- bitmap_t oldval = value;
- bitmap_t newval = oldval == 0 ? thenval_ : elseval_;
- if (InterlockedCompareExchange ((volatile LONG*) &value,
- newval, oldval) == (LONG) oldval)
- return oldval;
- }
-#elif defined ZMQ_ATOMIC_BITMAP_GNU
- while (true) {
- bitmap_t oldval = value;
- bitmap_t newval = oldval == 0 ? thenval_ : elseval_;
- if (__sync_val_compare_and_swap (&value, oldval, newval) == oldval)
- return oldval;
- }
-#elif defined ZMQ_ATOMIC_BITMAP_SUN
- while (true) {
- bitmap_t oldval = value;
- bitmap_t newval = oldval == 0 ? thenval_ : elseval_;
- if (atomic_cas_32 (&value, oldval, newval) == oldval)
- return oldval;
- }
-#elif defined ZMQ_ATOMIC_BITMAP_X86
- bitmap_t oldval;
- bitmap_t dummy;
- __asm__ volatile (
- "mov %0, %1\n\t"
- "1:"
- "mov %3, %2\n\t"
- "test %1, %1\n\t"
- "jz 2f\n\t"
- "mov %4, %2\n\t"
- "2:"
- "lock cmpxchg %2, %0\n\t"
- "jnz 1b\n\t"
- : "+m" (value), "=&a" (oldval), "=&r" (dummy)
- : "r" (thenval_), "r" (elseval_)
- : "cc");
- return oldval;
-#elif defined ZMQ_ATOMIC_BITMAP_SPARC
- volatile bitmap_t* ptrin = &value;
- bitmap_t tmp;
- bitmap_t prev;
- __asm__ __volatile__(
- "ld [%3], %0 \n\t"
- "mov 0, %1 \n\t"
- "cas [%3], %1, %4 \n\t"
- "cmp %0, %1 \n\t"
- "be,a,pn %%icc,1f \n\t"
- "ld [%3], %0 \n\t"
- "cas [%3], %0, %5 \n\t"
- "1: \n\t"
- : "=&r" (tmp), "=&r" (prev), "+m" (*ptrin)
- : "r" (ptrin), "r" (thenval_), "r" (elseval_)
- : "cc");
- return prev;
-#elif defined ZMQ_ATOMIC_BITMAP_MUTEX
- sync.lock ();
- bitmap_t oldval = value;
- value = oldval ? elseval_ : thenval_;
- sync.unlock ();
- return oldval;
-#else
-#error
-#endif
- }
-
- private:
-
- volatile bitmap_t value;
-#if defined ZMQ_ATOMIC_BITMAP_MUTEX
- mutex_t sync;
-#endif
-
- atomic_bitmap_t (const atomic_bitmap_t&);
- void operator = (const atomic_bitmap_t&);
- };
-
-}
-
-// Remove macros local to this file.
-#if defined ZMQ_ATOMIC_BITMAP_WINDOWS
-#undef ZMQ_ATOMIC_BITMAP_WINDOWS
-#endif
-#if defined ZMQ_ATOMIC_BITMAP_GNU
-#undef ZMQ_ATOMIC_BITMAP_GNU
-#endif
-#if defined ZMQ_ATOMIC_BITMAP_SUN
-#undef ZMQ_ATOMIC_BITMAP_SUN
-#endif
-#if defined ZMQ_ATOMIC_BITMAP_X86
-#undef ZMQ_ATOMIC_BITMAP_X86
-#endif
-#if defined ZMQ_ATOMIC_BITMAP_SPARC
-#undef ZMQ_ATOMIC_BITMAP_SPARC
-#endif
-#if defined ZMQ_ATOMIC_BITMAP_MUTEX
-#undef ZMQ_ATOMIC_BITMAP_MUTEX
-#endif
-
-#endif
-