2323#pragma once
2424
2525#include < string.h>
26- #ifdef _WIN32
27- #define WIN32_LEAN_AND_MEAN
28- #include < windows.h>
29- #else
30- #include < pthread.h>
31- #endif
32-
3326#include < atomic>
3427static_assert (sizeof (std::atomic<uint32_t >) == sizeof (uint32_t ), " Atomic size mismatch. This type likely requires a lock to work." );
3528
@@ -39,17 +32,16 @@ static_assert(sizeof(std::atomic<uint32_t>) == sizeof(uint32_t), "Atomic size mi
3932namespace Fossilize
4033{
4134enum { ControlBlockMessageSize = 32 };
42- enum { ControlBlockMagic = 0x19bcde14 };
35+ enum { ControlBlockMagic = 0x19bcde15 };
4336
4437struct SharedControlBlock
4538{
4639 uint32_t version_cookie;
4740
48- #ifndef _WIN32
49- pthread_mutex_t lock;
50- #endif
41+ // Used to implement a lock (or spinlock).
42+ int futex_lock;
5143
52- // Progress. Just need atomics to implements this.
44+ // Progress. Just need atomics to implement this.
5345 std::atomic<uint32_t > successful_modules;
5446 std::atomic<uint32_t > successful_graphics;
5547 std::atomic<uint32_t > successful_compute;
@@ -64,30 +56,29 @@ struct SharedControlBlock
6456 std::atomic<uint32_t > total_modules;
6557 std::atomic<uint32_t > banned_modules;
6658 std::atomic<uint32_t > module_validation_failures;
67- std::atomic<bool > progress_started;
68- std::atomic<bool > progress_complete;
59+ std::atomic<uint32_t > progress_started;
60+ std::atomic<uint32_t > progress_complete;
6961
7062 // Ring buffer. Needs lock.
71- uint64_t write_count;
72- uint64_t read_count;
73-
74- size_t read_offset;
75- size_t write_offset;
76- size_t ring_buffer_offset;
77- size_t ring_buffer_size;
63+ uint32_t write_count;
64+ uint32_t read_count;
65+ uint32_t read_offset;
66+ uint32_t write_offset;
67+ uint32_t ring_buffer_offset;
68+ uint32_t ring_buffer_size;
7869};
7970
8071// These are not thread-safe. Need to lock them by external means.
81- static inline size_t shared_control_block_read_avail (SharedControlBlock *control_block)
72+ static inline uint32_t shared_control_block_read_avail (SharedControlBlock *control_block)
8273{
83- size_t ret = control_block->write_count - control_block->read_count ;
74+ uint32_t ret = control_block->write_count - control_block->read_count ;
8475 return ret;
8576}
8677
87- static inline size_t shared_control_block_write_avail (SharedControlBlock *control_block)
78+ static inline uint32_t shared_control_block_write_avail (SharedControlBlock *control_block)
8879{
89- size_t ret = 0 ;
90- size_t max_capacity_write_count = control_block->read_count + control_block->ring_buffer_size ;
80+ uint32_t ret = 0 ;
81+ uint32_t max_capacity_write_count = control_block->read_count + control_block->ring_buffer_size ;
9182 if (control_block->write_count >= max_capacity_write_count)
9283 ret = 0 ;
9384 else
@@ -96,7 +87,7 @@ static inline size_t shared_control_block_write_avail(SharedControlBlock *contro
9687}
9788
9889static inline bool shared_control_block_read (SharedControlBlock *control_block,
99- void *data_, size_t size)
90+ void *data_, uint32_t size)
10091{
10192 auto *data = static_cast <uint8_t *>(data_);
10293 const uint8_t *ring = reinterpret_cast <const uint8_t *>(control_block) + control_block->ring_buffer_offset ;
@@ -107,8 +98,8 @@ static inline bool shared_control_block_read(SharedControlBlock *control_block,
10798 if (size > (control_block->write_count - control_block->read_count ))
10899 return false ;
109100
110- size_t read_first = control_block->ring_buffer_size - control_block->read_offset ;
111- size_t read_second = 0 ;
101+ uint32_t read_first = control_block->ring_buffer_size - control_block->read_offset ;
102+ uint32_t read_second = 0 ;
112103 if (read_first > size)
113104 read_first = size;
114105 read_second = size - read_first;
@@ -123,20 +114,20 @@ static inline bool shared_control_block_read(SharedControlBlock *control_block,
123114}
124115
125116static inline bool shared_control_block_write (SharedControlBlock *control_block,
126- const void *data_, size_t size)
117+ const void *data_, uint32_t size)
127118{
128119 auto *data = static_cast <const uint8_t *>(data_);
129120 uint8_t *ring = reinterpret_cast <uint8_t *>(control_block) + control_block->ring_buffer_offset ;
130121
131122 if (size > control_block->ring_buffer_size )
132123 return false ;
133124
134- size_t max_capacity_write_count = control_block->read_count + control_block->ring_buffer_size ;
125+ uint32_t max_capacity_write_count = control_block->read_count + control_block->ring_buffer_size ;
135126 if (control_block->write_count + size > max_capacity_write_count)
136127 return false ;
137128
138- size_t write_first = control_block->ring_buffer_size - control_block->write_offset ;
139- size_t write_second = 0 ;
129+ uint32_t write_first = control_block->ring_buffer_size - control_block->write_offset ;
130+ uint32_t write_second = 0 ;
140131 if (write_first > size)
141132 write_first = size;
142133 write_second = size - write_first;
0 commit comments