1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//! Event producers that write data into the ring buffer.
//!
//! # Producer Overview
//!
//! The Producer is responsible for writing events into the Disruptor's ring buffer in a
//! thread-safe manner. It coordinates with the Sequencer to obtain sequences and ensures
//! proper publication of events.
//!
//! # Key Components
//!
//! - **DataProvider**: Manages access to the underlying storage
//! - **Sequencer**: Coordinates sequence claims and publication
//! - **Event Writing**: Safe, efficient batch writing of events
//!
//! # Usage Example
//!
//! ``` rust
//! use std::sync::Arc;
//! use disruptor_rs::{
//! ringbuffer::RingBuffer,
//! sequencer::SingleProducerSequencer,
//! waiting::BusySpinWaitStrategy,
//! producer::Producer,
//! traits::EventProducer,
//! };
//!
//! let ring_buffer = Arc::new(RingBuffer::new(1024));
//! let waiting_strategy = BusySpinWaitStrategy::default();
//! let sequencer = SingleProducerSequencer::new(ring_buffer.get_capacity(), waiting_strategy);
//! // Create a producer
//! let mut producer = Producer::new(
//! ring_buffer.clone(),
//! sequencer
//! );
//!
//! // Write single event
//! producer.write(
//! std::iter::once(42),
//! |event, sequence, &value| {
//! *event = value;
//! }
//! );
//!
//! // Write batch of events
//! let batch = vec![1, 2, 3, 4, 5];
//! producer.write(
//! batch,
//! |event, sequence, &value| {
//! *event = value;
//! }
//! );
//! ```
//!
//! # Thread Safety
//!
//! The Producer is designed for single-producer scenarios. For multi-producer
//! scenarios, each producer should have its own instance, coordinated through
//! appropriate sequencer implementations.
//!
//! # Performance Considerations
//!
//! 1. **Batch Writing**
//! - Prefer writing multiple events in a single call when possible
//! - Reduces sequence claim overhead
//! - Improves throughput
//!
//! 2. **Event Construction**
//! - Keep event modification functions lightweight
//! - Avoid blocking operations during event construction
//!
//! # Cleanup
//!
//! The `drain()` method ensures all events are properly published before
//! shutdown:
//!
//! ``` rust
//! // Ensure all events are published
//! use std::sync::Arc;
//! use disruptor_rs::{
//! ringbuffer::RingBuffer,
//! sequencer::SingleProducerSequencer,
//! waiting::BusySpinWaitStrategy,
//! producer::Producer,
//! traits::EventProducer,
//! };
//!
//! let ring_buffer = Arc::new(RingBuffer::<i64>::new(1024));
//! let waiting_strategy = BusySpinWaitStrategy::default();
//! let sequencer = SingleProducerSequencer::new(ring_buffer.get_capacity(), waiting_strategy);
//! let mut producer = Producer::new(ring_buffer, sequencer);
//! producer.drain();
//! ```
use Arc;
use crate::;