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
/* =================================================================================
 File:           lib.rs

 Description:    This file contains the modules that are used by the FBP crate

 History:        RustDev 03/31/2021   Code ported from original rustfbp crate

 Copyright ©  2021 Pesa Switching Systems Inc. All rights reserved.
================================================================================== */

//! Flow Based Programming Crate For Rust
//!
//! Provides a basic Flow Based Programming (FBP) system for Rust
//!
//! # Introduction To Flow Based Programming
//!
//! In the early days of microprocessor development, Moore’s law was
//! achieved by increasing the number of transistors and the
//! frequency of the chips.  The chips while becoming more powerful
//! with each release, were still focused on a single CPU or core.  
//! In modern systems, the increase of performance is mostly dictated
//! by the number of CPUs or cores on a microprocessor.  
//! This change has lead to the need for a different type of programming model.  
//! This model must be factored into many threads of execution to use
//! all the processing power of these new microprocessors.
//!
//! This need for splitting a system into multiple threads has been fraught with problems.  
//! Originally, the model was to use locking of shared resources so that thread contention
//! would not cause one thread to corrupt another thread.  This model led to many problems
//! with locks and given that most developers are not trained in disparate threads of
//! execution, many ‘bugs’ were introduced.
//!
//! Flow Based programming was designed to address the issues of multiple cores and
//! to do so without using or needing locks.  The basic concept is that an application
//! is broken down to discreet blocks of work, much like an assembly line in a
//! manufacturing plant.  Work comes to the block when an item is placed onto an input queue.   
//! The block waits (is quiescent) until a work item is enqueued onto the input queue.  
//! At that time, the work item is processed and then placed onto one or more blocks
//! that have registered interest in the output of the block. This arrangement does not
//! use locks and each block in the system only knows what other nodes are interested
//! in its output.  It has no idea what the other blocks do or how big the network of
//! blocks are that makes up the application.  As suggested previously, this mimics the
//! layout of a manufacturing assembly line.  It also allows for breaking down the
//! functionality of a system to small understandable blocks of processing.
//!
//! This crate is designed as a Flow Based Programming system.  All functionality
//! is done through a message passing system that enqueues work onto various ‘nodes’ or blocks.
//!
//! This model also makes it much easier to scale a system as message passing can be done over TCP
//! and thus distribute the application across multiple systems.
//!
//! To read more about Flow Based Programming please see
//! [Wikipedia Flow Based Programming](https://en.wikipedia.org/wiki/Flow-based_programming)
//!
//! # Rust Flow Based Programming
//!
//! This implementation of Flow Based Programming (FBP) is not 'traditional'.  It uses some of the
//! built in Rust features to implement the system.

pub mod fbp_asyncstate;
pub mod fbp_iidmessage;
pub mod fbp_node_context;
pub mod fbp_node_error;
pub mod fbp_node_network;
pub mod fbp_node_trait;
pub mod fbp_threadsafe_wrapper;
pub mod fbp_wait_for_payload;