[feedgnuplot] 07/18: removed threading stuff
Dima Kogan
dima at secretsauce.net
Fri Nov 13 19:17:26 UTC 2015
This is an automated email from the git hooks/post-receive script.
dkogan-guest pushed a commit to branch debian
in repository feedgnuplot.
commit 4cfcf0fc35f5835a2ebd7a5e7dd9458da263995f
Author: Dima Kogan <dima at secretsauce.net>
Date: Sun Nov 1 10:47:42 2015 -0800
removed threading stuff
It's now all in one thread with a select() loop. Much nicer
---
bin/feedgnuplot | 112 ++++++++++++++++++++++++--------------------------------
1 file changed, 47 insertions(+), 65 deletions(-)
diff --git a/bin/feedgnuplot b/bin/feedgnuplot
index c2647f1..8ce4cb1 100755
--- a/bin/feedgnuplot
+++ b/bin/feedgnuplot
@@ -7,12 +7,10 @@ use warnings;
use Getopt::Long;
use Time::HiRes qw( usleep gettimeofday tv_interval );
use IO::Handle;
+use IO::Select;
use List::Util qw( first );
use Scalar::Util qw( looks_like_number );
use Text::ParseWords; # for shellwords
-use threads;
-use threads::shared;
-use Thread::Queue;
use Pod::Usage;
use Time::Piece;
@@ -34,9 +32,6 @@ my @curves = ();
# list mapping curve names to their indices in the @curves list
my %curveIndices = ();
-# now start the data acquisition and plotting threads
-my $dataQueue;
-
# Whether any new data has arrived since the last replot
my $haveNewData;
@@ -46,40 +41,16 @@ my $last_replot_time = [gettimeofday];
# whether the previous replot was timer based
my $last_replot_is_from_timer = 1;
-my $streamingFinished : shared = undef;
-
-if($options{stream})
-{
- $dataQueue = Thread::Queue->new();
- my $addThr = threads->create(\&mainThread);
- # spawn the plot updating thread. If I'm replotting from a data trigger, I don't need this
- my $plotThr = threads->create(\&plotUpdateThread) if $options{stream} > 0;
-
- while(<>)
- {
- chomp;
+my $prev_timed_replot_time = [gettimeofday];
+my $this_replot_is_from_timer;
+my $stdin = IO::Handle->new();
+die "Couldn't open STDIN" unless $stdin->fdopen(fileno(STDIN),"r");
+my $selector = IO::Select->new( $stdin );
- last if /^exit/;
-
- # place every line of input to the queue, so that the plotting thread can process it. if we are
- # using an implicit domain (x = line number), then we send it on the data queue also, since
- # $. is not meaningful in the plotting thread
- if(!$options{domain})
- {
- $_ .= " $.";
- }
- $dataQueue->enqueue($_);
- }
- $streamingFinished = 1;
- $dataQueue->enqueue(undef);
- $plotThr->join() if defined $plotThr;
- $addThr->join();
-}
-else
-{ mainThread(); }
+mainThread();
@@ -226,6 +197,9 @@ sub interpretCommandline
# -1 for triggered replotting
# >0 for timed replotting
# undef if not streaming
+ #
+ # Note that '0' is not allowed, so !$options{stream} will do the expected
+ # thing
if(defined $options{stream})
{
# if no streaming period is given, default to 1Hz.
@@ -403,17 +377,6 @@ sub getGnuplotVersion
return $gnuplotVersion;
}
-sub plotUpdateThread
-{
- while(! $streamingFinished)
- {
- usleep( $options{stream} * 1e6 );
-
- # indicate that the timer was the replot source
- $dataQueue->enqueue('replot timertick');
- }
-}
-
sub sendRangeCommand
{
my ($name, $min, $max) = @_;
@@ -449,6 +412,36 @@ sub makeDomainNumeric
return $domain0;
}
+
+sub getNextLine
+{
+ while(1)
+ {
+ $this_replot_is_from_timer = undef;
+
+ # if we're not streaming, or we're doing triggered-only replotting, simply
+ # do a blocking read
+ return $stdin->getline()
+ if (! $options{stream} || $options{stream} < 0);
+
+
+ my $now = [gettimeofday];
+ my $time_remaining = $options{stream} - tv_interval($prev_timed_replot_time, $now);
+
+ if ( $time_remaining < 0 )
+ {
+ $prev_timed_replot_time = $now;
+ $this_replot_is_from_timer = 1;
+ return 'replot';
+ }
+
+ if ($selector->can_read($time_remaining))
+ {
+ return $stdin->getline();
+ }
+ }
+}
+
sub mainThread
{
local *PIPE;
@@ -643,8 +636,7 @@ sub mainThread
# number of seconds since the UNIX epoch.
my $domain0_numeric;
- # I should be using the // operator, but I'd like to be compatible with perl 5.8
- while( $_ = (defined $dataQueue ? $dataQueue->dequeue() : <>))
+ while( defined ($_ = getNextLine()) )
{
next if /^#/o;
@@ -658,12 +650,11 @@ sub mainThread
if(/^replot/o )
{
- # /timertick/ determines if the timer was the source of the replot
- replot( $domain0_numeric, /timertick/ );
+ replot( $domain0_numeric );
next;
}
- # /exit/ is handled in the data-reading thread
+ last if /^exit/o;
}
if(! /^replot/o)
@@ -725,16 +716,7 @@ sub mainThread
}
else
{
- # since $. is not meaningful in the plotting thread if we're using the data queue, we pass
- # $. on the data queue in that case
- if(defined $dataQueue)
- {
- $domain[0] = pop @fields;
- }
- else
- {
- $domain[0] = $.;
- }
+ $domain[0] = $.;
$domain0_numeric = makeDomainNumeric( $domain[0] );
}
@@ -993,7 +975,7 @@ sub replot
# }
- my ($domain0_numeric, $replot_is_from_timer) = @_;
+ my ($domain0_numeric) = @_;
my $now = [gettimeofday];
@@ -1003,7 +985,7 @@ sub replot
# if the last replot was timer-based, but this one isn't, force a replot.
# This makes sure that a replot happens for a domain rollover shortly
# after a timer replot
- !$replot_is_from_timer && $last_replot_is_from_timer ||
+ !$this_replot_is_from_timer && $last_replot_is_from_timer ||
# if enough time has elapsed since the last replot, it's ok to replot
tv_interval ( $last_replot_time, $now ) > 0.8*$options{stream} )
@@ -1029,7 +1011,7 @@ sub replot
# update replot state
$last_replot_time = $now;
- $last_replot_is_from_timer = $replot_is_from_timer;
+ $last_replot_is_from_timer = $this_replot_is_from_timer;
}
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/feedgnuplot.git
More information about the debian-science-commits
mailing list