Packages
rocksdb
1.1.0
3.1.1
3.1.0
3.0.0
2.6.2
2.6.1
retired
2.6.0
retired
2.5.0
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.0
0.26.2
0.26.1
0.26.0
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
RocksDB for Erlang
Current section
Files
Jump to
Current section
Files
c_src/detail.hpp
// -------------------------------------------------------------------
//
// eleveldb: Erlang Wrapper for LevelDB (http://code.google.com/p/leveldb/)
//
// Copyright (c) 2011-2013 Basho Technologies, Inc. All Rights Reserved.
//
// This file is provided to you under the Apache License,
// Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// -------------------------------------------------------------------
#pragma once
#ifndef __EROCKSDB_DETAIL_HPP
#define __EROCKSDB_DETAIL_HPP 1
#include <stdint.h>
#include <stddef.h>
/* These can be hopefully-replaced with constexpr or compile-time assert later: */
#if defined(OS_SOLARIS) || defined(SOLARIS) || defined(sun)
#define EROCKSDB_IS_SOLARIS 1
#else
#undef EROCKSDB_IS_SOLARIS
#endif
#ifdef EROCKSDB_IS_SOLARIS
#include <atomic.h>
#endif
namespace erocksdb {
// primary template
template <typename PtrT, typename ValueT>
inline bool compare_and_swap(volatile PtrT *ptr, const ValueT& comp_val, const ValueT& exchange_val);
// uint32 size (needed for solaris)
template <>
inline bool compare_and_swap(volatile uint32_t *ptr, const int& comp_val, const int& exchange_val)
{
#if EROCKSDB_IS_SOLARIS
return ((uint32_t) comp_val==atomic_cas_32(ptr, comp_val, exchange_val));
#else
return __sync_bool_compare_and_swap(ptr, comp_val, exchange_val);
#endif
}
// generic specification ... for pointers
template <typename PtrT, typename ValueT>
inline bool compare_and_swap(volatile PtrT *ptr, const ValueT& comp_val, const ValueT& exchange_val)
{
#if EROCKSDB_IS_SOLARIS
return (comp_val==atomic_cas_ptr(ptr, comp_val, exchange_val));
#else
return __sync_bool_compare_and_swap(ptr, comp_val, exchange_val);
#endif
}
template <typename ValueT>
inline ValueT inc_and_fetch(volatile ValueT *ptr);
template <>
inline uint64_t inc_and_fetch(volatile uint64_t *ptr)
{
#if EROCKSDB_IS_SOLARIS
return atomic_inc_64_nv(ptr);
#else
return __sync_add_and_fetch(ptr, 1);
#endif
}
template <>
inline uint32_t inc_and_fetch(volatile uint32_t *ptr)
{
#if EROCKSDB_IS_SOLARIS
return atomic_inc_32_nv(ptr);
#else
return __sync_add_and_fetch(ptr, 1);
#endif
}
#if defined(__APPLE__) || defined(__OpenBSD__) || (defined(__s390__) && !defined(__s390x__))
template <>
inline size_t inc_and_fetch(volatile size_t *ptr)
{
return __sync_add_and_fetch(ptr, 1);
}
#endif
template <typename ValueT>
inline ValueT dec_and_fetch(volatile ValueT *ptr);
template <>
inline uint64_t dec_and_fetch(volatile uint64_t *ptr)
{
#if EROCKSDB_IS_SOLARIS
return atomic_dec_64_nv(ptr);
#else
return __sync_sub_and_fetch(ptr, 1);
#endif
}
template <>
inline uint32_t dec_and_fetch(volatile uint32_t *ptr)
{
#if EROCKSDB_IS_SOLARIS
return atomic_dec_32_nv(ptr);
#else
return __sync_sub_and_fetch(ptr, 1);
#endif
}
#if defined(__APPLE__) || defined(__OpenBSD__) || (defined(__s390__) && !defined(__s390x__))
template <>
inline size_t dec_and_fetch(volatile size_t *ptr)
{
return __sync_sub_and_fetch(ptr, 1);
}
#endif
} // namespace erocksdb::detail
#endif