Mercurial > octave-nkf
annotate liboctave/util/unwind-prot.h @ 20577:c547458dc10e
eliminate error_state from most header files
* defun-int.h, event-queue.h, graphics.in.h, oct-handle.h,
ov-classdef.h, misc/f77-fcn.h, unwind-prot.h:
Eliminate use of global error_state variable.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 03 Oct 2015 13:20:28 -0400 |
parents | 4197fc428c7d |
children |
rev | line source |
---|---|
1 | 1 /* |
2 | |
19731
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
17933
diff
changeset
|
3 Copyright (C) 1993-2015 John W. Eaton |
11523 | 4 Copyright (C) 2009-2010 VZLU Prague |
1 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
1 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
1 | 21 |
22 */ | |
23 | |
383 | 24 #if !defined (octave_unwind_prot_h) |
25 #define octave_unwind_prot_h 1 | |
1 | 26 |
17552
d07d59cc8775
move unwind-protect to liboctave
John W. Eaton <jwe@octave.org>
parents:
16892
diff
changeset
|
27 #include <cstddef> |
d07d59cc8775
move unwind-protect to liboctave
John W. Eaton <jwe@octave.org>
parents:
16892
diff
changeset
|
28 |
15396 | 29 #include <stack> |
9394
b3ab22ee8544
further improve unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
9384
diff
changeset
|
30 #include <memory> |
240 | 31 |
15396 | 32 #include "action-container.h" |
33 | |
2985 | 34 class |
17933
14a5493a78c8
Fix use of XXX_API macros and export more symbols from liboctave.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
17769
diff
changeset
|
35 OCTAVE_API |
15396 | 36 unwind_protect : public action_container |
2985 | 37 { |
38 public: | |
39 | |
15396 | 40 unwind_protect (void) : lifo () { } |
9394
b3ab22ee8544
further improve unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
9384
diff
changeset
|
41 |
15396 | 42 // Destructor should not raise an exception, so all actions |
20577
c547458dc10e
eliminate error_state from most header files
John W. Eaton <jwe@octave.org>
parents:
19731
diff
changeset
|
43 // registered should be exception-safe. If you're not sure, see |
c547458dc10e
eliminate error_state from most header files
John W. Eaton <jwe@octave.org>
parents:
19731
diff
changeset
|
44 // unwind_protect_safe. |
9396
17af7cce7d1b
yet more unwind_protect improvements
Jaroslav Hajek <highegg@gmail.com>
parents:
9394
diff
changeset
|
45 |
15396 | 46 ~unwind_protect (void) { run (); } |
10781
f7584d0ba5d3
allow unwind_protect register actions with const T& args
Jaroslav Hajek <highegg@gmail.com>
parents:
10343
diff
changeset
|
47 |
15396 | 48 virtual void add (elem *new_elem) |
10781
f7584d0ba5d3
allow unwind_protect register actions with const T& args
Jaroslav Hajek <highegg@gmail.com>
parents:
10343
diff
changeset
|
49 { |
15396 | 50 lifo.push (new_elem); |
51 } | |
12122
f4689107dd8c
Explicitly disallow copying in some classes.
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11586
diff
changeset
|
52 |
15396 | 53 void add (void (*fcn) (void *), void *ptr = 0) GCC_ATTR_DEPRECATED |
9376
d58086453171
refactor unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
54 { |
15396 | 55 add (new fcn_arg_elem<void *> (fcn, ptr)); |
56 } | |
12122
f4689107dd8c
Explicitly disallow copying in some classes.
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11586
diff
changeset
|
57 |
15396 | 58 operator bool (void) const { return ! empty (); } |
9376
d58086453171
refactor unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
59 |
15396 | 60 void run_top (void) GCC_ATTR_DEPRECATED { run_first (); } |
9394
b3ab22ee8544
further improve unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
9384
diff
changeset
|
61 |
15396 | 62 void run_first (void) |
63 { | |
64 if (! empty ()) | |
65 { | |
66 // No leak on exception! | |
67 std::auto_ptr<elem> ptr (lifo.top ()); | |
68 lifo.pop (); | |
69 ptr->run (); | |
70 } | |
71 } | |
9396
17af7cce7d1b
yet more unwind_protect improvements
Jaroslav Hajek <highegg@gmail.com>
parents:
9394
diff
changeset
|
72 |
15396 | 73 void run_top (int num) GCC_ATTR_DEPRECATED { run (num); } |
9396
17af7cce7d1b
yet more unwind_protect improvements
Jaroslav Hajek <highegg@gmail.com>
parents:
9394
diff
changeset
|
74 |
15396 | 75 void discard_top (void) GCC_ATTR_DEPRECATED { discard_first (); } |
9394
b3ab22ee8544
further improve unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
9384
diff
changeset
|
76 |
15396 | 77 void discard_first (void) |
78 { | |
79 if (! empty ()) | |
80 { | |
81 elem *ptr = lifo.top (); | |
82 lifo.pop (); | |
83 delete ptr; | |
84 } | |
85 } | |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
86 |
15396 | 87 void discard_top (int num) GCC_ATTR_DEPRECATED { discard (num); } |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
88 |
15396 | 89 size_t size (void) const { return lifo.size (); } |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
90 |
15396 | 91 protected: |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
92 |
15396 | 93 std::stack<elem *> lifo; |
9376
d58086453171
refactor unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
94 |
d58086453171
refactor unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
95 private: |
d58086453171
refactor unwind_protect
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
96 |
12122
f4689107dd8c
Explicitly disallow copying in some classes.
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11586
diff
changeset
|
97 // No copying! |
f4689107dd8c
Explicitly disallow copying in some classes.
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11586
diff
changeset
|
98 |
f4689107dd8c
Explicitly disallow copying in some classes.
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11586
diff
changeset
|
99 unwind_protect (const unwind_protect&); |
f4689107dd8c
Explicitly disallow copying in some classes.
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11586
diff
changeset
|
100 |
f4689107dd8c
Explicitly disallow copying in some classes.
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11586
diff
changeset
|
101 unwind_protect& operator = (const unwind_protect&); |
2985 | 102 }; |
103 | |
15396 | 104 // Like unwind_protect, but this one will guard against the |
105 // possibility of seeing an exception (or interrupt) in the cleanup | |
106 // actions. Not that we can do much about it, but at least we won't | |
107 // crash. | |
2985 | 108 |
10343
2ef5144ccb0d
Add few OCTINTERP_API tags.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10160
diff
changeset
|
109 class |
17933
14a5493a78c8
Fix use of XXX_API macros and export more symbols from liboctave.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
17769
diff
changeset
|
110 OCTAVE_API |
10343
2ef5144ccb0d
Add few OCTINTERP_API tags.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10160
diff
changeset
|
111 unwind_protect_safe : public unwind_protect |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
112 { |
15396 | 113 private: |
114 | |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
115 static void gripe_exception (void); |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
116 |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
117 public: |
15396 | 118 |
119 unwind_protect_safe (void) : unwind_protect () { } | |
120 | |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
121 ~unwind_protect_safe (void) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
122 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
123 while (! empty ()) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
124 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
125 try |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
126 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
127 run_first (); |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
128 } |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
129 catch (...) // Yes, the black hole. Remember we're in a dtor. |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
130 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
131 gripe_exception (); |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
132 } |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
133 } |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
134 } |
15396 | 135 |
136 private: | |
137 | |
138 // No copying! | |
139 | |
140 unwind_protect_safe (const unwind_protect_safe&); | |
141 | |
142 unwind_protect_safe& operator = (const unwind_protect_safe&); | |
10066
2cd940306a06
make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents:
9396
diff
changeset
|
143 }; |
2985 | 144 |
1 | 145 #endif |