Skip to content

Commit d37a467

Browse files
authored
Merge pull request #445 from PavelGuzenfeld/feature/fix-c-style-casts
Replace C-style casts with static_cast/reinterpret_cast for -Wold-style-cast compliance
2 parents 593df78 + 21af273 commit d37a467

3 files changed

Lines changed: 41 additions & 24 deletions

File tree

blockingconcurrentqueue.h

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,18 @@ class BlockingConcurrentQueue
5656
// includes making the memory effects of construction visible, possibly with a
5757
// memory barrier).
5858
explicit BlockingConcurrentQueue(size_t capacity = 6 * BLOCK_SIZE)
59-
: inner(capacity), sema(create<LightweightSemaphore, ssize_t, int>(0, (int)Traits::MAX_SEMA_SPINS), &BlockingConcurrentQueue::template destroy<LightweightSemaphore>)
59+
: inner(capacity), sema(create<LightweightSemaphore, ssize_t, int>(0, static_cast<int>(Traits::MAX_SEMA_SPINS)), &BlockingConcurrentQueue::template destroy<LightweightSemaphore>)
6060
{
61-
assert(reinterpret_cast<ConcurrentQueue*>((BlockingConcurrentQueue*)1) == &((BlockingConcurrentQueue*)1)->inner && "BlockingConcurrentQueue must have ConcurrentQueue as its first member");
61+
assert(reinterpret_cast<ConcurrentQueue*>(reinterpret_cast<BlockingConcurrentQueue*>(1)) == &(reinterpret_cast<BlockingConcurrentQueue*>(1))->inner && "BlockingConcurrentQueue must have ConcurrentQueue as its first member");
6262
if (!sema) {
6363
MOODYCAMEL_THROW(std::bad_alloc());
6464
}
6565
}
6666

6767
BlockingConcurrentQueue(size_t minCapacity, size_t maxExplicitProducers, size_t maxImplicitProducers)
68-
: inner(minCapacity, maxExplicitProducers, maxImplicitProducers), sema(create<LightweightSemaphore, ssize_t, int>(0, (int)Traits::MAX_SEMA_SPINS), &BlockingConcurrentQueue::template destroy<LightweightSemaphore>)
68+
: inner(minCapacity, maxExplicitProducers, maxImplicitProducers), sema(create<LightweightSemaphore, ssize_t, int>(0, static_cast<int>(Traits::MAX_SEMA_SPINS)), &BlockingConcurrentQueue::template destroy<LightweightSemaphore>)
6969
{
70-
assert(reinterpret_cast<ConcurrentQueue*>((BlockingConcurrentQueue*)1) == &((BlockingConcurrentQueue*)1)->inner && "BlockingConcurrentQueue must have ConcurrentQueue as its first member");
70+
assert(reinterpret_cast<ConcurrentQueue*>(reinterpret_cast<BlockingConcurrentQueue*>(1)) == &(reinterpret_cast<BlockingConcurrentQueue*>(1))->inner && "BlockingConcurrentQueue must have ConcurrentQueue as its first member");
7171
if (!sema) {
7272
MOODYCAMEL_THROW(std::bad_alloc());
7373
}
@@ -179,12 +179,13 @@ class BlockingConcurrentQueue
179179
inline bool enqueue_bulk(It itemFirst, size_t count)
180180
{
181181
if ((details::likely)(inner.enqueue_bulk(std::forward<It>(itemFirst), count))) {
182-
sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
182+
assert(static_cast<ssize_t>(count) >= 0);
183+
sema->signal(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(count)));
183184
return true;
184185
}
185186
return false;
186187
}
187-
188+
188189
// Enqueues several items using an explicit producer token.
189190
// Allocates memory if required. Only fails if memory allocation fails
190191
// (or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).
@@ -195,7 +196,8 @@ class BlockingConcurrentQueue
195196
inline bool enqueue_bulk(producer_token_t const& token, It itemFirst, size_t count)
196197
{
197198
if ((details::likely)(inner.enqueue_bulk(token, std::forward<It>(itemFirst), count))) {
198-
sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
199+
assert(static_cast<ssize_t>(count) >= 0);
200+
sema->signal(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(count)));
199201
return true;
200202
}
201203
return false;
@@ -264,12 +266,13 @@ class BlockingConcurrentQueue
264266
inline bool try_enqueue_bulk(It itemFirst, size_t count)
265267
{
266268
if (inner.try_enqueue_bulk(std::forward<It>(itemFirst), count)) {
267-
sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
269+
assert(static_cast<ssize_t>(count) >= 0);
270+
sema->signal(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(count)));
268271
return true;
269272
}
270273
return false;
271274
}
272-
275+
273276
// Enqueues several items using an explicit producer token.
274277
// Does not allocate memory. Fails if not enough room to enqueue.
275278
// Note: Use std::make_move_iterator if the elements should be moved
@@ -279,7 +282,8 @@ class BlockingConcurrentQueue
279282
inline bool try_enqueue_bulk(producer_token_t const& token, It itemFirst, size_t count)
280283
{
281284
if (inner.try_enqueue_bulk(token, std::forward<It>(itemFirst), count)) {
282-
sema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);
285+
assert(static_cast<ssize_t>(count) >= 0);
286+
sema->signal(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(count)));
283287
return true;
284288
}
285289
return false;
@@ -327,13 +331,14 @@ class BlockingConcurrentQueue
327331
inline size_t try_dequeue_bulk(It itemFirst, size_t max)
328332
{
329333
size_t count = 0;
330-
max = (size_t)sema->tryWaitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
334+
assert(static_cast<ssize_t>(max) >= 0);
335+
max = static_cast<size_t>(sema->tryWaitMany(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(max))));
331336
while (count != max) {
332337
count += inner.template try_dequeue_bulk<It&>(itemFirst, max - count);
333338
}
334339
return count;
335340
}
336-
341+
337342
// Attempts to dequeue several elements from the queue using an explicit consumer token.
338343
// Returns the number of items actually dequeued.
339344
// Returns 0 if all producer streams appeared empty at the time they
@@ -343,7 +348,8 @@ class BlockingConcurrentQueue
343348
inline size_t try_dequeue_bulk(consumer_token_t& token, It itemFirst, size_t max)
344349
{
345350
size_t count = 0;
346-
max = (size_t)sema->tryWaitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
351+
assert(static_cast<ssize_t>(max) >= 0);
352+
max = static_cast<size_t>(sema->tryWaitMany(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(max))));
347353
while (count != max) {
348354
count += inner.template try_dequeue_bulk<It&>(token, itemFirst, max - count);
349355
}
@@ -447,13 +453,14 @@ class BlockingConcurrentQueue
447453
inline size_t wait_dequeue_bulk(It itemFirst, size_t max)
448454
{
449455
size_t count = 0;
450-
max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
456+
assert(static_cast<ssize_t>(max) >= 0);
457+
max = static_cast<size_t>(sema->waitMany(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(max))));
451458
while (count != max) {
452459
count += inner.template try_dequeue_bulk<It&>(itemFirst, max - count);
453460
}
454461
return count;
455462
}
456-
463+
457464
// Attempts to dequeue several elements from the queue.
458465
// Returns the number of items actually dequeued, which can
459466
// be 0 if the timeout expires while waiting for elements,
@@ -465,7 +472,8 @@ class BlockingConcurrentQueue
465472
inline size_t wait_dequeue_bulk_timed(It itemFirst, size_t max, std::int64_t timeout_usecs)
466473
{
467474
size_t count = 0;
468-
max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max, timeout_usecs);
475+
assert(static_cast<ssize_t>(max) >= 0);
476+
max = static_cast<size_t>(sema->waitMany(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(max)), timeout_usecs));
469477
while (count != max) {
470478
count += inner.template try_dequeue_bulk<It&>(itemFirst, max - count);
471479
}
@@ -492,7 +500,8 @@ class BlockingConcurrentQueue
492500
inline size_t wait_dequeue_bulk(consumer_token_t& token, It itemFirst, size_t max)
493501
{
494502
size_t count = 0;
495-
max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max);
503+
assert(static_cast<ssize_t>(max) >= 0);
504+
max = static_cast<size_t>(sema->waitMany(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(max))));
496505
while (count != max) {
497506
count += inner.template try_dequeue_bulk<It&>(token, itemFirst, max - count);
498507
}
@@ -510,7 +519,8 @@ class BlockingConcurrentQueue
510519
inline size_t wait_dequeue_bulk_timed(consumer_token_t& token, It itemFirst, size_t max, std::int64_t timeout_usecs)
511520
{
512521
size_t count = 0;
513-
max = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max, timeout_usecs);
522+
assert(static_cast<ssize_t>(max) >= 0);
523+
max = static_cast<size_t>(sema->waitMany(static_cast<LightweightSemaphore::ssize_t>(static_cast<ssize_t>(max)), timeout_usecs));
514524
while (count != max) {
515525
count += inner.template try_dequeue_bulk<It&>(token, itemFirst, max - count);
516526
}
@@ -537,7 +547,7 @@ class BlockingConcurrentQueue
537547
// Thread-safe.
538548
inline size_t size_approx() const
539549
{
540-
return (size_t)sema->availableApprox();
550+
return static_cast<size_t>(sema->availableApprox());
541551
}
542552

