943acbc573
Durcit la convention de nommage des projets (dérive constatée : 'Sliding Automation', 'code_versioning'... au lieu des formes canoniques). - trilium_api.py : projets_canoniques() lit le référentiel = valeurs du label projet sur les notes de type=projet (source unique, pas de constante en dur). Note-projet CodeVersioning créée (manquait). - mcp_server.py : _valider_projet() branché dans les 6 tools de création (add_decision/history/backlog, new_conversation, create_entite, add_skill). Refuse un projet non canonique (suggestion si faute) ou inconnu (renvoi au processus de création de projet). Ne verrouille pas si référentiel illisible. - lint_audit.py : VAL-nommage aligné sur le référentiel (attrape casse, espace ET snake_case ; l'ancien 'contient un espace' ratait code_versioning). - Données : 79 notes ré-étiquetées vers les 3 formes canoniques. Quality by design : l'erreur de nommage devient impossible à l'écriture, le Lint n'est plus que le filet de sécurité.
51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
import os
|
|
import threading
|
|
import weakref
|
|
|
|
if not hasattr(os, "register_at_fork"):
|
|
|
|
def create_logger_lock():
|
|
return threading.Lock()
|
|
|
|
def create_handler_lock():
|
|
return threading.Lock()
|
|
|
|
else:
|
|
# While forking, we need to sanitize all locks to make sure the child process doesn't run into
|
|
# a deadlock (if a lock already acquired is inherited) and to protect sink from corrupted state.
|
|
# It's very important to acquire logger locks before handlers one to prevent possible deadlock
|
|
# while 'remove()' is called for example.
|
|
|
|
logger_locks = weakref.WeakSet()
|
|
handler_locks = weakref.WeakSet()
|
|
|
|
def acquire_locks():
|
|
for lock in logger_locks:
|
|
lock.acquire()
|
|
|
|
for lock in handler_locks:
|
|
lock.acquire()
|
|
|
|
def release_locks():
|
|
for lock in logger_locks:
|
|
lock.release()
|
|
|
|
for lock in handler_locks:
|
|
lock.release()
|
|
|
|
os.register_at_fork(
|
|
before=acquire_locks,
|
|
after_in_parent=release_locks,
|
|
after_in_child=release_locks,
|
|
)
|
|
|
|
def create_logger_lock():
|
|
lock = threading.Lock()
|
|
logger_locks.add(lock)
|
|
return lock
|
|
|
|
def create_handler_lock():
|
|
lock = threading.Lock()
|
|
handler_locks.add(lock)
|
|
return lock
|