Rev 85 | Rev 112 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 85 | Rev 99 | ||
|---|---|---|---|
| Line 19... | Line 19... | ||
| 19 | 19 | ||
| 20 | <para>Every message consists of 4 numeric arguments (32-bit and 64-bit on |
20 | <para>Every message consists of 4 numeric arguments (32-bit and 64-bit on |
| 21 | the corresponding platforms), from which the first one is considered a |
21 | the corresponding platforms), from which the first one is considered a |
| 22 | method number on message receipt and a return value on answer receipt. The |
22 | method number on message receipt and a return value on answer receipt. The |
| 23 | received message contains identification of the incoming connection, so |
23 | received message contains identification of the incoming connection, so |
| 24 | that it can distinguish the messages between different senders. Internally |
24 | that the receiving application can distinguish the messages between |
| 25 | the message contains pointer to the originating task and to the source of |
25 | different senders. Internally the message contains pointer to the |
| 26 | the communication channel. If the message is forwarded, the originating |
26 | originating task and to the source of the communication channel. If the |
| 27 | task identifies the recipient of the answer, the source channel identifies |
27 | message is forwarded, the originating task identifies the recipient of the |
| 28 | connection in case of a hangup message.</para> |
28 | answer, the source channel identifies the connection in case of a hangup |
| - | 29 | response.</para> |
|
| 29 | 30 | ||
| 30 | <para>Every message must be eventually answered. The system keeps track of |
31 | <para>Every message must be eventually answered. The system keeps track of |
| 31 | all messages, so that it can answer them with appropriate error code |
32 | all messages, so that it can answer them with appropriate error code |
| 32 | should one of the connection parties fail unexpectedly. To limit buffering |
33 | should one of the connection parties fail unexpectedly. To limit buffering |
| 33 | of messages in the kernel, every process is limited in a number of |
34 | of the messages in the kernel, every process is has a limited account of |
| 34 | asynchronous messages it may have unanswered simultanously. If the limit |
35 | asynchronous messages it can send simultanously. If the limit is reached, |
| 35 | is reached, the kernel refuses to send any other message, until some of |
36 | the kernel refuses to send any other message, until some active message is |
| - | 37 | answered.</para> |
|
| - | 38 | ||
| - | 39 | <para>To facilitate kernel-to-user communication, the IPC subsystem |
|
| - | 40 | provides notification messages. The applications can subscribe to a |
|
| - | 41 | notification channel and receive messages directed to this channel. Such |
|
| - | 42 | messages can be freely sent even from interrupt context as they are |
|
| - | 43 | primarily destined to deliver IRQ events to userspace device drivers. |
|
| - | 44 | These messages need not be answered, there is no party that could receive |
|
| 36 | the active messages are answered.</para> |
45 | such response.</para> |
| 37 | 46 | ||
| 38 | <section> |
47 | <section> |
| 39 | <title>Low level IPC</title> |
48 | <title>Low level IPC</title> |
| 40 | 49 | ||
| 41 | <para>The whole IPC subsystem consists of one-way communication |
50 | <para>The whole IPC subsystem consists of one-way communication |
| Line 45... | Line 54... | ||
| 45 | messages. Every sent message is identified by a unique number, so that |
54 | messages. Every sent message is identified by a unique number, so that |
| 46 | the response can be later matched against it. The message is sent over |
55 | the response can be later matched against it. The message is sent over |
| 47 | the phone to the target answerbox. Server application periodically |
56 | the phone to the target answerbox. Server application periodically |
| 48 | checks the answerbox and pulls messages from several queues associated |
57 | checks the answerbox and pulls messages from several queues associated |
| 49 | with it. After completing the requested action, server sends a reply |
58 | with it. After completing the requested action, server sends a reply |
| 50 | back to the answerbox of the originating task. </para> |
59 | back to the answerbox of the originating task. If a need arises, it is |
| - | 60 | possible to <emphasis>forward</emphasis> a recevied message throught any |
|
| - | 61 | of the open phones to another task. This mechanism is used e.g. for |
|
| - | 62 | opening new connections.</para> |
|
| 51 | 63 | ||
| - | 64 | <para>The arguments contained in the message are completely arbitrary |
|
| - | 65 | and decided by the user. The low level part of kernel IPC fills in |
|
| - | 66 | appropriate error codes if there is an error during communication. It is |
|
| - | 67 | ensured that the applications are correctly notified about communication |
|
| - | 68 | state. If the outgoing connection is closed with the hangup message, the |
|
| - | 69 | target answerbox receives a hangup message. The connection |
|
| - | 70 | identification is not reused, until the hangup message is acknowledged |
|
| - | 71 | and all other pending messages are answered.</para> |
|
| - | 72 | ||
| 52 | <para>If a need arises, it is possible to <emphasis>forward</emphasis> a |
73 | <para>If the server side decides to hangup an incoming connection, it |
| - | 74 | does it by responding to any incoming message with an EHANGUP error |
|
| - | 75 | code. The connection is then immediately closed. The client connection |
|
| - | 76 | identification (phone id) is not reused, until the client issues hangup |
|
| - | 77 | system call to close the outgoing connection.</para> |
|
| - | 78 | ||
| - | 79 | <para>When a task dies (whether voluntarily or by being killes), cleanup |
|
| 53 | recevied message throught any of the open phones to another task. This |
80 | process is started which performs following tasks.</para> |
| - | 81 | ||
| - | 82 | <orderedlist> |
|
| - | 83 | <listitem> |
|
| - | 84 | <para>Hangs up all outgoing connections and sends hangup messages to |
|
| - | 85 | all target answerboxes.</para> |
|
| - | 86 | </listitem> |
|
| - | 87 | ||
| - | 88 | <listitem> |
|
| 54 | mechanism is used e.g. for opening new connections.</para> |
89 | <para>Disconnects all incoming connections.</para> |
| - | 90 | </listitem> |
|
| - | 91 | ||
| - | 92 | <listitem> |
|
| - | 93 | <para>Disconnects from all notification channels.</para> |
|
| - | 94 | </listitem> |
|
| - | 95 | ||
| - | 96 | <listitem> |
|
| - | 97 | <para>Answers all unanswered messages from answerbox queues with |
|
| - | 98 | appropriate error code.</para> |
|
| - | 99 | </listitem> |
|
| - | 100 | ||
| - | 101 | <listitem> |
|
| - | 102 | <para>Waits until all outgoing messages are answered and all |
|
| - | 103 | remaining answerbox queues are empty.</para> |
|
| - | 104 | </listitem> |
|
| - | 105 | </orderedlist> |
|
| 55 | </section> |
106 | </section> |
| 56 | 107 | ||
| 57 | <section> |
108 | <section> |
| 58 | <title>Services for user application</title> |
109 | <title>System call IPC layer</title> |
| 59 | 110 | ||
| 60 | <para>On top of this simple protocol the kernel provides special |
111 | <para>On top of this simple protocol the kernel provides special |
| 61 | services including opening new connection to other tasks, offering |
112 | services closely related to the inter-process communication. A range of |
| - | 113 | method numbers is allocated and protocol is defined for these functions. |
|
| - | 114 | The messages are interpreted by the kernel layer and appropriate actions |
|
| - | 115 | are taken depending on the parameters of message and answer. </para> |
|
| - | 116 | ||
| - | 117 | <para>The kernel provides the following services:</para> |
|
| - | 118 | ||
| - | 119 | <itemizedlist> |
|
| - | 120 | <listitem> |
|
| - | 121 | <para>Creating new outgoing connection</para> |
|
| - | 122 | </listitem> |
|
| - | 123 | ||
| - | 124 | <listitem> |
|
| - | 125 | <para>Creating a callback connection</para> |
|
| - | 126 | </listitem> |
|
| - | 127 | ||
| - | 128 | <listitem> |
|
| 62 | callback connections and sending and receiving address space areas. |
129 | <para>Sending an address space area</para> |
| - | 130 | </listitem> |
|
| - | 131 | ||
| - | 132 | <listitem> |
|
| - | 133 | <para>Asking for an address space area</para> |
|
| 63 | </para> |
134 | </listitem> |
| - | 135 | </itemizedlist> |
|
| 64 | </section> |
136 | </section> |
| 65 | </section> |
137 | </section> |
| 66 | 138 | ||
| 67 | <section> |
139 | <section> |
| 68 | <title>Userspace view</title> |
140 | <title>Userspace view</title> |
| Line 70... | Line 142... | ||
| 70 | <para>The conventional design of the asynchronous api seems to produce |
142 | <para>The conventional design of the asynchronous api seems to produce |
| 71 | applications with one event loop and several big switch statements. |
143 | applications with one event loop and several big switch statements. |
| 72 | However, by intensive utilization of user-space threads, it was possible |
144 | However, by intensive utilization of user-space threads, it was possible |
| 73 | to create an environment that is not necesarilly restricted to this type |
145 | to create an environment that is not necesarilly restricted to this type |
| 74 | of event-driven programming and allows for more fluent expression of |
146 | of event-driven programming and allows for more fluent expression of |
| 75 | application programs. </para> |
147 | application programs.</para> |
| 76 | 148 | ||
| 77 | <section> |
149 | <section> |
| 78 | <title>Single point of entry</title> |
150 | <title>Single point of entry</title> |
| 79 | 151 | ||
| 80 | <para>Each tasks is associated with only one answerbox. If a |
152 | <para>Each tasks is associated with only one answerbox. If a |
| Line 85... | Line 157... | ||
| 85 | thread needs to wait for a message answer, an idle |
157 | thread needs to wait for a message answer, an idle |
| 86 | <emphasis>manager</emphasis> task is found or a new one is created and |
158 | <emphasis>manager</emphasis> task is found or a new one is created and |
| 87 | control is transfered to this manager task. The manager tasks pops |
159 | control is transfered to this manager task. The manager tasks pops |
| 88 | messages from the answerbox and puts them into appropriate queues of |
160 | messages from the answerbox and puts them into appropriate queues of |
| 89 | running tasks. If a task waiting for a message is not running, the |
161 | running tasks. If a task waiting for a message is not running, the |
| 90 | control is transferred to it. </para> |
162 | control is transferred to it.</para> |
| 91 | 163 | ||
| 92 | <para>Very similar situation arises when a task decides to send a lot of |
164 | <para>Very similar situation arises when a task decides to send a lot of |
| 93 | messages and reaches kernel limit of asynchronous messages. In such |
165 | messages and reaches kernel limit of asynchronous messages. In such |
| 94 | situation 2 remedies are available - the userspace liberary can either |
166 | situation 2 remedies are available - the userspace liberary can either |
| 95 | cache the message locally and resend the message when some answers |
167 | cache the message locally and resend the message when some answers |
| Line 122... | Line 194... | ||
| 122 | 1 kernel thread. Classical synchronization using semaphores is not |
194 | 1 kernel thread. Classical synchronization using semaphores is not |
| 123 | possible, as locking on them would block the thread completely and the |
195 | possible, as locking on them would block the thread completely and the |
| 124 | answer couldn't be ever processed. The IPC framework allows a developer |
196 | answer couldn't be ever processed. The IPC framework allows a developer |
| 125 | to specify, that the thread should not be preempted to any other thread |
197 | to specify, that the thread should not be preempted to any other thread |
| 126 | (except notification handlers) while still being able to queue messages |
198 | (except notification handlers) while still being able to queue messages |
| 127 | belonging to other threads and regain control when the answer arrives. |
199 | belonging to other threads and regain control when the answer |
| 128 | </para> |
200 | arrives.</para> |
| 129 | 201 | ||
| 130 | <para>This mechanism works transparently in multithreaded environment, |
202 | <para>This mechanism works transparently in multithreaded environment, |
| 131 | where classical locking mechanism (futexes) should be used. The IPC |
203 | where classical locking mechanism (futexes) should be used. The IPC |
| 132 | framework ensures that there will always be enough free threads to |
204 | framework ensures that there will always be enough free threads to |
| 133 | handle the threads requiring correct synchronization and allow the |
205 | handle the threads requiring correct synchronization and allow the |