Re: [dwm] save cpu cycles - bar status and wrapper scripts

From: Monsieur Pinocchio <cchinopio_AT_gmail.com>
Date: Fri, 8 Aug 2008 20:03:11 -0400

On Wed, Jul 30, 2008 at 3:34 PM, Alex Matviychuk <alexmat_AT_gmail.com> wrote:

> Thanks for the suggestion. I tried it out by wrapping the FD readin
> block with if(showbar) and it suppressed the output of the while loop
> to the dwm bar.
>
> However, to test it out I put an incrementing value in the while block
> of my dwm wrapper script and when I re-enable the bar, the value seems
> to have kept incrementing since I last disabled the bar. When I first
> re-enable, the value is set to the value it was when I disabled the
> bar, but on the next iteration jumps to a value that has been
> incremented many times since I disabled the bar. So it seems the
> output of the while loop is blocked, but the execution continues.
>
> I dug around on google and couldn't find much more info about blocking
> the while loop by not reading in from the pipe. The docs just say the
> output is "blocked", but I think it means the output is suppressed
> while the command continues to run.
>
> So this is definitely less code and more elegant, but doesn't quite work.
>
> Cheers,
> Alex
>

I tried this out myself with the following patch

diff -r d2b132e56521 dwm.c
--- a/dwm.c Wed Jul 30 03:29:51 2008 -0400
+++ b/dwm.c Fri Aug 08 19:49:02 2008 -0400
@@ -1228,7 +1228,7 @@
     sbuf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
     while(running) {
         FD_ZERO(&rd);
- if(readin)
+ if(readin && showbar)
             FD_SET(STDIN_FILENO, &rd);
         FD_SET(xfd, &rd);
         if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {

As you can see, its a very simple patch and it turns of "selecting" the
stdin if the bar is not visible. Alex is right that the status script still
seems to run. However, I found that after the status script blocks on write
after writing a given number of bytes.

For my setup, (bash 3.2.33, linux-2.6.24) that buffer was 58920 bytes.
Basically, I did the following; with the above patch and turning off the
status bar by default, I ran the following in bash

i=0; while true; do ((i++)); echo $i; done | tee dwm.out | dwm

dwm.out _doesn't_ keep increasing in size. The total number of bytes in
dwm.out is 58920. Hence, my guess is that the script will eventually stop
with the above patch after it has output 58920 bytes.

:D

-- 
Pinocchio
>
> On Wed, Jul 23, 2008 at 9:54 PM, Monsieur Pinocchio <cchinopio_AT_gmail.com>
> wrote:
> > On Sat, Jul 19, 2008 at 7:02 PM, Alex Matviychuk <alexmat_AT_gmail.com>
> wrote:
> >>
> >> Hello,
> >>
> >> I have a wrapper script for dwm that checks a bunch of devices running
> >> on my laptop. I was thinking that a lot of times I don't even have the
> >> dwm bar up (i tend to hide it often for full screen work) and so why
> >> should the wrapper script constantly poll for status bar info if I
> >> can't see it. Long story short, I made a small change to write out a
> >> file to /tmp whenever the status bar is visible. Any thought if this
> >> is the right approach? Is there a less barbaric way to alert my dwm
> >> wrapper script that the bar is hidden?
> >>
> >> Diff is attached. I also added a config param to specify the filepath
> >> for the file that gets written.
> >>
> >> Cheers,
> >> Alex
> >
> > How about just not polling the input fd when bar is disabled? This will
> > basically just block the write of the external command which is sending
> data
> > into dwm and cause the external command to go to sleep thus automatically
> > stopping it (and resuming it once the bar is shown again).
> >
> > --
> > Pinocchio
>
>
Received on Sat Aug 09 2008 - 00:03:11 UTC

This archive was generated by hypermail 2.2.0 : Sat Aug 09 2008 - 00:12:05 UTC