o
    !¡µi&  ã                   @   sü   d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZ d dlZdd„ Zdd„ Zd	d
„ ZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZeadadefdd„Zdefdd„Zdefdd„Zdd„ ZdS )é    N)ÚABCÚabstractmethod)ÚPath)ÚDictÚListÚOptionalc                   C   ó   t j t ¡ dd¡S )Nú.tritonÚcache©ÚosÚpathÚjoinr   Úhome© r   r   úH/home/ubuntu/.local/lib/python3.10/site-packages/triton/runtime/cache.pyÚdefault_cache_dir   ó   r   c                   C   r   )Nr	   Úoverrider   r   r   r   r   Údefault_override_dir   r   r   c                   C   r   )Nr	   Údumpr   r   r   r   r   Údefault_dump_dir   r   r   c                   @   s~   e Zd Zdd„ Zedee fdd„ƒZeddefdd„ƒZed	edee	eef  fd
d„ƒZ
ed	ede	eef fdd„ƒZdS )ÚCacheManagerc                 C   ó   d S ©Nr   ©ÚselfÚkeyr   r   r   Ú__init__   ó   zCacheManager.__init__Úreturnc                 C   r   r   r   ©r   Úfilenamer   r   r   Úget_file   ó   zCacheManager.get_fileTc                 C   r   r   r   ©r   Údatar"   Úbinaryr   r   r   Úput    r$   zCacheManager.putr"   c                 C   r   r   r   r!   r   r   r   Ú	get_group$   r$   zCacheManager.get_groupÚgroupc                 C   r   r   r   )r   r"   r*   r   r   r   Ú	put_group(   r$   zCacheManager.put_groupN©T)Ú__name__Ú
__module__Ú__qualname__r   r   r   Ústrr#   r(   r   r)   r+   r   r   r   r   r      s      r   c                   @   s   e Zd Zddd„Zdefdd„Zdefdd„Zdee fd	d
„Z	dedee
eef  fdd„Zdede
eef defdd„Zddefdd„ZdS )ÚFileCacheManagerFc                 C   sÖ   || _ d | _|r)tƒ | _tj | j| j ¡| _tj | jd¡| _tj| jdd d S |r;tƒ | _tj | j| j ¡| _d S t 	dd¡ 
¡ pEtƒ | _| jrgtj | j| j ¡| _tj | jd¡| _tj| jdd d S tdƒ‚)NÚlockT)Úexist_okÚTRITON_CACHE_DIRÚ ú$Could not create or locate cache dir)r   Ú	lock_pathr   Ú	cache_dirr   r   r   Úmakedirsr   ÚgetenvÚstripr   ÚRuntimeError)r   r   r   r   r   r   r   r   /   s    zFileCacheManager.__init__r    c                 C   s   t j | j|¡S r   )r   r   r   r8   r!   r   r   r   Ú
_make_pathD   s   zFileCacheManager._make_pathc                 C   s    | j stdƒ‚tj |  |¡¡S )Nr6   )r8   r<   r   r   Úexistsr=   r!   r   r   r   Úhas_fileG   s   zFileCacheManager.has_filec                 C   s   |   |¡r
|  |¡S d S r   )r?   r=   r!   r   r   r   r#   L   s   

zFileCacheManager.get_filer"   c           
      C   sš   d|› }|   |¡sd S |  |¡}t|ƒ}t |¡}W d   ƒ n1 s%w   Y  | dd ¡}|d u r6d S i }| ¡ D ]\}}	tj 	|	¡rJ|	||< q<|S ©NÚ__grp__Úchild_paths)
r?   r=   ÚopenÚjsonÚloadÚgetÚitemsr   r   r>   )
r   r"   Úgrp_filenameÚgrp_filepathÚfÚgrp_datarB   ÚresultÚcÚpr   r   r   r)   R   s    



ÿ€zFileCacheManager.get_groupr*   c                 C   s6   | j stdƒ‚t d|i¡}d|› }| j||ddS )Nr6   rB   rA   F©r'   )r8   r<   rD   Údumpsr(   ©r   r"   r*   Úgrp_contentsrH   r   r   r   r+   d   s
   
