Compare Revisions

B2G IPC internals

Change Revisions

Revision 635923:

Revision 635923 by tedd on

Revision 635927:

Revision 635927 by tedd on

B2G IPC internals
B2G IPC internals

Revision 635923
Revision 635927
n14    <h2>n14    <h2 id="Architecture">
n18      TODO: image<br>n18      <img alt="" src="
 >lu1_arch.png" style="width: 300px; height: 283px; float: right; b
 >order-width: 1px; border-style: solid;"><br>
19      <br>
n22    <h2>n21    <h2 id="Setup">
n30      TODO: image IOLoopn29      <img alt="" src="
 >lu2_ioloop.png" style="width: 700px; height: 203px;">
31    </p>
32    <h3>30    </p>
31    <h3 id="IOLoop">
n38    <h4>n37    <h4 id="Parent">
n59      TODO: image ipc_parent_ioloop_startupn58      <img alt="" src="
 >lu3_parent_startup.png" style="width: 900px; height: 469px;">
n76    <h4>n75    <h4 id="Child">
77      <strong>Child</strong>76      <strong>Child<a name="section_child" id="section_child"></a
n110      [[File:Ipc nuwa child ioloop startup.png|600px|frameless|cen109      <img alt="" src="
>nter|Call flow for IOLoop startup in nuwa]]>c_nuwa_ioloop.png" style="width: 650px; height: 566px;">
n118    <h3>n117    <h3 id="Channel">
119      Channel118      Channel<a name="section_channel" id="section_channel"></a>
n125      It pretty much comes down to the creation of an <strong><a n124      It pretty much comes down to the creation of an <strong><a 
>l.h#L15">IPC::Channel</a></strong> instance (the process of creat>l.h#L15">IPC::Channel</a></strong> instance (the process of creat
>ing the instance will be covered later on). This class has two im>ing the instance will be covered later on). This class has two im
>portant attributes: * <strong>channel_impl_</strong> which is the>portant attributes:
> actual implementation of the channel (platform specific) * <stro 
>ng>listener_</strong> this is used to pass incoming messages to 
125    </p>
126    <ul>
127      <li>
128        <strong>channel_impl_</strong> which is the actual implem
 >entation of the channel (platform specific)
129      </li>
130      <li>
131        <strong>listener_</strong> this is used to pass incoming 
 >messages to
132      </li>
126    </p>133    </ul>
n131      <strong>Channel::ChannelImpl</strong> has the following impn138      <strong>Channel::ChannelImpl</strong> has the following imp
>ortant attributes: * <strong>pipe_</strong> the file descriptor o>ortant attributes:
>f the pipe (created by <strong>socketpair</strong>) for the paren 
>t side * <strong>client_pipe_</strong> the client end of the pipe 
> * <strong>listener_</strong> the object that receives the incomi 
>ng messages * <strong>output_queue_</strong> a queue where all ou 
>tgoing messages are pushed to 
139    </p>
140    <ul>
141      <li>
142        <strong>pipe_</strong> the file descriptor of the pipe (c
 >reated by <strong>socketpair</strong>) for the parent side
143      </li>
144      <li>
145        <strong>client_pipe_</strong> the client end of the pipe
146      </li>
147      <li>
148        <strong>listener_</strong> the object that receives the i
 >ncoming messages
149      </li>
150      <li>
151        <strong>output_queue_</strong> a queue where all outgoing
 > messages are pushed to
152      </li>
132    </p>153    </ul>
n167      [[File:Ipc channel create.png|700px|frameless|center|Call fn188      <img alt="" src="
>low for IPC Channel creation]]>c_channel_create.png" style="width: 790px; height: 353px;">
168    </p>
169    <h3>189    </p>
190    <h3 id="Spawning">
n178    <h3>n199    <h3 id="Nuwa">
n181    <h4>n202    <h4 id="creating_the_process">
n185      Throughout the initialization phase of the <em>b2g</em> pron206      Throughout the initialization phase of the <em>b2g</em> pro
>cess, an instance of the singleton class <strong><a href="https:/>cess, an instance of the singleton class <strong><a href="https:/
>edProcessManagerImpl</a></strong> will be created. This instance >edProcessManagerImpl</a></strong> will be created. This instance 
>is mainly accessed through a couple of static functions defined i>is mainly accessed through a couple of static functions defined i
>n the <strong><a href=">n the <strong><a href="
>essManager.h#L39">PreallocatedProcessManager</a></strong> class. >essManager.h#L39">PreallocatedProcessManager</a></strong> class. 
>The purpose of this manager is to keep track of pre-allocated pro>The purpose of this manager is to keep track of pre-allocated pro
>cesses, this will be explained in more detail in the [[#Prealloca>cesses, this will be explained in more detail in the <a href="#se
>ted]] section.>ction_preallocated">#Preallocated</a> section.
186    </p>
187    <p>207    </p>
188      The implementation class has two important attributes: * <s
>trong>mSpareProcesses</strong> which is an array that contains th 
>e preallocated processes (will be important later on) * <strong>m 
>PreallocatedAppProcess</strong> which will be the <em>nuwa</em> p 
189    </p>208    <p>
209      The implementation class has two important attributes:
210    </p>
211    <ul>
212      <li>
213        <strong>mSpareProcesses</strong> which is an array that c
 >ontains the preallocated processes (will be important later on)
