|
8 | 8 | "github.com/MontFerret/ferret/v2/pkg/bytecode" |
9 | 9 | "github.com/MontFerret/ferret/v2/pkg/bytecode/artifact" |
10 | 10 | "github.com/MontFerret/ferret/v2/pkg/compiler" |
11 | | - ferretnet "github.com/MontFerret/ferret/v2/pkg/net" |
12 | 11 | "github.com/MontFerret/ferret/v2/pkg/source" |
13 | 12 | "github.com/MontFerret/ferret/v2/pkg/vm" |
14 | 13 | ) |
@@ -44,51 +43,22 @@ func New(setters ...Option) (*Engine, error) { |
44 | 43 |
|
45 | 44 | for _, m := range opts.modules { |
46 | 45 | if err := m.Register(boot); err != nil { |
47 | | - closeErr := boot.hooks.engine.runCloseHooks() |
48 | | - |
49 | | - if ownsNetwork { |
50 | | - ferretnet.CloseIdleNetworkConnections(boot.host.Network()) |
51 | | - } |
52 | | - |
53 | | - if closeErr != nil { |
54 | | - return nil, errors.Join(err, fmt.Errorf("close hooks: %w", closeErr)) |
55 | | - } |
56 | | - |
57 | | - return nil, err |
| 46 | + return nil, closeEngineOnError(err, boot.hooks.engine, boot.host.Network(), ownsNetwork) |
58 | 47 | } |
59 | 48 | } |
60 | 49 |
|
61 | 50 | h, err := boot.host.Build() |
62 | 51 | if err != nil { |
63 | | - closeErr := boot.hooks.engine.runCloseHooks() |
64 | | - |
65 | | - if ownsNetwork { |
66 | | - ferretnet.CloseIdleNetworkConnections(boot.host.Network()) |
67 | | - } |
68 | | - |
69 | | - if closeErr != nil { |
70 | | - return nil, errors.Join(err, fmt.Errorf("close hooks: %w", closeErr)) |
71 | | - } |
72 | | - |
73 | | - return nil, err |
| 52 | + return nil, closeEngineOnError(err, boot.hooks.engine, boot.host.Network(), ownsNetwork) |
74 | 53 | } |
75 | 54 |
|
76 | 55 | hooks := boot.hooks.clone() |
77 | 56 |
|
78 | 57 | // Run init hooks after bootstrap is finalized and before returning the engine. |
79 | 58 | if err := hooks.engine.runInitHooks(); err != nil { |
80 | 59 | initErr := fmt.Errorf("init hooks: %w", err) |
81 | | - closeErr := hooks.engine.runCloseHooks() |
82 | 60 |
|
83 | | - if ownsNetwork { |
84 | | - ferretnet.CloseIdleNetworkConnections(h.network) |
85 | | - } |
86 | | - |
87 | | - if closeErr != nil { |
88 | | - return nil, errors.Join(initErr, fmt.Errorf("close hooks: %w", closeErr)) |
89 | | - } |
90 | | - |
91 | | - return nil, initErr |
| 61 | + return nil, closeEngineOnError(initErr, hooks.engine, h.network, ownsNetwork) |
92 | 62 | } |
93 | 63 |
|
94 | 64 | return &Engine{ |
@@ -197,17 +167,7 @@ func (e *Engine) Run(ctx context.Context, src *source.Source, opts ...SessionOpt |
197 | 167 |
|
198 | 168 | // Close runs the engine close hooks and releases engine-scoped resources. |
199 | 169 | func (e *Engine) Close() error { |
200 | | - err := e.hooks.engine.runCloseHooks() |
201 | | - |
202 | | - if e.ownsNetwork { |
203 | | - ferretnet.CloseIdleNetworkConnections(e.host.network) |
204 | | - } |
205 | | - |
206 | | - if err != nil { |
207 | | - return fmt.Errorf("close hooks: %w", err) |
208 | | - } |
209 | | - |
210 | | - return nil |
| 170 | + return closeEngine(e.hooks.engine, e.host.network, e.ownsNetwork) |
211 | 171 | } |
212 | 172 |
|
213 | 173 | func (e *Engine) newPlan(prog *bytecode.Program) (*Plan, error) { |
|
0 commit comments