zFileCacheManager.put_groupTc           
      C   s´   | j stdƒ‚t|tƒ}|st|ƒ}| jd usJ ‚|  |¡}tt ¡ ƒ}t	 
¡ }|› d|› d|› }|r6dnd}t||ƒ}	|	 |¡ W d   ƒ n1 sMw   Y  t	 ||¡ |S )Nr6   z	.tmp.pid_Ú_ÚwbÚw)r8   r<   Ú
isinstanceÚbytesr0   r7   r=   ÚuuidÚuuid4r   ÚgetpidrC   ÚwriteÚreplace)
r   r&   r"   r'   ÚfilepathÚrnd_idÚpidÚ	temp_pathÚmoderJ   r   r   r   r(   k   s    

ÿzFileCacheManager.putN©FFr,   )r-   r.   r/   r   r0   r=   Úboolr?   r   r#   r   r)   r+   r(   r   r   r   r   r1   -   s    
r1   c                   @   sV   e Zd ZdZdefdd„Zedee deee	f fdd„ƒZ
ed	ed
e	fdd„ƒZdS )ÚRemoteCacheBackendzL
    A backend implementation for accessing a remote/distributed cache.
    r   c                 C   r   r   r   r   r   r   r   r   ‡   r   zRemoteCacheBackend.__init__Ú	filenamesr    c                 C   r   r   r   )r   re   r   r   r   rF   Š   r$   zRemoteCacheBackend.getr"   r&   c                 C   r   r   r   ©r   r"   r&   r   r   r   r(   Ž   r$   zRemoteCacheBackend.putN)r-   r.   r/   Ú__doc__r0   r   r   r   r   rW   rF   r(   r   r   r   r   rd   ‚   s     rd   c                   @   sb   e Zd Zdd„ Zdedefdd„Zdee deeef fdd	„Zded
e	deee	f fdd„Z
dS )ÚRedisRemoteCacheBackendc                 C   sJ   dd l }|| _tj dd¡| _|jtj dd¡ttj dd¡ƒd| _d S )	Nr   ÚTRITON_REDIS_KEY_FORMATztriton:{key}:{filename}ÚTRITON_REDIS_HOSTÚ	localhostÚTRITON_REDIS_PORTië  )ÚhostÚport)	ÚredisÚ_keyr   ÚenvironrF   Ú_key_fmtÚRedisÚintÚ_redis)r   r   ro   r   r   r   r   •   s   þz RedisRemoteCacheBackend.__init__r"   r    c                 C   s   | j j| j|dS )N)r   r"   )rr   Úformatrp   r!   r   r   r   Ú_get_keyž   s   z RedisRemoteCacheBackend._get_keyre   c                    s.   ˆ j  ‡ fdd„|D ƒ¡}dd„ t||ƒD ƒS )Nc                    s   g | ]}ˆ   |¡‘qS r   )rw   )Ú.0rJ   ©r   r   r   Ú
<listcomp>¢   s    z/RedisRemoteCacheBackend.get.<locals>.<listcomp>c                 S   s   i | ]\}}|d ur||“qS r   r   )rx   r"   rL   r   r   r   Ú
<dictcomp>£   s    z/RedisRemoteCacheBackend.get.<locals>.<dictcomp>)ru   ÚmgetÚzip)r   re   Úresultsr   ry   r   rF   ¡   s   zRedisRemoteCacheBackend.getr&   c                 C   s   | j  |  |¡|¡ d S r   )ru   Úsetrw   rf   r   r   r   r(   ¥   s   zRedisRemoteCacheBackend.putN)r-   r.   r/   r   r0   rw   r   r   rF   rW   r(   r   r   r   r   rh   “   s
    	"rh   c                   @   sŠ   e Zd Zddd„Zdedefdd„Zdedee fd	d
„Zddedefdd„Z	dedee
eef  fdd„Zdede
eef fdd„ZdS )ÚRemoteCacheManagerFc           	      C   sV   t jd }| d¡\}}t |¡}t||ƒ}||ƒ| _|| _|| _t	|||d| _
d S )NÚTRITON_REMOTE_CACHE_BACKENDú:)r   r   )r   rq   ÚsplitÚ	importlibÚimport_moduleÚgetattrÚ_backendÚ	_overrideÚ_dumpr1   Ú_file_cache_manager)	r   r   r   r   Úremote_cache_managerÚmodule_pathÚclz_nmeÚmoduleÚremote_cache_clsr   r   r   r   «   s   



