_mutex_padding.h
Go to the documentation of this file.
/*
Copyright (c) 2005-2020 Intel Corporation
Licensed 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.
*/
#ifndef __TBB_mutex_padding_H
#define __TBB_mutex_padding_H
// wrapper for padding mutexes to be alone on a cache line, without requiring they be allocated
// from a pool. Because we allow them to be defined anywhere they must be two cache lines in size.
namespace tbb {
namespace interface7 {
namespace internal {
static const size_t cache_line_size = 64;
// Pad a mutex to occupy a number of full cache lines sufficient to avoid false sharing
// with other data; space overhead is up to 2*cache_line_size-1.
template<typename Mutex, bool is_rw> class padded_mutex;
template<typename Mutex>
class padded_mutex<Mutex,false> : tbb::internal::mutex_copy_deprecated_and_disabled {
typedef long pad_type;
pad_type my_pad[((sizeof(Mutex)+cache_line_size-1)/cache_line_size+1)*cache_line_size/sizeof(pad_type)];
Mutex *impl() { return (Mutex *)((uintptr_t(this)|(cache_line_size-1))+1);}
public:
static const bool is_rw_mutex = Mutex::is_rw_mutex;
static const bool is_recursive_mutex = Mutex::is_recursive_mutex;
static const bool is_fair_mutex = Mutex::is_fair_mutex;
padded_mutex() { new(impl()) Mutex(); }
~padded_mutex() { impl()->~Mutex(); }
class scoped_lock : tbb::internal::no_copy {
typename Mutex::scoped_lock my_scoped_lock;
public:
scoped_lock() : my_scoped_lock() {}
scoped_lock( padded_mutex& m ) : my_scoped_lock(*m.impl()) { }
~scoped_lock() { }
void acquire( padded_mutex& m ) { my_scoped_lock.acquire(*m.impl()); }
bool try_acquire( padded_mutex& m ) { return my_scoped_lock.try_acquire(*m.impl()); }
void release() { my_scoped_lock.release(); }
};
};
template<typename Mutex>
class padded_mutex<Mutex,true> : tbb::internal::mutex_copy_deprecated_and_disabled {
typedef long pad_type;
pad_type my_pad[((sizeof(Mutex)+cache_line_size-1)/cache_line_size+1)*cache_line_size/sizeof(pad_type)];
Mutex *impl() { return (Mutex *)((uintptr_t(this)|(cache_line_size-1))+1);}
public:
static const bool is_rw_mutex = Mutex::is_rw_mutex;
static const bool is_recursive_mutex = Mutex::is_recursive_mutex;
static const bool is_fair_mutex = Mutex::is_fair_mutex;
padded_mutex() { new(impl()) Mutex(); }
~padded_mutex() { impl()->~Mutex(); }
class scoped_lock : tbb::internal::no_copy {
typename Mutex::scoped_lock my_scoped_lock;
public:
scoped_lock() : my_scoped_lock() {}
scoped_lock( padded_mutex& m, bool write = true ) : my_scoped_lock(*m.impl(),write) { }
~scoped_lock() { }
void acquire( padded_mutex& m, bool write = true ) { my_scoped_lock.acquire(*m.impl(),write); }
bool try_acquire( padded_mutex& m, bool write = true ) { return my_scoped_lock.try_acquire(*m.impl(),write); }
bool upgrade_to_writer() { return my_scoped_lock.upgrade_to_writer(); }
bool downgrade_to_reader() { return my_scoped_lock.downgrade_to_reader(); }
void release() { my_scoped_lock.release(); }
};
};
} // namespace internal
} // namespace interface7
} // namespace tbb
#endif /* __TBB_mutex_padding_H */
tbb
The graph class.
Definition: serial/tbb/parallel_for.h:46
internal
Definition: _flow_graph_async_msg_impl.h:24
tbb::interface7::internal::cache_line_size
static const size_t cache_line_size
Definition: _mutex_padding.h:28
tbb::interface7::internal::padded_mutex
Definition: _mutex_padding.h:32
tbb::interface7::internal::padded_mutex< Mutex, false >::~padded_mutex
~padded_mutex()
Definition: _mutex_padding.h:47
tbb::interface7::internal::padded_mutex< Mutex, false >::padded_mutex
padded_mutex()
Definition: _mutex_padding.h:46
tbb::interface7::internal::padded_mutex< Mutex, false >::pad_type
long pad_type
Definition: _mutex_padding.h:36
tbb::interface7::internal::padded_mutex< Mutex, false >::impl
Mutex * impl()
Definition: _mutex_padding.h:39
tbb::interface7::internal::padded_mutex< Mutex, false >::scoped_lock::try_acquire
bool try_acquire(padded_mutex &m)
Definition: _mutex_padding.h:58
tbb::interface7::internal::padded_mutex< Mutex, false >::scoped_lock::acquire
void acquire(padded_mutex &m)
Definition: _mutex_padding.h:57
tbb::interface7::internal::padded_mutex< Mutex, false >::scoped_lock::scoped_lock
scoped_lock(padded_mutex &m)
Definition: _mutex_padding.h:54
tbb::interface7::internal::padded_mutex< Mutex, false >::scoped_lock::release
void release()
Definition: _mutex_padding.h:59
tbb::interface7::internal::padded_mutex< Mutex, false >::scoped_lock::my_scoped_lock
Mutex::scoped_lock my_scoped_lock
Definition: _mutex_padding.h:51
tbb::interface7::internal::padded_mutex< Mutex, false >::scoped_lock::scoped_lock
scoped_lock()
Definition: _mutex_padding.h:53
tbb::interface7::internal::padded_mutex< Mutex, false >::scoped_lock::~scoped_lock
~scoped_lock()
Definition: _mutex_padding.h:55
tbb::interface7::internal::padded_mutex< Mutex, true >::~padded_mutex
~padded_mutex()
Definition: _mutex_padding.h:76
tbb::interface7::internal::padded_mutex< Mutex, true >::padded_mutex
padded_mutex()
Definition: _mutex_padding.h:75
tbb::interface7::internal::padded_mutex< Mutex, true >::pad_type
long pad_type
Definition: _mutex_padding.h:65
tbb::interface7::internal::padded_mutex< Mutex, true >::impl
Mutex * impl()
Definition: _mutex_padding.h:68
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::acquire
void acquire(padded_mutex &m, bool write=true)
Definition: _mutex_padding.h:86
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::my_scoped_lock
Mutex::scoped_lock my_scoped_lock
Definition: _mutex_padding.h:80
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::release
void release()
Definition: _mutex_padding.h:90
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::scoped_lock
scoped_lock()
Definition: _mutex_padding.h:82
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::~scoped_lock
~scoped_lock()
Definition: _mutex_padding.h:84
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::scoped_lock
scoped_lock(padded_mutex &m, bool write=true)
Definition: _mutex_padding.h:83
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::try_acquire
bool try_acquire(padded_mutex &m, bool write=true)
Definition: _mutex_padding.h:87
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::downgrade_to_reader
bool downgrade_to_reader()
Definition: _mutex_padding.h:89
tbb::interface7::internal::padded_mutex< Mutex, true >::scoped_lock::upgrade_to_writer
bool upgrade_to_writer()
Definition: _mutex_padding.h:88
tbb::internal::no_copy
Base class for types that should not be copied or assigned.
Definition: tbb_stddef.h:330
tbb::internal::mutex_copy_deprecated_and_disabled
Definition: tbb_stddef.h:365

Copyright © 2005-2020 Intel Corporation. All Rights Reserved.

Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are registered trademarks or trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

* Other names and brands may be claimed as the property of others.