- changed status to resolved
Bug with Evtimer:stop()
Issue #6
resolved
Pecl-Ev 0.2.9 on PHP 5.5.1
Short version:
After having stopped a timer, the variable (outside the loop) returns an int instead of the timer object.
Long Version:
Current simple timer example on php.net states:
<?php
// Create and start timer firing after 2 seconds
$w1 = new EvTimer(2, 0, function () {
echo "2 seconds elapsed\n";
});
// Create and launch timer firing after 2 seconds repeating each second
// until we manually stop it
$w2 = new EvTimer(2, 1, function ($w) {
echo "is called every second, is launched after 2 seconds\n";
echo "iteration = ", Ev::iteration(), PHP_EOL;
// Stop the watcher after 5 iterations
Ev::iteration() == 5 and $w->stop();
// Stop the watcher if further calls cause more than 10 iterations
Ev::iteration() >= 10 and $w->stop();
});
// Create stopped timer. It will be inactive until we start it ourselves
$w_stopped = EvTimer::createStopped(10, 5, function($w) {
echo "Callback of a timer created as stopped\n";
// Stop the watcher after 2 iterations
Ev::iteration() >= 2 and $w->stop();
});
// Loop until Ev::stop() is called or all of watchers stop
Ev::run();
// Start and look if it works
$w_stopped->start();
echo "Run single iteration\n";
Ev::run(Ev::RUN_ONCE);
echo "Restart the second watcher and try to handle the same events, but don't block\n";
$w2->again();
Ev::run(Ev::RUN_NOWAIT);
$w = new EvTimer(10, 0, function() {});
echo "Running a blocking loop\n";
Ev::run();
echo "END\n";
?>
running that example, I get the following: Note the fatal error and the segfault in the end...
# php libev01.php
is called every second, is launched after 2 seconds
iteration = 1
is called every second, is launched after 2 seconds
iteration = 2
2 seconds elapsed
is called every second, is launched after 2 seconds
iteration = 3
is called every second, is launched after 2 seconds
iteration = 4
is called every second, is launched after 2 seconds
iteration = 5
Run single iteration
Callback of a timer created as stopped
Restart the second watcher and try to handle the same events, but don't block
PHP Fatal error: Call to a member function again() on a non-object in /var/www/html/test01/nonframework/libev01.php on line 36
Segmentation fault (core dumped)
Putting some debug code directly after $w2's definition and at the end...:
<?php
// Create and start timer firing after 2 seconds
$w1 = new EvTimer(2, 0, function () {
echo "2 seconds elapsed\n";
});
// Create and launch timer firing after 2 seconds repeating each second
// until we manually stop it
$w2 = new EvTimer(1, 1, function ($w) {
echo "is called every second, is launched after 2 seconds\n";
echo "iteration = ", Ev::iteration(), PHP_EOL;
// Stop the watcher after 5 iterations
Ev::iteration() == 5 and $w->stop();
// Stop the watcher if further calls cause more than 10 iterations
Ev::iteration() >= 10 and $w->stop();
});
echo "w2 (directly after definition):\n";
var_dump($w2);
// Create stopped timer. It will be inactive until we start it ourselves
$w_stopped = EvTimer::createStopped(1, 2, function($w) {
echo "Callback of a timer created as stopped\n";
// Stop the watcher after 2 iterations
Ev::iteration() >= 2 and $w->stop();
});
// Loop until Ev::stop() is called or all of watchers stop
Ev::run();
// Start and look if it works
$w_stopped->start();
echo "Run single iteration\n";
Ev::run(Ev::RUN_ONCE);
//echo "Restart the second watcher and try to handle the same events, but don't block\n";
//$w2->again();
//Ev::run(Ev::RUN_NOWAIT);
$w = new EvTimer(2, 0, function() {});
echo "Running a blocking loop\n";
Ev::run();
echo "END\n";
echo "w2:\n";
var_dump($w2);
echo "w:\n";
var_dump($w);
?>
reveals that after the stop has taken place $w2 is an (int) instead of being an object:
php libev01.php
w2 (directly after definition):
object(EvTimer)#4 (6) {
["repeat"]=>
float(1)
["remaining"]=>
float(1)
["is_active"]=>
bool(true)
["data"]=>
NULL
["is_pending"]=>
bool(false)
["priority"]=>
int(0)
}
is called every second, is launched after 2 seconds
iteration = 1
is called every second, is launched after 2 seconds
iteration = 2
2 seconds elapsed
is called every second, is launched after 2 seconds
iteration = 3
is called every second, is launched after 2 seconds
iteration = 4
is called every second, is launched after 2 seconds
iteration = 5
Run single iteration
Callback of a timer created as stopped
Running a blocking loop
END
w2:
int(139857347141160)
w:
object(EvTimer)#7 (6) {
["repeat"]=>
bool(false)
["remaining"]=>
float(-0.0020891260064673)
["is_active"]=>
bool(false)
["data"]=>
NULL
["is_pending"]=>
bool(false)
["priority"]=>
int(0)
}
Segmentation fault (core dumped)
Comments (3)
-
repo owner -
repo owner Uploaded ev-0.2.10 to PECL
-
reporter Wow, that was fast! Thanks for the quick fix!
Just installed and seems to work fine - Log in to comment
try current
master
please