zRemoteCacheManager.__init__r"   r&   c                 C   s   | j j||ddS )NTrO   )rŠ   r(   rf   r   r   r   Ú_materialize¹   s   zRemoteCacheManager._materializer    c                 C   sP   | j s| jr| j |¡S | j |g¡}t|ƒdkrd S | ¡ \\}}|  ||¡S )Nr   )	r‰   rˆ   rŠ   r#   r‡   rF   ÚlenrG   r   )r   r"   r~   rS   r&   r   r   r   r#   ½   s   zRemoteCacheManager.get_fileTc                 C   sP   | j s| jr| jj|||dS t|tƒst|ƒ d¡}| j ||¡ |  	||¡S )NrO   úutf-8)
r‰   rˆ   rŠ   r(   rV   rW   r0   Úencoder‡   r   r%   r   r   r   r(   Ë   s   
zRemoteCacheManager.putc           
      C   s´   | j s| jr| j |¡S d|› }|  |¡}|d u rd S t|ƒ}t |¡}W d   ƒ n1 s0w   Y  | dd ¡}d }|d urXi }| j	 |¡ 
¡ D ]\}}	|  ||	¡||< qK|S r@   )r‰   rˆ   rŠ   r)   r#   rC   rD   rE   rF   r‡   rG   r   )
r   r"   rH   rI   rJ   rK   rB   rL   Ú
child_pathr&   r   r   r   r)   Õ   s    


ÿzRemoteCacheManager.get_groupr*   c                 C   sJ   | j s| jr| j ||¡S t dtt| ¡ ƒƒi¡}d|› }|  	||¡S )NrB   rA   )
r‰   rˆ   rŠ   r+   rD   rP   ÚsortedÚlistÚkeysr(   rQ   r   r   r   r+   ì   s
   
zRemoteCacheManager.put_groupNrb   r,   )r-   r.   r/   r   r0   rW   r   r   r#   r(   r   r)   r+   r   r   r   r   r€   ©   s    

r€   ÚDEFAULTr    c                 C   sT   dd l }|j dd ¡}|d ur&|tkr&| d¡\}}t |¡}t||ƒa|at| ƒS )Nr   ÚTRITON_CACHE_MANAGERr‚   )	r   rq   rF   Ú__cache_cls_nmerƒ   r„   r…   r†   Ú__cache_cls)r   r   Úuser_cache_managerrŒ   r   rŽ   r   r   r   Úget_cache_managerú   s   

r   c                 C   ó   t | ddS )NT)r   ©r›   ©r   r   r   r   Úget_override_manager
  ó   r¡   c                 C   rž   )NT)r   rŸ   r    r   r   r   Úget_dump_manager  r¢   r£   c                 K   sl   dd„ |  ¡ D ƒ}| › dd | ¡ ¡› d|› d|› }|D ]}|› d| |¡› }qt | d¡¡ ¡ }|S )Nc                 S   s&   i | ]\}}||d  dkrdn|“qS )r   Ú*Úptrr   )rx   ÚkÚvr   r   r   r{     s   & z%make_so_cache_key.<locals>.<dictcomp>ú-r5   r’   )rG   r   ÚvaluesrF   ÚhashlibÚsha256r“   Ú	hexdigest)Úversion_hashÚ	signatureÚ	constantsÚidsÚkwargsr   Úkwr   r   r   Úmake_so_cache_key  s   $r³   )r„   rD   r   rX   Úabcr   r   Úpathlibr   Útypingr   r   r   rª   r   r   r   r   r1   rd   rh   r€   r›   rš   r   r¡   r£   r³   r   r   r   r   Ú<module>   s,    UM