1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Copyright 2026 Colliery, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Embedded interpreter lifecycle.
//!
//! Fidius-python links libpython through PyO3's `auto-initialize` feature.
//! The interpreter is brought up lazily on first use and lives for the
//! remainder of the host process — fidius does not currently support
//! tearing it down or reinitialising it. This matches cloacina's pattern.
//!
//! All Python work is gated by PyO3's `Python::with_gil`, which is the
//! correct concurrency primitive for embedded interpreters: there is no
//! separate `Mutex<PyInterpreter>` to manage.
use Once;
use trace;
static INIT: Once = new;
/// Idempotent: ensure the embedded Python interpreter is initialised.
///
/// `auto-initialize` already brings it up on the first `Python::with_gil`
/// call, so this function is mostly a documented entry point and a tracing
/// hook for diagnosing "did Python actually start up" issues. Calling it
/// repeatedly is cheap.