Changeset 241 for tbroadcast


Ignore:
Timestamp:
Aug 28, 2006, 4:50:44 PM (18 years ago)
Author:
garonne
Message:

add semaphores

Location:
tbroadcast/v2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tbroadcast/v2/python/tbroadcast.py

    r240 r241  
    1313import commands
    1414import traceback
     15from threading import BoundedSemaphore
    1516
    1617from threadpool import WorkRequest
     
    2425
    2526    def __init__(self, num_workers=20):
    26         self.pool     = ThreadPool(num_workers=num_workers)
    27         self.packages = {} 
     27        self.pool            = ThreadPool(num_workers=num_workers)
     28        self.current_package = self.get_current_package()
     29        self.packages        = {} 
     30        self.counter         = 0
     31        self.semaphore       = BoundedSemaphore(1)
    2832        self.check_cycles()
    2933        self.instanciate_packages ()     
    30 
    31 
     34        self.reduce_graph ()
     35       
     36    def get_counter(self):
     37        self.semaphore.acquire ()       
     38        self.counter = self.counter + 1
     39        value = self.counter
     40        self.semaphore.release()
     41        return value
     42       
    3243    def check_cycles (self):
    3344        cmd = 'cmt show cycles'
     
    5667            sys.exit(-1)   
    5768        lines = string.split(output, '\n')
    58         current_package = self.get_current_package()
    59         self.packages [current_package] = {'version': '*', 'dependencies': list(), 'status': 'waiting', 'path':os.getcwd()}
     69        self.packages [self.current_package] = {'version': '*', 'dependencies': list(), 'status': 'waiting', 'path':os.getcwd(), 'indice':1}
    6070        indice  = 1
    6171        for line in lines:
     
    6373                name    = string.split (line)[2]
    6474                version = string.split (line)[3]
    65                 if name not in self.packages[current_package]['dependencies']:
    66                    self.packages[current_package]['dependencies'].append (name)               
     75                if name not in self.packages[self.current_package]['dependencies']:
     76                   self.packages[self.current_package]['dependencies'].append (name)               
    6777                   #print '\n#', indice,':: add package', name
    6878                   indice = indice + 1
    6979                if not self.packages.has_key (name):
    70                    self.packages [name] = {'version': version, 'dependencies': list(), 'status': 'waiting', 'path': None}               
     80                   self.packages [name] = {'version': version, 'dependencies': list(), 'status': 'waiting', 'path': None, 'indice':indice}               
     81                   indice = indice + 1
    7182                   found = False
    7283                   for ligne in lines:
     
    8798                    if len(result)==4:
    8899                        name, version, offset, path = string.split (line[4:len(line)], " ")
     100                        #print name, version, offset, path
     101                        #print path[1:-1] + '/' + offset + '/' +name + '/' + version + '/cmt'
     102                        if path == '(no_auto_imports)':
     103                            path   = offset
     104                            offset = ''
    89105                        if os.path.exists(path[1:-1] + '/' + offset + '/' +name + '/' + version + '/cmt'):
    90106                            full_path = path[1:-1] + '/' + offset + '/' +name + '/' + version + '/cmt'
     
    155171            print key, '-->', self.packages[key] ['dependencies'],',', self.packages[key] ['status']                       
    156172
     173    def print_status(self, status):
     174        print '# ------------------------'
     175        print '# package --> dependencies'
     176        print '# ------------------------'
     177        i = 1
     178        for key in self.packages.keys():
     179            if self.packages[key] ['status'] == status:
     180                print i , key, '-->', self.packages[key] ['dependencies'],',', self.packages[key] ['status']                 
     181                i = i + 1
     182               
     183    def reduce_graph(self):
     184        packages     = {}
     185        dependencies = list ()               
     186        dependencies.append (self.current_package)               
     187        space = ' '
     188        #print '-->', self.current_package
     189        packages[self.current_package] = list()
     190        for package in self.packages[self.current_package]['dependencies']:
     191            if package not in dependencies:
     192                dependencies.append(package)           
     193                packages[self.current_package].append(package)
     194                packages[package] = list()                       
     195                #print '  -->', package
     196                limit = True
     197                for paquetage in self.packages[package]['dependencies']:
     198                    if paquetage not in dependencies:                       
     199                        space = space + ' '
     200                        #print space, paquetage
     201                        dependencies.append (paquetage)
     202                        packages[package].append (paquetage)
     203            else:
     204                packages[package] = list()                               
     205                space = ''       
     206        for key in packages:
     207            #print key, packages[key]
     208            self.packages[key]['dependencies'] = packages[key]
     209           
    157210    def is_work_unit_waiting (self, name):
    158211        return self.packages[name] ['status'] == 'waiting'
     
    183236            if name in self.packages[key]['dependencies']:
    184237                self.packages[key]['dependencies'].remove(name)
    185                
     238
    186239    def add_work_unit (self, name, cmd):
    187240        if self.is_work_unit_waiting (name):
     
    204257
    205258    def execute_all(self,command):
     259        #self.print_dependencies ()
    206260        self.execute (command)
    207261        self.wait()
    208         ##while self.is_work_units():
     262        #self.print_dependencies ()
     263        #self.print_status (status='waiting')       
     264        #print self.is_work_units()
     265        #while self.is_work_units():
     266        #            self.wait()           
    209267       
    210268    def wait (self):
     
    226284      os.chdir(path)       
    227285      print '#--------------------------------------------------------------'
    228       print '# Now trying ['+ arg['cmd']+'] in ' + path
     286      print '# ('+str(self.get_counter())+'/'+str(len(self.packages))+') Now trying ['+ arg['cmd']+'] in ' + path
    229287      print '#--------------------------------------------------------------'
    230288      cmd = arg['cmd']
     
    245303      print '#--------------------------------------------------------------'   
    246304      sys.exit(-1)
    247 #--------- EoF --------#   
     305#--------- EoF --------#
  • tbroadcast/v2/scripts/tbroadcast

    r240 r241  
    3737              command = arg
    3838
    39     master = Scheduler (num_workers=num_worker)       
     39    master = Scheduler (num_workers=num_worker)
    4040    master.execute_all (command)
    4141
Note: See TracChangeset for help on using the changeset viewer.