Skip to content

Commit 75c41f5

Browse files
committed
docs: updated for latest changes
1 parent 5ea7215 commit 75c41f5

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111
- Stream metadata now includes revision/ack tracking to prevent missed unread-update signaling when writers outpace reader acknowledgements
1212
- Stream writer serialization lock and reader snapshot consistency checks to avoid torn reads under concurrent writers
1313
- Queue producer serialization lock to prevent concurrent producer slot/index races
14+
- Queue consumer serialization lock to prevent concurrent consumer read-index races
1415
- Regression test coverage for Issue #3 behavior and concurrent writer/producer coherence
16+
- New `lsm_bench` contention benchmark executable and top-level `make bench` command
17+
- CI benchmark execution on `ubuntu-latest` matrix leg
1518

1619
### Changed
1720
- Stream wire layout metadata changed from `|flags|size|data|` to an extended metadata header (flags + revision + ack + size + lock + data)
18-
- Queue metadata header expanded to include producer lock state
21+
- Queue metadata header expanded to include producer and consumer lock state
1922

2023
### Fixed
2124
- `hasNewData()` no longer drops unread updates when multiple writes occur before `markAsRead()`
2225
- Concurrent stream writers no longer produce mixed/torn payload snapshots in stress tests
2326
- Concurrent queue producers no longer corrupt message prefixes or race write index updates in stress tests
27+
- Concurrent queue consumers no longer race read-index updates in stress tests
2428

2529
### Performance
26-
- Expected performance impact: slight to moderate throughput drop in write-heavy workloads due to writer/producer locking and reader snapshot retry checks
30+
- Expected performance impact: slight to moderate throughput drop in write-heavy workloads due to writer/producer/consumer lock serialization under contention
2731
- Typical impact is low for single-writer/single-producer use, and higher under heavy contention where correctness is now prioritized
2832

2933
### Breaking Changes

README.md

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -292,14 +292,14 @@ Binary layout: `|flags(1)|pad(3)|revision(4)|ack(4)|size(4)|lock(4)|data(...)|`
292292

293293
```c
294294
enum DataType {
295-
kMemoryChanged = 1, // flips odd/even per write
295+
kMemoryChanged = 1, // compatibility bit (legacy readers)
296296
kMemoryTypeString = 2,
297297
kMemoryTypeFloat = 4,
298298
kMemoryTypeDouble = 8,
299299
};
300300
```
301301

302-
`kMemoryChanged` flips odd/even to signal data changes, allowing continuous readers to detect every update.
302+
In v2.0.0, unread update detection is revision/ack-based; `kMemoryChanged` remains for compatibility.
303303

304304
### Queue (`SharedMemoryQueue`)
305305

@@ -310,15 +310,17 @@ enum DataType {
310310
| `capacity` | `uint32` | 8 | Max number of messages |
311311
| `count` | `atomic<uint32>` | 12 | Current message count |
312312
| `maxMessageSize` | `uint32` | 16 | Max bytes per message |
313-
| `messages` | slot[] | 20+ | `capacity` × `[length(4)\|data(maxMessageSize)]` |
313+
| `producerLock` | `atomic<uint32>` | 20 | Shared producer-side lock |
314+
| `consumerLock` | `atomic<uint32>` | 24 | Shared consumer-side lock |
315+
| `messages` | slot[] | 28+ | `capacity` × `[length(4)\|data(maxMessageSize)]` |
314316

315317
Binary layout:
316-
`|header(20)|slot0|slot1|...|slotN|` where each slot is:
318+
`|header(28)|slot0|slot1|...|slotN|` where each slot is:
317319
`|length(4)|data(maxMessageSize)|`
318320

319321
## Architecture
320322

321-
### Stream: Single Producer to Single Consumer
323+
### Stream: Contention-Safe Writer/Reader
322324

323325
```mermaid
324326
flowchart LR
@@ -327,7 +329,7 @@ flowchart LR
327329
end
328330
329331
subgraph "OS Shared Memory"
330-
SHM["Named Segment\n|flags|size|data|"]
332+
SHM["Named Segment\n|flags|pad|revision|ack|size|lock|data|"]
331333
end
332334
333335
subgraph "Process B (Reader)"
@@ -338,24 +340,28 @@ flowchart LR
338340
SHM -- "readString()" --> R
339341
```
340342

341-
### Queue: Single Producer to Consumer(s)
343+
### Queue: Multi-Producer / Multi-Consumer (Lock-Serialized)
342344

343345
```mermaid
344346
flowchart LR
345-
subgraph "Process A (Producer)"
347+
subgraph "Process A..N (Producers)"
346348
P[SharedMemoryQueue isWriter=true]
349+
P2[SharedMemoryQueue isWriter=true]
347350
end
348351
349352
subgraph "OS Shared Memory"
350-
Q["Named Segment |header|slot0|slot1|...|slotN|"]
353+
Q["Named Segment |header(28)|slot0|slot1|...|slotN|"]
351354
end
352355
353-
subgraph "Process B (Consumer)"
356+
subgraph "Process B..N (Consumers)"
354357
C1[SharedMemoryQueue isWriter=false]
358+
C2[SharedMemoryQueue isWriter=false]
355359
end
356360
357361
P -- "enqueue()" --> Q
362+
P2 -- "enqueue()" --> Q
358363
Q -- "dequeue()" --> C1
364+
Q -- "dequeue()" --> C2
359365
```
360366

361367
### FFI: Cross-Language Interop

0 commit comments

Comments
 (0)