Discussion:
Is gp_exit() used at exit in current gnuplot?
Tatsuro MATSUOKA
2017-02-28 01:38:04 UTC
Permalink
This is related to bug #1913.

In stdfn.c

there stated


/* Calls the cleanup functions registered using gp_atexit().
 * Normally gnuplot should be exited using gp_exit(). In some cases, this is not
 * possible (notably when returning from main(), where some compilers get
 * confused because they expect a return statement at the very end. In that
 * case, gp_exit_cleanup() should be called before the return statement.
 */


*****************************

Normally gnuplot should be exited using gp_exit().
***************************


However, quick test by gdb

gdb gnuplot
b gp_exit_cleanup
b gp_exit
b debug_exit_handler
r

At gnuplot prompt

gnuplot> exit

gdb tells that gnuplot does not end by gp_exit but by debug_exit_handler.
by exit command value of exit_handlers


On  cygwin

Breakpoint 1, gp_exit_cleanup () at ../../gnuplot/src/stdfn.c:440
440     {
(gdb) n
[New Thread 8120.0x26b8]
447         while (exit_handlers) {
(gdb) n
449             (*handler->function)();
(gdb) n
[New Thread 8120.0x27cc]
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
447         while (exit_handlers) {
(gdb) n
449             (*handler->function)();
(gdb) n
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
447         while (exit_handlers) {
(gdb) n
454     }
(gdb) n
main (argc=<optimized out>, argv=<optimized out>)
    at ../../gnuplot/src/plot.c:694
694         return exit_status;
(gdb) n
695     }
(gdb) n
0x61007acf in cygwin_exit_return () from /usr/bin/cygwin1.dll
(gdb) c
Continuing.

Breakpoint 3, debug_exit_handler () at ../../gnuplot/src/stdfn.c:461
461         if (exit_handlers) {
(gdb) p exit_handlers
$1 = (struct EXIT_HANDLER *) 0x0
(gdb) c
Continuing.
[Thread 8120.0x1708 exited with code 0]
[Thread 8120.0x26b8 exited with code 0]
[Thread 8120.0x1094 exited with code 0]
[Thread 8120.0x27cc exited with code 0]
[Thread 8120.0x22c8 exited with code 0]
[Inferior 1 (process 8120) exited normally]


The above also happens on lubuntu.

Similar behavior is observed on windows


Entering exit command
gp_exit_cleanup () is called in main in plot.c on Cygwin and lubuntu.
gp_exit_cleanup () is called in WinMain (wgnuplot) or main (gnuplot) in wimmain.c on windows.


Even exit command, gp_exit() seems not to be used.

Is

*****************************

Normally gnuplot should be exited using gp_exit().
***************************

true at present ?

Tatsuro
Tatsuro MATSUOKA
2017-02-28 03:03:34 UTC
Permalink
----- Original Message -----
From: Tatsuro MATSUOKA
Date: 2017/2/28, Tue 10:38
Subject: Is gp_exit() used at exit in current gnuplot?
T his is related to bug #1913.
In stdfn.c
there stated
/* Calls the cleanup functions registered using gp_atexit().
 * Normally gnuplot should be exited using gp_exit(). In some cases, this is not
 * possible (notably when returning from main(), where some compilers get
 * confused because they expect a return statement at the very end. In that
 * case, gp_exit_cleanup() should be called before the return statement.
 */
*****************************
Normally gnuplot should be exited using gp_exit().
***************************
However, quick test by gdb
gdb gnuplot
b gp_exit_cleanup
b gp_exit
b debug_exit_handler
r
At gnuplot prompt
gnuplot> exit
gdb tells that gnuplot does not end by gp_exit but by debug_exit_handler.
by exit command value of exit_handlers
On  cygwin
Breakpoint 1, gp_exit_cleanup () at ../../gnuplot/src/stdfn.c:440
440     {
(gdb) n
[New Thread 8120.0x26b8]
447         while (exit_handlers) {
(gdb) n
449             (*handler->function)();
(gdb) n
[New Thread 8120.0x27cc]
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
447         while (exit_handlers) {
(gdb) n
449             (*handler->function)();
(gdb) n
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
451             exit_handlers = handler->next;
(gdb) n
452             free(handler);
(gdb) n
447         while (exit_handlers) {
(gdb) n
454     }
(gdb) n
main (argc=<optimized out>, argv=<optimized out>)
    at ../../gnuplot/src/plot.c:694
694         return exit_status;
(gdb) n
695     }
(gdb) n
0x61007acf in cygwin_exit_return () from /usr/bin/cygwin1.dll
(gdb) c
Continuing.
Breakpoint 3, debug_exit_handler () at ../../gnuplot/src/stdfn.c:461
461         if (exit_handlers) {
(gdb) p exit_handlers
$1 = (struct EXIT_HANDLER *) 0x0
(gdb) c
Continuing.
[Thread 8120.0x1708 exited with code 0]
[Thread 8120.0x26b8 exited with code 0]
[Thread 8120.0x1094 exited with code 0]
[Thread 8120.0x27cc exited with code 0]
[Thread 8120.0x22c8 exited with code 0]
[Inferior 1 (process 8120) exited normally]
The above also happens on lubuntu.
Similar behavior is observed on windows
Entering exit command
gp_exit_cleanup () is called in main in plot.c on Cygwin and lubuntu.
gp_exit_cleanup () is called in WinMain (wgnuplot) or main (gnuplot) in
wimmain.c on windows.
Even exit command, gp_exit() seems not to be used.
Is
*****************************
Normally gnuplot should be exited using gp_exit().
***************************
true at present ?
Tatsuro
Excuse me for my writing without reading the code in detail.
gp_exit() seems to be used in many place in the code.
Therefore gp_exit() is surely used in current gnuplot.
However, "gnuplot> exit" does not use gp_exit() as written in the previous post.

I feel that the message
 
Gnuplot not exited using gp_exit(). Exit handlers may not work correctly!

in debug_exit_handler in stdfn.c is better to be modified.

Tatsuro
sfeam
2017-02-28 04:51:52 UTC
Permalink
Post by Tatsuro MATSUOKA
This is related to bug #1913.
In stdfn.c
there stated
/* Calls the cleanup functions registered using gp_atexit().
* Normally gnuplot should be exited using gp_exit(). In some cases, this is not
* possible (notably when returning from main(), where some compilers get
* confused because they expect a return statement at the very end. In that
* case, gp_exit_cleanup() should be called before the return statement.
*/
*****************************
Normally gnuplot should be exited using gp_exit().
***************************
I think the intended meaning is
"If you were going to terminate the program by calling exit(), don't do that.
Instead call gp_exit()."

However the normal exit from main() in a C language program is by "return", not "exit()".
So gnuplot's main() routine does not call either exit() or gp_exit(). Instead it calls
gp_exit_cleanup() followed by "return".
Thus it does exactly what the comment describes.
Post by Tatsuro MATSUOKA
Excuse me for my writing without reading the code in detail.
gp_exit() seems to be used in many place in the code.
Therefore gp_exit() is surely used in current gnuplot.
Yes. For example If you say
gnuplot> exit gnuplot
then it calls gp_exit().
Post by Tatsuro MATSUOKA
However, "gnuplot> exit" does not use gp_exit() as written in the
previous post.
I feel that the message
Gnuplot not exited using gp_exit(). Exit handlers may not work correctly!
in debug_exit_handler in stdfn.c is better to be modified.
I think you are correct that the message is not accurate.
It would be better to say
"Gnuplot not exiting normally. Exit handlers may not work correctly!"
gp_exit() is one way of exiting normally, but exiting by return from main()
is also a way of exiting normally.

In your case (Bug 1913) I guess neither of these normal ways to exit is happening.
Instead gnuplot is killed by the operating system because you hit the "X button".

Ethan
Post by Tatsuro MATSUOKA
Tatsuro
Tatsuro MATSUOKA
2017-02-28 05:57:46 UTC
Permalink
----- Original Message -----
From: sfeam
To: gnuplot-beta Tatsuro MATSUOKA
Date: 2017/2/28, Tue 13:51
Subject: Re: Is gp_exit() used at exit in current gnuplot?
Post by Tatsuro MATSUOKA
This is related to bug #1913.
In stdfn.c
there stated
/* Calls the cleanup functions registered using gp_atexit().
  * Normally gnuplot should be exited using gp_exit(). In some cases, this
is not
Post by Tatsuro MATSUOKA
  * possible (notably when returning from main(), where some compilers get
  * confused because they expect a return statement at the very end. In that
  * case, gp_exit_cleanup() should be called before the return statement.
  */
*****************************
Normally gnuplot should be exited using gp_exit().
***************************
I think the intended meaning is
"If you were going to terminate the program by calling exit(), don't do that.
Instead call gp_exit()." 
However the normal exit from main() in a C language program is by "return", not "exit()".
So gnuplot's main() routine does not  call either exit() or gp_exit(). 
Instead it calls
gp_exit_cleanup() followed by "return".
Thus it does exactly what the comment describes. 
Post by Tatsuro MATSUOKA
Excuse me for my writing without reading the code in detail.
gp_exit() seems to be used in many place in the code.
Therefore gp_exit() is surely used in current gnuplot.
Yes.  For example If you say
gnuplot>  exit gnuplot
then it calls gp_exit().
Post by Tatsuro MATSUOKA
However, "gnuplot> exit" does not use gp_exit() as written in
the
Post by Tatsuro MATSUOKA
previous post.
I feel that the message
Gnuplot not exited using gp_exit(). Exit handlers may not work correctly!
in debug_exit_handler in stdfn.c is better to be modified.
I think you are correct that the message is not accurate.
It would be better to say
"Gnuplot not exiting normally. Exit handlers may not work correctly!"
gp_exit() is one way of exiting normally, but exiting by return from main()
is also a way of exiting normally.
In your case (Bug 1913) I guess neither of these normal ways to exit is happening.
Instead gnuplot is killed by the operating system because you hit  the "X
button".
    Ethan
Thank you for your comprehensive explanation.
I hope that message in debug_exit_handler will be modified as you indicaded

"Gnuplot not exiting normally. Exit handlers may not work correctly!"

Tatsuro
sfeam
2017-02-28 06:54:09 UTC
Permalink
Post by Tatsuro MATSUOKA
----- Original Message -----
From: sfeam
To: gnuplot-beta Tatsuro MATSUOKA
Date: 2017/2/28, Tue 13:51
Subject: Re: Is gp_exit() used at exit in current gnuplot?
Post by Tatsuro MATSUOKA
This is related to bug #1913.
In stdfn.c
there stated
/* Calls the cleanup functions registered using gp_atexit().
* Normally gnuplot should be exited using gp_exit(). In some cases, this
is not
Post by Tatsuro MATSUOKA
* possible (notably when returning from main(), where some compilers get
* confused because they expect a return statement at the very end. In that
* case, gp_exit_cleanup() should be called before the return statement.
*/
*****************************
Normally gnuplot should be exited using gp_exit().
***************************
I think the intended meaning is
"If you were going to terminate the program by calling exit(), don't do that.
Instead call gp_exit()."
However the normal exit from main() in a C language program is by
"return", not "exit()".
So gnuplot's main() routine does not call either exit() or gp_exit().
Instead it calls
gp_exit_cleanup() followed by "return".
Thus it does exactly what the comment describes.
Post by Tatsuro MATSUOKA
Excuse me for my writing without reading the code in detail.
gp_exit() seems to be used in many place in the code.
Therefore gp_exit() is surely used in current gnuplot.
Yes. For example If you say
gnuplot> exit gnuplot
then it calls gp_exit().
Post by Tatsuro MATSUOKA
However, "gnuplot> exit" does not use gp_exit() as written in
the
Post by Tatsuro MATSUOKA
previous post.
I feel that the message
Gnuplot not exited using gp_exit(). Exit handlers may not work correctly!
in debug_exit_handler in stdfn.c is better to be modified.
I think you are correct that the message is not accurate.
It would be better to say
"Gnuplot not exiting normally. Exit handlers may not work correctly!"
gp_exit() is one way of exiting normally, but exiting by return from main()
is also a way of exiting normally.
In your case (Bug 1913) I guess neither of these normal ways to exit is happening.
Instead gnuplot is killed by the operating system because you hit the "X button".
Ethan
Thank you for your comprehensive explanation.
I hope that message in debug_exit_handler will be modified as you indicaded
"Gnuplot not exiting normally. Exit handlers may not work correctly!"
OK. It now says:
"Gnuplot exiting abnormally. Trying to execute exit handlers anyway."

So far as I can see, the only purpose of this message is to help debug
the exit sequence, like you are doing with Bug 1913.

Ethan
Tatsuro MATSUOKA
2017-02-28 09:02:42 UTC
Permalink
----- Original Message -----
From: sfeam
To: gnuplot-beta Tatsuro MATSUOKA
Date: 2017/2/28, Tue 15:54
Subject: Re: Is gp_exit() used at exit in current gnuplot?
Post by Tatsuro MATSUOKA
Thank you for your comprehensive explanation.
I hope that message  in debug_exit_handler will be modified as you
indicaded
Post by Tatsuro MATSUOKA
"Gnuplot not exiting normally. Exit handlers may not work
correctly!"
    "Gnuplot exiting abnormally. Trying to execute exit handlers
anyway."
So far as I can see, the only purpose of this message is to help debug
the exit sequence, like you are doing with Bug 1913.
    Ethan
I have confirmed the change of message.

Thanks!

Tatsuro

Loading...