<html>
 <body>
  <div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
   <table bgcolor="#f9f3c9" width="100%" cellpadding="12" style="border: 1px #c9c399 solid; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
    <tr>
     <td>
      This is an automatically generated e-mail. To reply, visit:
      <a href="https://git.reviewboard.kde.org/r/121831/">https://git.reviewboard.kde.org/r/121831/</a>
     </td>
    </tr>
   </table>
   <br />










<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
 <p style="margin-top: 0;">On January 21st, 2015, 10:10 a.m. UTC, <b>Dominik Haumann</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
  


<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; border-collapse: collapse; margin: 2px padding: 2px;">
 <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; font-size: 9pt; padding: 4px 8px; text-align: left;">
    <a href="https://git.reviewboard.kde.org/r/121831/diff/3/?file=343197#file343197line171" style="color: black; font-weight: bold; text-decoration: underline;">processcore/processes_linux_p.cpp</a>
    <span style="font-weight: normal;">

     (Diff revision 3)

    </span>
   </th>
  </tr>
 </thead>

 <tbody style="background-color: #e4d9cb; padding: 4px 8px; text-align: center;">
  <tr>

   <td colspan="4"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">ProcessesLocal::ProcessesLocal() : d(new Private())</pre></td>

  </tr>
 </tbody>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>
    <th bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2">171</font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; ">            <span class="n">process</span><span class="o">-></span><span class="n">setGid</span><span class="p">(</span><span class="n">gid</span><span class="p">);</span></pre></td>
  </tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Don't you change behavior here?</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Before, we just wrote into the varialbes.</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Now, we use the setters, which also sets 'changes |= Process::Gids;'</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Is that maybe an issue? I myself don't know the code well enough to see this here.</p></pre>
 </blockquote>



 <p>On January 25th, 2015, 9:52 p.m. UTC, <b>Gregor Mi</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">True. Thanks for noticing. The changes will be read in ProcessModelPrivate::processChanged when a change is signaled by KSysGuard::Process::processChanged. Then GUI model updates are triggered. So probably the worst that can happen is one additional GUI update when processChanged is emitted.</p></pre>
 </blockquote>







</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">I did some analysis. There is no visible change in behaviour ksysguard.</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">ProcessesLocal::Private::readProcStatus where the change in discussion was made (setter method with change detection instead of direct assignment).</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">is called by ProcessesLocal::updateProcessInfo in the same file:</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%">bool ProcessesLocal<span style="color: #666666">::</span>updateProcessInfo( long pid, Process <span style="color: #666666">*</span>process)
{
    bool success <span style="color: #666666">=</span> true;
    QString dir <span style="color: #666666">=</span> <span style="color: #BA2121">"/proc/"</span> <span style="color: #666666">+</span> QString<span style="color: #666666">::</span>number(pid) <span style="color: #666666">+</span> <span style="color: #BA2121">'/'</span>;
    <span style="color: #008000; font-weight: bold">if</span>(<span style="color: #666666">!</span>d<span style="color: #666666">-></span>readProcStat(dir, process)) success <span style="color: #666666">=</span> false;
    <span style="color: #008000; font-weight: bold">if</span>(<span style="color: #666666">!</span>d<span style="color: #666666">-></span>readProcStatus(dir, process)) success <span style="color: #666666">=</span> false;  <span style="color: #666666"><------------</span>
   <span style="color: #008000; font-weight: bold">...</span>
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Then there is</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%">bool Processes<span style="color: #666666">::</span>updateProcess( Process <span style="color: #666666">*</span>ps, long ppid)
    <span style="color: #008000; font-weight: bold">...</span>
    <span style="color: #008000; font-weight: bold">...</span>

    bool success <span style="color: #666666">=</span> updateProcessInfo(ps); <span style="color: #666666"><--------</span>
    emit processChanged(ps, false);  <span style="color: #666666"><-------</span>

    <span style="color: #008000; font-weight: bold">return</span> success;
}
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%">bool Processes<span style="color: #666666">::</span>updateOrAddProcess( long pid)
<span style="color: #008000; font-weight: bold">...</span>
<span style="color: #008000; font-weight: bold">...</span>
    Process <span style="color: #666666">*</span>ps <span style="color: #666666">=</span> d<span style="color: #666666">-></span>mProcesses.value(pid);
    <span style="color: #008000; font-weight: bold">if</span>(<span style="color: #666666">!</span>ps)
        <span style="color: #008000; font-weight: bold">return</span> addProcess(pid, ppid);
    <span style="color: #008000; font-weight: bold">else</span>
        <span style="color: #008000; font-weight: bold">return</span> updateProcess(ps, ppid); <span style="color: #666666"><---------</span>
}
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">which is called e.g. every second.</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">The emitted processChanged signal is connected here:</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%">connect( mProcesses, SIGNAL(processChanged(KSysGuard<span style="color: #666666">::</span>Process<span style="color: #666666">*</span>,<span style="color: #B00040">bool</span>)), this, SLOT(processChanged(KSysGuard<span style="color: #666666">::</span>Process<span style="color: #666666">*</span>,<span style="color: #B00040">bool</span>)));
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">void ProcessModelPrivate::processChanged(KSysGuard::Process *process, bool onlyTotalCpu):</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Each change on a field that was recored in ProcessesLocal::Private::readProcStatus will emit dataChanged signal, e.g.:</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%">        <span style="color: #008000; font-weight: bold">if</span>(process<span style="color: #666666">-></span>changes() <span style="color: #666666">&</span> KSysGuard<span style="color: #666666">::</span>Process<span style="color: #666666">::</span>Uids) {
            totalUpdated<span style="color: #666666">++</span>;
            QModelIndex index <span style="color: #666666">=</span> q<span style="color: #666666">-></span>createIndex(row, ProcessModel<span style="color: #666666">::</span>HeadingUser, process);
            emit q<span style="color: #666666">-></span>dataChanged(index, index);
        }
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">The dataChanged signal is from QAbstractItemModel. So as far as I can see the worst thing could happen that the GUI is updated at more places than needed.</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">When I start ksysguard the processChanged method is called about 300 times (1 time for each process in the list) in the update interval (every second).</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">I tried to update everything at once and circument the dataChanged of individual items with</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%">        QModelIndex index1 <span style="color: #666666">=</span> q<span style="color: #666666">-></span>createIndex(row, <span style="color: #666666">0</span>, process);
        QModelIndex index2 <span style="color: #666666">=</span> q<span style="color: #666666">-></span>createIndex(row, q<span style="color: #666666">-></span>columnCount() <span style="color: #666666">-</span> <span style="color: #666666">1</span>, process);
        emit q<span style="color: #666666">-></span>dataChanged(index1, index2);
        <span style="color: #008000; font-weight: bold">return</span>;
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">which had not visible effect.</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">So what now? Leave the setters and have maybe a performance penalty? Remove the setters again and use references getters? Change the Process API otherwise?</p></pre>
<br />




