[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-mac
Subject:    Re: [KDE/Mac] Review Request 126078: [OS X] modernising the KIdleTime plugin (WIP!)
From:       René J.V. Bertin <rjvbertin () gmail ! com>
Date:       2015-11-17 21:12:50
Message-ID: 20151117211250.14400.88031 () mimi ! kde ! org
[Download RAW message or body]

--===============2200117357316077960==
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/126078/
-----------------------------------------------------------

(Updated Nov. 17, 2015, 10:12 p.m.)


Review request for KDE Software on Mac OS X and KDE Frameworks.


Changes
-------

This revision takes comments from the mailing list into account. Pure end-of-idle \
detection is done in a way similar to how `WidgetBasedPoller` does it, by detecting \
global UI events. That part explains the newly introduced ObjC++ file. Like \
`WidgetBasedPoller`, the new implementation has to resort to a polling approach, and \
like that example class, the the polling frequency is adaptive. However, the adaptive \
                algorithm:
- uses the difference between the current idle time and the next timeout from the \
                timeouts list as the source of the "error" value used to calculate \
                the timer interval
- uses <1 gain (difference/2) 
- relies on a sorted timeouts list, which ensures that the initial "next timeout" is \
equal to the minimal timeout

In addition, using a sorted timeout list means that determination of a timeout hit \
becomes much simpler, basically `idle >= timeout[i]`. That removes the possibility to \
signal early, or to reject signalling because a timeout was detected after the \
acceptance window.

I have left the `kidletime_example` run idling for over 3 minutes; as far as I can \
tell it behaves as expected, and yields a better-than-1ms accuracy (on average \
timeouts are signalled less than 1ms late). It only shows near the top in a running \
`top` listing on rare occasions, and then only at a few percents CPU.

I have left in the hooks to configure a fixed, higher polling frequency, for now, \
until I'm convinced that they're indeed not justified given the 1ms resolution \
imposed by the API.


Repository: kidletime


Description
-------

I noticed that the KIdleTime example doesn't work properly on OS X, and that the \
plugin for OS X still uses the deprecated Carbon-based algorithm that I already \
patched for KDE4.

This patch is a work-in-progress (hence the qDebugs) update to use IOKit, IORegistry \
and CoreServices to do idle-time calculation as it should be done, and allow \
simulated user activity through a "less deprecated" function.


Diffs (updated)
-----

  src/plugins/osx/CMakeLists.txt e1b50b8 
  src/plugins/osx/macpoller.h ef51ea5 
  src/plugins/osx/macpoller.cpp ad9c10f 
  src/plugins/osx/macpoller_helper.mm PRE-CREATION 

Diff: https://git.reviewboard.kde.org/r/126078/diff/


Testing
-------

On OS X 10.9 with Qt 5.5.1 and frameworks 5.16.0 .

The example now works: when I set a QTimer with interval==0, the expected wait for \
user input (`resumingFromIdle` signal) works. However, I am getting a \
`stopCatchingIdleEvents` signal which means the application waits forever, without \
ever getting to compare idle time to the list of timeouts. I haven't been able to \
figure out where that signal comes from, nor why this doesn't happen on Linux.

Surely I'm missing something, but what?


Thanks,

René J.V. Bertin


--===============2200117357316077960==
MIME-Version: 1.0
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: 8bit




<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/126078/">https://git.reviewboard.kde.org/r/126078/</a>
  </td>
    </tr>
   </table>
   <br />




<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 Software on Mac OS X and KDE Frameworks.</div>
<div>By René J.V. Bertin.</div>


<p style="color: grey;"><i>Updated Nov. 17, 2015, 10:12 p.m.</i></p>



<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Changes</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;">This revision takes comments from the mailing list into account. Pure \
end-of-idle detection is done in a way similar to how `WidgetBasedPoller` does it, by \
detecting global UI events. That part explains the newly introduced ObjC++ file. Like \
`WidgetBasedPoller`, the new implementation has to resort to a polling approach, and \
like that example class, the the polling frequency is adaptive. However, the adaptive \
                algorithm:
- uses the difference between the current idle time and the next timeout from the \
timeouts list as the source of the &quot;error&quot; value used to calculate the \
                timer interval
- uses &lt;1 gain (difference/2) 
- relies on a sorted timeouts list, which ensures that the initial &quot;next \
timeout&quot; is equal to the minimal timeout

In addition, using a sorted timeout list means that determination of a timeout hit \
becomes much simpler, basically `idle &gt;= timeout[i]`. That removes the possibility \
to signal early, or to reject signalling because a timeout was detected after the \
acceptance window.

I have left the `kidletime_example` run idling for over 3 minutes; as far as I can \
tell it behaves as expected, and yields a better-than-1ms accuracy (on average \
timeouts are signalled less than 1ms late). It only shows near the top in a running \
`top` listing on rare occasions, and then only at a few percents CPU.

I have left in the hooks to configure a fixed, higher polling frequency, for now, \
until I&#39;m convinced that they&#39;re indeed not justified given the 1ms \
resolution imposed by the API.</pre>  </td>
 </tr>
</table>







<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt;">Repository: </b>
kidletime
</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;">I noticed that the KIdleTime example doesn't work \
properly on OS X, and that the plugin for OS X still uses the deprecated Carbon-based \
algorithm that I already patched for KDE4.</p> <p style="padding: 0;text-rendering: \
inherit;margin: 0;line-height: inherit;white-space: inherit;">This patch is a \
work-in-progress (hence the qDebugs) update to use IOKit, IORegistry and CoreServices \
to do idle-time calculation as it should be done, and allow simulated user activity \
through a "less deprecated" function.</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;">On OS X 10.9 with Qt 5.5.1 and frameworks 5.16.0 .</p> \
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">The example now works: when I set a QTimer with \
interval==0, the expected wait for user input (<code style="text-rendering: \
inherit;color: #4444cc;padding: 0;white-space: normal;margin: 0;line-height: \
inherit;">resumingFromIdle</code> signal) works. However, I am getting a <code \
style="text-rendering: inherit;color: #4444cc;padding: 0;white-space: normal;margin: \
0;line-height: inherit;">stopCatchingIdleEvents</code> signal which means the \
application waits forever, without ever getting to compare idle time to the list of \
timeouts. I haven't been able to figure out where that signal comes from, nor why \
this doesn't happen on Linux.</p> <p style="padding: 0;text-rendering: \
inherit;margin: 0;line-height: inherit;white-space: inherit;">Surely I'm missing \
something, but what?</p></pre>  </td>
 </tr>
</table>


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

 <li>src/plugins/osx/CMakeLists.txt <span style="color: grey">(e1b50b8)</span></li>

 <li>src/plugins/osx/macpoller.h <span style="color: grey">(ef51ea5)</span></li>

 <li>src/plugins/osx/macpoller.cpp <span style="color: grey">(ad9c10f)</span></li>

 <li>src/plugins/osx/macpoller_helper.mm <span style="color: \
grey">(PRE-CREATION)</span></li>

</ul>

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






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



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


--===============2200117357316077960==--


[Attachment #3 (text/plain)]

_______________________________________________
kde-mac@kde.org
List Information: https://mail.kde.org/mailman/listinfo/kde-mac
KDE/Mac Information: http://community.kde.org/Mac

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic