| <!--toc-->
 | 
	
	
		| 
 | 
	
	
		| ## Introduction
 | 
	
	
		| 
 | 
	
	
		| CppCMS has two core orthogonal concepts:
 | 
	
	
		| 
 | 
	
	
		| - **Applications** - classes derived from `cppcms::application` - the objects that define how the user application handles requests
 | 
	
	
		| - **HTTP Context** - `cppcms::http::context` - the context of the request, response, session sessions, cache and many other objects connected to the specific Client-Application interaction. 
 | 
	
	
		| 
 | 
	
	
		| On each incoming request the Context is created and it is associated with the Application class that handles it.
 | 
	
	
		| 
 | 
	
	
		| When the request and response are completed, the context
 | 
	
	
		| will be destroyed and the application usually continues to
 | 
	
	
		| run.
 | 
	
	
		| 
 | 
	
	
		| CppCMS is designed for high performance, thus it "caches" anything possible. This includes application objects.
 | 
	
	
		| 
 | 
	
	
		| Before we begin, it is very important to understand the two distinct types of application:
 | 
	
	
		| 
 | 
	
	
		| 1. **Synchronous Applications** - the most common type of application: the ordinary applications that are designed to handle normal requests.
 | 
	
	
		| 2. **Asynchronous Applications** - the special applications that are designed to handle multiple requests and support long pooling.
 | 
	
	
		| 
 | 
	
	
		| ## Synchronous Applications
 | 
	
	
		| 
 | 
	
	
		| ### Single Application
 | 
	
	
		| 
 | 
	
	
		| Synchronous applications live in a pool. They are generated by a special `cppcms::applications_pool::factory` object
 | 
	
	
		| that is mounted to the [`applications_pool`](/cppcms_ref_v0_99/classcppcms_1_1applications__pool.html) object.
 | 
	
	
		| 
 | 
	
	
		| These objects are long-living objects and once they are created
 | 
	
	
		| they are usually cached in the pool for future reuse.
 | 
	
	
		| 
 | 
	
	
		| Upon an incoming request, the application is fetched from the
 | 
	
	
		| pool or a new one is created. The special `cppcms::http::context` object is assigned to the application during all request processing,
 | 
	
	
		| 
 | 
	
	
		| This request is processed in the thread pool by
 | 
	
	
		| calling the `application::main()` virtual function
 | 
	
	
		| that actually handles the request.
 | 
	
	
		| 
 | 
	
	
		| Once the request is completed, this context is unassigned
 | 
	
	
		| and the application is returned back to the pool 
 | 
	
	
		| for future reuse.
 | 
	
	
		| 
 | 
	
	
		| So when you write your own applications, you may assume
 | 
	
	
		| that their constructors are not called frequently. You should also assume that they will "kept alive" for a long time.
 | 
	
	
		| 
 | 
	
	
		| It is good idea to cache some general non-mutable
 | 
	
	
		| information withing such objects.
 | 
	
	
		| 
 | 
	
	
		| ### Applications with Children
 | 
	
	
		| 
 | 
	
	
		| Each application can have multiple child-applications, for example:
 | 
	
	
		| 
 | 
	
	
		|     blog
 | 
	
	
		|         admin
 | 
	
	
		|             post_editing
 | 
	
	
		|             options_editing
 | 
	
	
		|         display
 | 
	
	
		|             post
 | 
	
	
		|             summary
 | 
	
	
		|         feedsSo in order to keep asynchronous applications alive you need to do one of the following:
 | 
	
	
		|         feeds
 | 
	
	
		|             atom
 | 
	
	
		|             rss
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| Each child application can be connected to the parent
 | 
	
	
		| via the [`add` or `attach`](/cppcms_ref_v0_99/classcppcms_1_1application.html) member functions 
 | 
	
	
		| in the constructor. Each application shares its lifetime and its `cppcms::http::context` with its parent.
 | 
	
	
		| 
 | 
	
	
		| Even though they are different objects and different
 | 
	
	
		| classes they are tightly bounded and live
 | 
	
	
		| together as long as the topmost-parent lives, `blog` in our case.
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| ## Asynchronous Applications
 | 
	
	
		| 
 | 
	
	
		| ### Lifetime 
 | 
	
	
		| 
 | 
	
	
		| Unlike synchronous applications that have multiple
 | 
	
	
		| instances in the applications pool and are executed
 | 
	
	
		| in the thread pool, asynchronous applications
 | 
	
	
		| are designed to handle multiple connections
 | 
	
	
		| simultaneously, and thus instead of being called
 | 
	
	
		| in the thread pool per each request, they run exclusively
 | 
	
	
		| in the main [CppCMS Event Loop](/wikipp/en/page/cppcms_1x_event_loop)
 | 
	
	
		| 
 | 
	
	
		| Asynchronous applications live as long as their reference
 | 
	
	
		| counter is not 0. Once the reference counter
 | 
	
	
		| decreases to 0 the application is destroyed and automatically
 | 
	
	
		| unmounted from the applications pool.
 | 
	
	
		| 
 | 
	
	
		| So in order to keep asynchronous applications alive
 | 
	
	
		| you need to do one of the following:
 | 
	
	
		| 
 | 
	
	
		| 1.  Keep a persistent `intrusive_ptr` smart pointer
 | 
	
	
		|     on the application, for example
 | 
	
	
		|     in your `main()` function.
 | 
	
	
		| 
 | 
	
	
		|     This is suitable for a long running application that
 | 
	
	
		|     exists all the time the service is running.
 | 
	
	
		| 
 | 
	
	
		| 2.  Make sure that you have event handlers that hold
 | 
	
	
		|     a smart pointer and waiting for the event.
 | 
	
	
		| 
 | 
	
	
		|     This is usually done by passing `intrusive_ptr` within
 | 
	
	
		|     the event handler.
 | 
	
	
		| 
 | 
	
	
		|     This method is suitable for temporary 
 | 
	
	
		|     applications that may represent for example
 | 
	
	
		|     different information channels like chat rooms
 | 
	
	
		|     that may be created or destroyed
 | 
	
	
		|     at some point.
 | 
	
	
		| 
 | 
	
	
		| ### Asynchronous applications and their Children
 | 
	
	
		| 
 | 
	
	
		| Each asynchronous application and its children 
 | 
	
	
		| share the same reference counter. Thus if a
 | 
	
	
		| child is attached or assigned to a parent
 | 
	
	
		| they will share their references and, for example
 | 
	
	
		| passing a smart pointer to the child class
 | 
	
	
		| keeps the entire hierarchy alive.
 | 
	
	
		| 
 | 
	
	
		| Basically, similar to the synchronous applications,
 | 
	
	
		| the parent and all its children "live" and "die" together.
 | 
	
	
		| 
 | 
	
	
		| ### HTTP Context handling
 | 
	
	
		| 
 | 
	
	
		| There is once context assigned to the asynchronous application. If the `cppcms::application::main()`
 | 
	
	
		| function completes while the context is still assigned,
 | 
	
	
		| it would be automatically detached and complete the
 | 
	
	
		| response to the client.
 | 
	
	
		| 
 | 
	
	
		| In order to postpone the response, the context should
 | 
	
	
		| be manually detached from the application by calling
 | 
	
	
		| `cppcms::application::release_context()` function.
 | 
	
	
		| 
 | 
	
	
		| Now it is your responsibility to keep it as long
 | 
	
	
		| as you need and finalize the response by calling
 | 
	
	
		| `cppcms::http::context::complete_response()` | 
	
	
		| `cppcms::http::context::complete_response()`
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| ---
 | 
	
	
		| 
 | 
	
	
		| ← [Event Loop][prev]
 | 
	
	
		| | [Top](#maincontent)
 | 
	
	
		| | [Thread Safety][next] →
 | 
	
	
		| 
 | 
	
	
		| [prev]: /wikipp/en/page/cppcms_1x_event_loop
 | 
	
	
		| [next]: /wikipp/en/page/thread_safety |