543553

concurrentqueue.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,8 +469,15 @@ namespace details
469469
static inline size_t hash_thread_id(thread_id_t id)
470470
{
471471
static_assert(sizeof(thread_id_t) <= 8, "Expected a platform where thread IDs are at most 64-bit values");
472+
#if defined(__GNUC__) && !defined(__clang__)
473+
#pragma GCC diagnostic push
474+
#pragma GCC diagnostic ignored "-Wuseless-cast"
475+
#endif
472476
return static_cast<size_t>(hash_32_or_64<sizeof(thread_id_converter<thread_id_t>::thread_id_hash_t)>::hash(
473477
thread_id_converter<thread_id_t>::prehash(id)));
478+
#if defined(__GNUC__) && !defined(__clang__)
479+
#pragma GCC diagnostic pop
480+
#endif
474481
}
475482

476483
template<typename T>

lightweightsemaphore.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ class Semaphore
234234
#else
235235
clock_gettime(CLOCK_REALTIME, &ts);
236236
#endif
237-
ts.tv_sec += (time_t)(usecs / usecs_in_1_sec);
238-
ts.tv_nsec += (long)(usecs % usecs_in_1_sec) * 1000;
237+
ts.tv_sec += static_cast<time_t>(usecs / usecs_in_1_sec);
238+
ts.tv_nsec += static_cast<long>(usecs % usecs_in_1_sec) * 1000;
239239
// sem_timedwait bombs if you have more than 1e9 in tv_nsec
240240
// so we have to clean things up before passing it in
241241
if (ts.tv_nsec >= nsecs_in_1_sec) {
@@ -306,7 +306,7 @@ class LightweightSemaphore
306306
if (m_sema.wait())
307307
return true;
308308
}
309-
if (timeout_usecs > 0 && m_sema.timed_wait((std::uint64_t)timeout_usecs))
309+
if (timeout_usecs > 0 && m_sema.timed_wait(static_cast<std::uint64_t>(timeout_usecs)))
310310
return true;
311311
// At this point, we've timed out waiting for the semaphore, but the
312312
// count is still decremented indicating we may still be waiting on
@@ -342,7 +342,7 @@ class LightweightSemaphore
342342
oldCount = m_count.fetch_sub(1, std::memory_order_acquire);
343343
if (oldCount <= 0)
344344
{
345-
if ((timeout_usecs == 0) || (timeout_usecs < 0 && !m_sema.wait()) || (timeout_usecs > 0 && !m_sema.timed_wait((std::uint64_t)timeout_usecs)))
345+
if ((timeout_usecs == 0) || (timeout_usecs < 0 && !m_sema.wait()) || (timeout_usecs > 0 && !m_sema.timed_wait(static_cast<std::uint64_t>(timeout_usecs))))
346346
{
347347
while (true)
348348
{
@@ -425,7 +425,7 @@ class LightweightSemaphore
425425
ssize_t toRelease = -oldCount < count ? -oldCount : count;
426426
if (toRelease > 0)
427427
{
428-
m_sema.signal((int)toRelease);
428+
m_sema.signal(static_cast<int>(toRelease));
429429
}
430430
}
431431

0 commit comments

Comments
 (0)