214      </li>
215      <li>
216        <strong>mPreallocatedAppProcess</strong> which will be th
 >e <em>nuwa</em> process
217      </li>
218    </ul>
n206      Inside the <strong>ContentParent</strong> constructor, a con235      Inside the <strong>ContentParent</strong> constructor, a co
>uple of interesting things happen. * we insert the new <strong>Co>uple of interesting things happen.
>ntentParent</strong> into the global static list called <strong>< 
>a href=" 
>tParent</a></strong> * we create a <strong><a href="https://githu 
>/a></strong> instance * we call the <strong><a href="https://gith 
>ocessHandle</a></strong> method of <strong>GeckoChildProcessHost< 
236    </p>
237    <ul>
238      <li>we insert the new <strong>ContentParent</strong> into t
 >he global static list called <strong><a href="
239      </li>
240      <li>we create a <strong><a href="
241      </li>
242      <li>we call the <strong><a href="
 >></strong> method of <strong>GeckoChildProcessHost</strong>
243      </li>
207    </p>244    </ul>
n212      [[File:Ipc nuwa fork.png|900px|frameless|center|Call flow fn249      <img alt="" src="
>or nuwa fork]]>c_nuwa_fork.png" style="width: 1000px; height: 618px;">
213    </p>
214    <h4>250    </p>
251    <h4 id="connect_to_the_channel">
n218      We covered the actual spawning, what's left is the part when255      We covered the actual spawning, what's left is the part whe
>re the parent (<em>b2g</em>) and the child (<em>nuwa</em>) connec>re the parent (<em>b2g</em>) and the child (<em>nuwa</em>) connec
>t to the same IPC channel. We have two important calls for that o>t to the same IPC channel. We have two important calls for that o
>n the parent side, one is made before the child was spawned, the >n the parent side, one is made before the child was spawned, the 
>other after the spawn. The first one is in the <strong>RunPerform>other after the spawn. The first one is in the <strong>RunPerform
>AsynchLaunch</strong> function, before actually calling <strong>P>AsynchLaunch</strong> function, before actually calling <strong>P
>erformAsynchLaunch</strong> (the position is marked with a 'x' in>erformAsynchLaunch</strong> (the position is marked with a 'x' in
> the above diagram), we call <strong><a href="> the above diagram), we call <strong><a href="
>rong> this will call <strong><a href=">rong> this will call <strong><a href="
>></strong>. At this point a new <strong>IPC::Channel</strong> obj>></strong>. At this point a new <strong>IPC::Channel</strong> obj
>ect is created, so please checkout the [[#Channel]] section above>ect is created, so please checkout the <a href="#channel_section"
>.>>#Channel</a> section above.
n236      <strong>ContentParent</strong> actually extends <strong>PCon273      <strong>ContentParent</strong> actually extends <strong>PCo
>ntentParent</strong> (this class is generated from the *.ipdl fil>ntentParent</strong> (this class is generated from the *.ipdl fil
>es, I can't reference to any github or mxr location), which is de>es, I can't reference to any github or mxr location), which is de
>fined in <em>./objdir-gecko/ipc/ipdl/PContentParent.cpp</em> rela>fined in <em>./objdir-gecko/ipc/ipdl/PContentParent.cpp</em> rela
>tive to the root directory of FirefoxOS. <strong>PContentParent</>tive to the root directory of FirefoxOS. <strong>PContentParent</
>strong> has a member variable which will be important during the >strong> has a member variable which will be important during the 
><strong>Open</strong> (defined in PContentParent.cpp) call. * <st><strong>Open</strong> (defined in PContentParent.cpp) call.
>rong>mChannel</strong> instance of <strong><a href="https://githu 
274    </p>
275    <ul>
276      <li>
277        <strong>mChannel</strong> instance of <strong><a href="ht
278      </li>
237    </p>279    </ul>
n265      [[File:Ipc parent channel connect.png|1000px|frameless|centn307      <img alt="" src="
>er|Call flow for set different listener]]>c_parent_channel_connect.png" style="width: 1500px; height: 579px
n277      From here please have a look at the [[#Child]] section, then319      From here please have a look at the <a href="#section_child
> actual channel connection will happen inside the <strong>ThreadM>">#Child</a> section, the actual channel connection will happen i
>ain</strong> function inside the <em>IOLoop</em> thread. <strong>>nside the <strong>ThreadMain</strong> function inside the <em>IOL
>ThreadMain</strong> will call <strong><a href=">oop</em> thread. <strong>ThreadMain</strong> will call <strong><a
>/mozilla/gecko-dev/blob/6f80c55849c36f46f48941f735c8228b7e2f36d0/> href="
>ong> defined in <strong><a href=">">Init</a></strong> defined in <strong><a href="https:/
>rc/chrome/common/child_thread.h#L15">ChildThread</a></strong>. In>8b7e2f36d0/ipc/chromium/src/chrome/common/child_thread.h#L15">Chi
>side this function, we will create a new <strong>IPC::Channel</st>ldThread</a></strong>. Inside this function, we will create a new
>rong> object, and you can refer to the [[#Channel]] section from > <strong>IPC::Channel</strong> object, and you can refer to the <
>here. You will have to consider the part Mode != MODE_SERVER, the>a href="#section_channel">#Channel</a> section from here. You wil
>refore <strong>ChannelNameToClientFD</strong> will be called, whi>l have to consider the part Mode != MODE_SERVER, therefore <stron
>ch returns our magic file descriptor 3 (remember the child end of>g>ChannelNameToClientFD</strong> will be called, which returns ou
> the pipe is mapped to this fd).>r magic file descriptor 3 (remember the child end of the pipe is 
 >mapped to this fd).
nn324    <h3 id="Preallocated">
325      Preallocated<a name="section_preallocated" id="section_prea
282    <h3>326    </h3>
283      Preallocated327    <h4 id="creating_the_process_2">
284    </h3>
285    <h4>
n289      [[File:Ipc fork message flow.png|250x150px|framed|right|nuwn331      <img alt="" src="
>a fork message flow]] A Preallocated process is a process fork()e>c_fork_msg.png" style="width: 350px; height: 219pxfloat: right;
>d from <em>nuwa</em> which <em>b2g</em> keeps around, to turn it >">A Preallocated process is a process fork()ed from <em>nuwa</em>
>later into a app process. So at some point in time, <em>b2g</em> > which <em>b2g</em> keeps around, to turn it later into a app pro
>tells the preallocated process to turn into the game app that has>cess. So at some point in time, <em>b2g</em> tells the preallocat
> been started on the phone. The process will then be assigned to >ed process to turn into the game app that has been started on the
>the privileges of the app and the user will be able to do all the> phone. The process will then be assigned to the privileges of th
> fancy stuff the app can do. As soon as a Preallocated process ha>e app and the user will be able to do all the fancy stuff the app
>sn been turned into an app, <em>b2g</em> will tell <em>nuwa</em> > can do. As soon as a Preallocated process hasn been turned into 
>to create a new Preallocated process. So how does <em>b2g</em> te>an app, <em>b2g</em> will tell <em>nuwa</em> to create a new Prea
>ll <em>nuwa</em> to create a new Preallocated process? (at this p>llocated process. So how does <em>b2g</em> tell <em>nuwa</em> to 
>oint we have an active channel connection between <em>b2g</em> an>create a new Preallocated process? (at this point we have an acti
>d <em>nuwa</em>)>ve channel connection between <em>b2g</em> and <em>nuwa</em>)
n322      [[File:Ipc prealloc fork.png|1000px|frameless|center|Call fn364      <img alt="" src="
>low to create a preallocated process]]>c_prealloc_fork.png" style="width: 1500px; height: 540px;">
323    </p>
324    <h4>365    </p>
366    <h4 id="connect_to_the_channel_2">
tt369    <p>
370      TODO: write it
371    </p>

Back to History