Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-updates > by-pkgid > 0a67499d76b7ed32632abafb78e24a2f > files > 154

libvirt-docs-5.5.0-1.3.mga7.armv7hl.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
        This file is autogenerated from internals/eventloop.html.in
        Do not edit this file. Changes will be lost.
      -->
  <!--
        This page was generated at Tue Jul  2 20:09:59 UTC 2019.
      -->
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <link rel="stylesheet" type="text/css" href="../main.css"/>
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"/>
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/>
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/>
    <link rel="manifest" href="/manifest.json"/>
    <meta name="theme-color" content="#ffffff"/>
    <title>libvirt: Libvirt's event loop</title>
    <meta name="description" content="libvirt, virtualization, virtualization API"/>
    <script type="text/javascript" src="../js/main.js">
      <!--// forces non-empty element-->
    </script>
  </head>
  <body onload="pageload()">
    <div id="body">
      <div id="content">
        <h1>Libvirt's event loop</h1>
        <ul>
          <li>
            <a href="#event_loop">Event driven programming</a>
          </li>
          <li>
            <a href="#api">The event loop API</a>
          </li>
          <li>
            <a href="#worker_pool">Worker pool</a>
          </li>
        </ul>
        <p>
      This page describes the event loop approach used in
      libvirt. Both server and client.
    </p>
        <h2>
          <a id="event_loop">Event driven programming</a>
          <a class="headerlink" href="#event_loop" title="Permalink to this headline">¶</a>
        </h2>
        <p>Traditionally, a program simply ran once, then terminated.
    This type of program was very common in the early days of
    computing, and lacked any form of user interactivity. This is
    still used frequently, particularly in small one purpose
    programs.</p>
        <p>However, that approach is not suitable for all the types
    of applications. For instance graphical applications spend
    most of their run time waiting for an input from user. Only
    after it happened (in our example a button was clicked, a key
    pressed, etc.) an event is generated to which they respond
    by executing desired function. If generalized, this is how
    many long running programs (daemons) work. Even those who are
    not waiting for direct user input and have no graphical
    interface. Such as Libvirt.</p>
        <img alt="event loop" src="https://libvirt.org/git/?p=libvirt-media.git;a=blob_plain;f=png/event_loop_simple.png;hb=HEAD"/>
        <p>In Libvirt this approach is used in combination with
    <code>poll(2)</code> as all the communication with its
    clients (and domains it manages too) happens through sockets.
    Therefore whenever new client connects, it is given exclusive
    file descriptor which is then watched for incoming events,
    e.g. messages. </p>
        <h2>
          <a id="api">The event loop API</a>
          <a class="headerlink" href="#api" title="Permalink to this headline">¶</a>
        </h2>
        <p>To work with event loop from our code we have plenty of
    APIs.</p>
        <ul>
          <li><code>virEventAddHandle</code>: Registers a
        callback for monitoring file handle events.</li>
          <li><code>virEventUpdateHandle</code>: Change set of events
        monitored file handle is being watched for.</li>
          <li><code>virEventRemoveHandle</code>: Unregisters
        previously registered file handle so that it is no
        longer monitored for any events.</li>
          <li><code>virEventAddTimeout</code>: Registers a
        callback for timer event.</li>
          <li><code>virEventUpdateTimeout</code>: Changes frequency
        for a timer.</li>
          <li><code>virEventRemoveTimeout</code>: Unregisters
        a timer.</li>
        </ul>
        <p>For more information on these APIs continue reading <a href="../html/libvirt-libvirt-event.html">here</a>.</p>
        <h2>
          <a id="worker_pool">Worker pool</a>
          <a class="headerlink" href="#worker_pool" title="Permalink to this headline">¶</a>
        </h2>
        <p>Looking back at the image above we can see one big
    limitation. While processing a message event loop is blocked
    and for an outside observer unresponsive. This is not
    acceptable for Libvirt. Therefore we have came up with the
    following solution.</p>
        <img alt="event loop" src="https://libvirt.org/git/?p=libvirt-media.git;a=blob_plain;f=png/event_loop_worker.png;hb=HEAD"/>
        <p>The event loop does only necessary minimum and hand over
    message processing to another thread. In fact, there can be
    as many processing threads as configured increasing
    processing power.</p>
        <p>To break this high level description into smaller pieces,
    here is what happens when user calls an API:</p>
        <ol>
          <li>User (or management application) calls a Libvirt API.
      Depending on the connection URI, this may or may not
      involve server. Well, for the sake of our
      demonstration we assume the former.</li>
          <li>Remote driver encodes the API among it's arguments
      into an <a href="rpc.html">RPC message</a> and sends
      it to the server.</li>
          <li>Here, server is waiting in <code>poll(2)</code> for
      an event, like incoming message.</li>
          <li>As soon as the first bytes of message are received,
      even loop wakes up and server starts reading the
      whole message.</li>
          <li>Once fully read, the event loop notifies threads
      known as worker threads from which one picks the incoming
      message, decodes and process it.</li>
          <li>As soon as API execution is finished, a reply is sent
      to the client.</li>
        </ol>
        <p>In case that there's no free worker to process an incoming
    message in step 5, message is placed at the end of a message
    queue and is processed in next iteration.</p>
      </div>
    </div>
    <div id="nav">
      <div id="home">
        <a href="../index.html">Home</a>
      </div>
      <div id="jumplinks">
        <ul>
          <li>
            <a href="../downloads.html">Download</a>
          </li>
          <li>
            <a href="../contribute.html">Contribute</a>
          </li>
          <li>
            <a href="../docs.html">Docs</a>
          </li>
        </ul>
      </div>
      <div id="search">
        <form id="simplesearch" action="https://www.google.com/search" enctype="application/x-www-form-urlencoded" method="get">
          <div>
            <input id="searchsite" name="sitesearch" type="hidden" value="libvirt.org"/>
            <input id="searchq" name="q" type="text" size="12" value=""/>
            <input name="submit" type="submit" value="Go"/>
          </div>
        </form>
        <div id="advancedsearch">
          <span>
            <input type="radio" name="what" id="whatwebsite" checked="checked" value="website"/>
            <label for="whatwebsite">Website</label>
          </span>
          <span>
            <input type="radio" name="what" id="whatwiki" value="wiki"/>
            <label for="whatwiki">Wiki</label>
          </span>
          <span>
            <input type="radio" name="what" id="whatdevs" value="devs"/>
            <label for="whatdevs">Developers list</label>
          </span>
          <span>
            <input type="radio" name="what" id="whatusers" value="users"/>
            <label for="whatusers">Users list</label>
          </span>
        </div>
      </div>
    </div>
    <div id="footer">
      <div id="contact">
        <h3>Contact</h3>
        <ul>
          <li>
            <a href="../contact.html#email">email</a>
          </li>
          <li>
            <a href="../contact.html#irc">irc</a>
          </li>
        </ul>
      </div>
      <div id="community">
        <h3>Community</h3>
        <ul>
          <li>
            <a href="https://twitter.com/hashtag/libvirt">twitter</a>
          </li>
          <li>
            <a href="http://stackoverflow.com/questions/tagged/libvirt">stackoverflow</a>
          </li>
          <li>
            <a href="http://serverfault.com/questions/tagged/libvirt">serverfault</a>
          </li>
        </ul>
      </div>
      <div id="conduct">
            Participants in the libvirt project agree to abide by <a href="../governance.html#codeofconduct">the project code of conduct</a></div>
      <br class="clear"/>
    </div>
  </body>
</html>