
    Qiw	                     6    d Z ddlZddlZdgZdZ G d d      Zy)ur   team_lock.py — 팀별 뮤텍스 (fcntl.flock 기반).

작성자: 토르 (dev2-team backend)
날짜: 2026-03-24
    NTeamLockz&/home/jay/workspace/orchestrator/locksc                   V    e Zd ZdZefdedefdZd
dZddZe	efdedede
fd	       Zy)r   u  fcntl.flock 기반 팀별 배타적 접근 제어.

    Anu와 auto_orch 중 하나만 동일 팀에 dispatch 가능.
    Context manager로 사용.

    Usage:
        with TeamLock("dev1-team"):
            # 이 팀에 대한 독점 접근
            dispatch_to_team(...)
        # 자동 해제

        # 가용 여부만 확인
        if TeamLock.is_team_available("dev1-team"):
            ...
    team_id	locks_dirc                 ~    || _         || _        t        j                  j	                  || d      | _        d | _        y )N.lock)_team_id
_locks_dirospathjoin
_lock_path_fh)selfr   r   s      G/home/jay/workspace/.worktrees/task-2117-dev1/orchestrator/team_lock.py__init__zTeamLock.__init__    s4    #'',,yWIU2CD#    returnc                    t        j                  | j                  d       t        j                  | j                  t         j
                  t         j                  z        | _        	 t        j                  | j                  t        j                  t        j                  z         | S # t        t        f$ r@ t        j                  | j                         d| _        t        d| j                   d      w xY w)u<   LOCK_EX | LOCK_NB 획득. 실패 시 BlockingIOError 발생.Texist_okNzTeam 'z)' is currently locked by another process.)r   makedirsr
   openr   O_CREATO_RDWRr   fcntlflockLOCK_EXLOCK_NBBlockingIOErrorOSErrorcloser	   )r   s    r   	__enter__zTeamLock.__enter__&   s    
DOOd3774??BJJ,BC	eKK%--%--"?@
 	  ) 	eHHTXXDH!F4==/9b"cdd	es   '?B( (AC7Nc                    | j                   V	 t        j                  | j                   t        j                         t	        j
                  | j                          d| _         yy# t	        j
                  | j                          d| _         w xY w)u+   락 해제 + 파일 디스크립터 닫기.N)r   r   r   LOCK_UNr   r"   )r   exc_typeexc_valexc_tbs       r   __exit__zTeamLock.__exit__2   s^    88 DHHemm4"   "s   .A$ $(Bc                 J   t         j                  j                  ||  d      }t        j                  |d       t        j                  |t         j
                  t         j                  z        }	 t        j                  |t        j                  t        j                  z         t        j                  |t        j                         	 t        j                  |       y# t        t        f$ r Y t        j                  |       yw xY w# t        j                  |       w xY w)u   비블로킹 시도로 팀 가용 여부를 반환한다.

        LOCK_NB 시도 → 성공하면 즉시 해제하고 True, 실패하면 False.
        r   Tr   F)r   r   r   r   r   r   r   r   r   r   r   r%   r"   r    r!   )r   r   	lock_pathfds       r   is_team_availablezTeamLock.is_team_available;   s     GGLLwiu,=>	
I-WWY

RYY 67	KKEMMEMM9:KKEMM* HHRL  ) 	HHRL	 HHRLs%   1AC! !D0D DD D")r   r   )r   N)__name__
__module____qualname____doc__	LOCKS_DIRstrr   r#   r)   staticmethodboolr-    r   r   r   r      sV      7@ $ $ $
  9B 3 3 t  r   )r1   r   r   __all__r2   r   r6   r   r   <module>r8      s(     	,4	< <r   