Event Loop and Thread Pool interaction
The CppCMS service has a simple design of a single event loop, and a thread pool that handles actual user application responses.
Every new incoming FastCGI, SCGI or HTTP request
is accepted by the CppCMS service and handled
by the fast and efficient CppCMS event loop that is
On an incoming request, a special HTTP Context is created. It prepares the incoming request, reads all POST data and if required parses it within the central event loop.
Once the request is ready, it is checked against the CppCMS applications pool to detect which application object handles it.
If the application that handles it is a synchronous application, its execution is passed to the thread pool. The user application prepares the response and sends it synchronously to the client and the context is destroyed, completing the "request/response" cycle.
If the application is asynchronous, the HTTP Context remains inside the event loop's thread and it is handled by the asynchronous application. This application may decide to complete the response immediately or postpone it by implementing, for example, long polling.
Integration with CppCMS Event Loop
There are several ways to interact with the event loop, besides the obvious - implementing your own asynchronous application:
cppcms::service::get_io_service()function to access the event loop directly.
You can use any of the
booster::aioclasses there and handle various asynchronous events.
You can post various operations for execution in the event loop using
cppcms::service::post()from other threads.
This is especially important when you want to do integration between synchronous and asynchronous applications.
You should remember that most of the CppCMS objects including
http::contextare not thread safe for access from multiple threads, so if some operation should be executed on objects running in the event loop, it must be done by posting handlers for execution in the event loop.
It is important to remember that every operation executed in the event loop should be very fast and never block.