Advertisement
Guest User

Untitled

a guest
Nov 20th, 2011
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.27 KB | None | 0 0
  1. import System
  2. import System.IO
  3. import System.Collections.Generic
  4. import System.Runtime.InteropServices
  5. import System.IO.MemoryMappedFiles
  6.  
  7.  
  8. struct memblock:
  9. """
  10. блок памяти
  11. """    
  12.     static _delta as int
  13.    
  14.     static delta as int:
  15.         get:
  16.             if _delta == 0:
  17.            
  18.                 _delta = Marshal.SizeOf(memblock)              
  19.                
  20.             return _delta
  21.    
  22.     static def size_type(type as Type):
  23.     """
  24.     из-за глюка    Marshal.SizeOf(char) == 1
  25.     """
  26.         if type == char:
  27.            
  28.             return 2
  29.            
  30.         return Marshal.SizeOf(type)
  31.        
  32.     public length as int    //длинна содержащегося   блока 
  33.    
  34.     size as int:   
  35.     //блок со структурой
  36.         get:
  37.             add = (length % 4) //выравнивание границы блока
  38.            
  39.             if add:
  40.                
  41.                 add = 4 - add
  42.                
  43.             return delta + length + add
  44.            
  45.     def constructor(count as int, type as Type):
  46.        
  47.         length = count * size_type(type)
  48.    
  49.    
  50. struct root_data:      
  51.    
  52.     d_free as int//смещение первого свободного блока
  53.    
  54.     d_new as int  //смещение чистой памяти     
  55.  
  56.     d_root_obj as int //рутовый объект
  57.            
  58.    
  59. class datamap_file:
  60. """
  61. управляющая структура
  62. """
  63.     root_obj as int:
  64.         get:
  65.             return root.d_root_obj                             
  66.         set:
  67.             root.d_root_obj = value
  68.            
  69.     use_size as int:
  70.         get:
  71.             return root.d_new
  72.            
  73.     mmf as MemoryMappedFile
  74.    
  75.     accessor as MemoryMappedViewAccessor
  76.    
  77.     root as root_data  
  78.     //хранение соответствий адрес - объект
  79.     public map_objects = Dictionary[of int, object]()                      
  80.        
  81.     def constructor(fname as string, size as int)
  82.  
  83.         exist = File.Exists(fname)
  84.        
  85.         mmf = MemoryMappedFile.CreateFromFile(fname, FileMode.OpenOrCreate, fname, size)
  86.        
  87.         accessor = mmf.CreateViewAccessor()            
  88.        
  89.         if exist:
  90.            
  91.             root = load[of root_data](0)
  92.         else:      
  93.             root.d_new = memblock(1,root_data).size
  94.            
  95.             save_root()                                    
  96.        
  97.     def save_root():
  98.     """
  99.     вызывать всегда после коррекции базы
  100.     """
  101.         accessor.Write[of root_data](memblock.delta, root)             
  102.                    
  103.     def free(delta_block as int):
  104.     """
  105.     освободить массив по смещению array_index
  106.     """
  107.         delta = memblock.delta + delta_block   
  108.  
  109.         accessor.Write(delta, root.d_free)
  110.        
  111.         root.d_free = delta_block      
  112.        
  113.     def try_from_free(need_size as int):           
  114.  
  115.         if root.d_free:
  116.            
  117.             o as memblock
  118.            
  119.             prev_delta = 0
  120.            
  121.             free_delta = root.d_free
  122.            
  123.             while free_delta:
  124.            
  125.                 accessor.Read[of memblock](free_delta, o)
  126.                
  127.                 if o.size >= need_size:
  128.                    
  129.                     if prev_delta:                 
  130.                         //смещение следующего за free
  131.                         next_free as int
  132.                        
  133.                         accessor.Read[of int](o.delta + free_delta, next_free)
  134.                        
  135.                         accessor.Write(o.delta + prev_delta,next_free) //записать предыдущему
  136.                     else: //это первый блок
  137.                         root.d_free = 0
  138.  
  139.                     return free_delta
  140.                    
  141.                 prev_delta = free_delta
  142.                
  143.                 accessor.Read[of int](o.delta + free_delta, free_delta)
  144.                
  145.         return 0
  146.        
  147.     def write[of T(struct)](dinfo as T, ref delta as int):     
  148.     """
  149.     загрузить первое T из блока по смещению delta
  150.     """
  151.         delta = alloc(1,T) if not delta            
  152.        
  153.         accessor.Write[of T](delta + memblock.delta, dinfo)
  154.                
  155.                
  156.     def write_arr[of T(struct)](arr as (T), ref delta as int):     
  157.     """
  158.     загрузить первое T из блока по смещению delta
  159.     """
  160.         count = arr.Length
  161.        
  162.         if not delta:
  163.        
  164.             delta = alloc(count,T)  if  count  
  165.         else:                          
  166.             if count == 0:
  167.                
  168.                 free(delta)
  169.                
  170.                 delta = 0          
  171.             else:
  172.                 block as memblock
  173.                
  174.                 accessor.Read[of memblock](delta, block)
  175.                
  176.                 size = block.length / memblock.size_type(T)
  177.                
  178.                 if size < count:
  179.  
  180.                     free(delta)
  181.                    
  182.                     delta = alloc(count,T)
  183.                    
  184.                 else:
  185.                     requiest = memblock(count, T)
  186.                    
  187.                     if block != requiest:
  188.                    
  189.                         accessor.Write[of memblock](delta, requiest)               
  190.         if delta:
  191.        
  192.             accessor.WriteArray[of T](delta + memblock.delta, arr, 0,  count)              
  193.        
  194.     def write_string(str as string, ref delta as int):             
  195.        
  196.         write_arr[of Char](str.ToCharArray(), delta)                       
  197.        
  198.     def load[of T(struct)](delta as int):      
  199.     """
  200.     загрузить первое T из блока по смещению delta
  201.     """
  202.         dinfo as T
  203.        
  204.         accessor.Read[of T](delta + memblock.delta, dinfo)
  205.        
  206.         return dinfo
  207.        
  208.     def load_arr[of T(struct)](delta as int):
  209.     """
  210.     загрузить массив T из блока по смещению delta
  211.     """    
  212.         dinfo as memblock
  213.        
  214.         accessor.Read[of memblock](delta, dinfo)
  215.        
  216.         size = dinfo.length / memblock.size_type(T)
  217.        
  218.         res = array(T, size)
  219.        
  220.         accessor.ReadArray[of T](delta + memblock.delta, res, 0,  size)
  221.        
  222.         return res
  223.        
  224.     def load_string(delta as int):
  225.        
  226.         arr = load_arr[of Char](delta)
  227.        
  228.         return string(arr)
  229.        
  230.     def alloc(leng as int, type as Type):
  231.     """
  232.     рассчитать смещение массива и разметить
  233.     """
  234.         block = memblock(leng, type)
  235.        
  236.         delta = try_from_free(block.size)
  237.        
  238.         if delta == 0:
  239.            
  240.             delta = root.d_new
  241.            
  242.             root.d_new += block.size               
  243.        
  244.         accessor.Write[of memblock](delta, block)
  245.            
  246.         return delta   
  247.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement