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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
//! Tokio-based executor implementation for Hyper HTTP/2 connections.
//!
//! This module provides the `TokioExecutor` which integrates Hyper's HTTP/2
//! server with Tokio's async runtime. It handles spawning of futures for
//! concurrent request processing and connection management.
//!
//! # Overview
//!
//! The executor is responsible for:
//! - Spawning HTTP/2 connection handlers
//! - Managing concurrent request processing
//! - Integrating with Tokio's task scheduler
//! - Providing efficient async I/O for HTTP/2 streams
//!
//! # Performance Characteristics
//!
//! - **Zero-copy spawning**: Futures are moved directly to Tokio tasks
//! - **Work-stealing scheduler**: Tokio automatically load-balances across CPU cores
//! - **Efficient async I/O**: Uses epoll/kqueue for optimal performance
//! - **Memory efficient**: Tasks are heap-allocated only when necessary
//!
//! # Examples
//!
//! ## Basic usage with HTTP/2 builder
//! ```
//! use ignitia::server::executor::TokioExecutor;
//! use hyper::server::conn::http2;
//!
//! let executor = TokioExecutor;
//! let mut builder = http2::Builder::new(executor);
//!
//! // Configure and use the builder for HTTP/2 connections
//! builder.max_concurrent_streams(1000);
//! ```
//!
//! ## Integration with server configuration
//! ```
//! use ignitia::{Server, Router, ServerConfig, Http2Config};
//! use std::net::SocketAddr;
//!
//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
//! let router = Router::new();
//! let addr: SocketAddr = "127.0.0.1:3000".parse()?;
//!
//! let config = ServerConfig {
//! http2: Http2Config {
//! enabled: true,
//! max_concurrent_streams: Some(2000),
//! ..Default::default()
//! },
//! ..Default::default()
//! };
//!
//! let server = Server::new(router, addr).with_config(config);
//! // TokioExecutor is used internally for HTTP/2 connections
//! # Ok(())
//! # }
//! ```
use Future;
/// Tokio-based executor for HTTP/2 connection handling.
///
/// `TokioExecutor` implements Hyper's `Executor` trait to spawn futures on
/// Tokio's async runtime. This integration allows HTTP/2 connections to
/// benefit from Tokio's work-stealing scheduler and efficient I/O handling.
///
/// # Design Philosophy
///
/// The executor follows a "spawn and forget" pattern where each HTTP/2 stream
/// or connection management task is spawned as an independent Tokio task.
/// This provides:
///
/// - **Isolation**: Each request/connection runs independently
/// - **Parallelism**: Multiple CPU cores can process requests simultaneously
/// - **Fault tolerance**: Task panics don't affect other connections
/// - **Backpressure**: Tokio's scheduler naturally handles load balancing
///
/// # Memory Management
///
/// - Futures are moved to the heap only when spawned
/// - Completed tasks are automatically cleaned up by Tokio
/// - No manual memory management required
/// - Memory usage scales with active connection count
///
/// # Error Handling
///
/// Task spawning with `tokio::spawn` is infallible - the returned `JoinHandle`
/// can be used to await completion and handle any panics or errors within
/// the spawned future.
///
/// # Examples
///
/// ## Manual instantiation
/// ```
/// use ignitia::server::executor::TokioExecutor;
///
/// let executor = TokioExecutor;
///
/// // The executor can be cloned cheaply
/// let executor_clone = executor.clone();
/// assert_eq!(std::mem::size_of_val(&executor), 0); // Zero-sized type
/// ```
///
/// ## Custom future spawning
/// ```
/// use ignitia::server::executor::TokioExecutor;
/// use hyper::rt::Executor;
///
/// # async fn example() {
/// let executor = TokioExecutor;
///
/// let future = async {
/// println!("Hello from spawned task!");
/// 42
/// };
///
/// // Spawn the future on Tokio runtime
/// executor.execute(future);
/// # }
/// ```
///
/// # Performance Considerations
///
/// ## CPU Utilization
/// - Tasks automatically distribute across available CPU cores
/// - Work-stealing prevents core starvation
/// - CPU-bound tasks should yield periodically with `tokio::task::yield_now()`
///
/// ## Memory Usage
/// - Each spawned task has ~2KB overhead on 64-bit systems
/// - Stack size is dynamic and grows as needed
/// - Consider task pools for very high-frequency short-lived tasks
///
/// ## I/O Performance
/// - Tokio uses efficient system calls (epoll, kqueue, IOCP)
/// - Non-blocking I/O prevents thread pool exhaustion
/// - Built-in support for TCP_NODELAY and other optimizations
;
/// Implementation of Hyper's `Executor` trait for Tokio integration.
///
/// This implementation bridges Hyper's HTTP/2 server with Tokio's async runtime
/// by spawning futures as independent Tokio tasks. The trait is generic over
/// future types to support various HTTP/2 operations.
///
/// # Type Parameters
///
/// * `F` - The future type to execute
/// - Must implement `Future` with any output type
/// - Must be `Send + 'static` for task spawning
/// - Output must be `Send + 'static` for result handling
///
/// # Task Spawning Behavior
///
/// When `execute()` is called:
/// 1. The future is moved to Tokio's task queue
/// 2. Tokio scheduler assigns it to an available worker thread
/// 3. The future runs to completion independently
/// 4. Results/errors are handled within the spawned context
///
/// # Thread Safety
///
/// The executor is fully thread-safe:
/// - Can be called from any thread with Tokio runtime
/// - Spawned tasks may run on different threads
/// - No shared state between executor instances
///
/// # Examples
///
/// ## HTTP/2 connection handling
/// ```
/// use ignitia::server::executor::TokioExecutor;
/// use hyper::rt::Executor;
/// use std::future::ready;
///
/// # async fn example() {
/// let executor = TokioExecutor;
///
/// // Simulate HTTP/2 connection task
/// let connection_future = async {
/// // Handle HTTP/2 streams, process requests, etc.
/// println!("Processing HTTP/2 connection");
/// };
///
/// // Spawn the connection handler
/// executor.execute(connection_future);
/// # }
/// ```
///
/// ## Error handling in spawned tasks
/// ```
/// use ignitia::server::executor::TokioExecutor;
/// use hyper::rt::Executor;
///
/// # async fn example() {
/// let executor = TokioExecutor;
///
/// let error_prone_future = async {
/// // Errors within spawned tasks don't propagate automatically
/// if let Err(e) = some_fallible_operation().await {
/// eprintln!("Task error: {}", e);
/// // Handle error within task context
/// }
/// };
///
/// executor.execute(error_prone_future);
///
/// async fn some_fallible_operation() -> Result<(), Box<dyn std::error::Error>> {
/// Ok(())
/// }
/// # }
/// ```
///
/// # Integration with HTTP/2 Builder
/// ```
/// use ignitia::server::executor::TokioExecutor;
/// use hyper::server::conn::http2;
/// use std::time::Duration;
///
/// # async fn setup_http2() {
/// let executor = TokioExecutor;
/// let mut builder = http2::Builder::new(executor);
///
/// // Configure HTTP/2 settings
/// builder
/// .max_concurrent_streams(1000)
/// .initial_stream_window_size(65536)
/// .keep_alive_interval(Duration::from_secs(60));
///
/// // Builder now uses TokioExecutor for spawning connection tasks
/// # }
/// ```