<p>- Gregor</p>


<br />
<p>On January 25th, 2015, 10:27 p.m. UTC, Gregor Mi wrote:</p>









<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="12" style="border: 1px #888a85 solid; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
 <tr>
  <td>

<div>Review request for KDE Base Apps, Dominik Haumann, Eike Hein, and John Tapsell.</div>
<div>By Gregor Mi.</div>


<p style="color: grey;"><i>Updated Jan. 25, 2015, 10:27 p.m.</i></p>









<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt;">Repository: </b>
libksysguard
</div>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
 <table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
 <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">In process.h there are several public fields. This RR introduces a d-ptr.</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">(In a separate commit I would add the .reviewboardrc file)</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">What is the current policy on using small C++ macros as done in this RR? Use it (code is more compact and readable) or don't use it (better for debugging)?</p></pre>
  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
 <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Compiles and runs. Data is still shown; no visible error. Unit tests succeed.</p></pre>
  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">

 <li>processui/scripting.h <span style="color: grey">(2445c0ab0d81af3283c0f6e9c5f349a3d70b0de9)</span></li>

 <li>processui/scripting.cpp <span style="color: grey">(76291b0ae0a26e486aa81a4ca3976ff4a47cb3c0)</span></li>

 <li>processcore/processes_solaris_p.cpp <span style="color: grey">(f054df4b1e762e9cbec1ff8dea78f467b878bee0)</span></li>

 <li>processui/ProcessFilter.cpp <span style="color: grey">(ec520593fb67c777d56817f2493d40dc5ade0347)</span></li>

 <li>processui/ProcessModel.cpp <span style="color: grey">(53bc041110c9cdb686fef783895104969b661889)</span></li>

 <li>processui/ksysguardprocesslist.cpp <span style="color: grey">(4dc142e864d8353ceafc3a6735ffa81e48291420)</span></li>

 <li>processcore/processes.cpp <span style="color: grey">(580df8db152040f1ad075430fdce08fe7ad4ae2d)</span></li>

 <li>processcore/processes_atop_p.cpp <span style="color: grey">(24c76e3e35f62bd8e9e705ad32cc11cbd3662601)</span></li>

 <li>processcore/processes_base_p.h <span style="color: grey">(71b8a9cc6ee14bf7934a0a9d3199b257b5ce1be7)</span></li>

 <li>processcore/processes_linux_p.cpp <span style="color: grey">(898d4fa491873fe95a8b32a5c1b85642b2e46ad5)</span></li>

 <li>processcore/processes.h <span style="color: grey">(d09c3265333fe7e2702deaa910c5fbe4bc3ac9e6)</span></li>

 <li>tests/processtest.cpp <span style="color: grey">(f9b36e9a3a3c2048b51f1d935f8c40de2ad8a9b8)</span></li>

 <li>.reviewboardrc <span style="color: grey">(PRE-CREATION)</span></li>

 <li>CMakeLists.txt <span style="color: grey">(cefc86f12be684e195bd148641483e9e1734e636)</span></li>

 <li>processcore/process.h <span style="color: grey">(b6695c0ed301dc5f0fad8ba847da811f19ebfd9a)</span></li>

 <li>processcore/process.cpp <span style="color: grey">(a38b8be71da1a51cb87f636664ebac817b1d20ab)</span></li>

</ul>

<p><a href="https://git.reviewboard.kde.org/r/121831/diff/" style="margin-left: 3em;">View Diff</a></p>






  </td>
 </tr>
</table>








  </div>
 </body>
</html>