WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] scheduler.py:

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] scheduler.py:
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Wed, 18 May 2005 15:21:25 +0000
Delivery-date: Wed, 18 May 2005 16:04:56 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1448.1.1, 2005/05/18 16:21:25+01:00, cl349@xxxxxxxxxxxxxxxxxxxx

        scheduler.py:
          Simplify scheduler by removing support for cancelling timeouts.
          Also add a ``now'' function to run a function in a seperate thread.
        XendDomain.py:
          g/c gratuitous refresh() calls.
          Drive domain restart off the virq signaling that a domain has 
terminated.
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 XendDomain.py |   52 ++++++----------------------------------------------
 scheduler.py  |   50 ++++++++++++++------------------------------------
 2 files changed, 20 insertions(+), 82 deletions(-)


diff -Nru a/tools/python/xen/xend/XendDomain.py 
b/tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       2005-05-18 12:05:35 -04:00
+++ b/tools/python/xen/xend/XendDomain.py       2005-05-18 12:05:35 -04:00
@@ -111,35 +111,6 @@
         print 'onVirq>', val
         self.refresh()
 
-    def schedule_later(self, _delay, _name, _fn, *args):
-        """Schedule a function to be called later (if not already scheduled).
-
-        @param _delay: delay in seconds
-        @param _name:  schedule name
-        @param _fn:    function
-        @param args:   arguments
-        """
-        self.scheduler.later(_delay, _name, _fn, args)
-        
-    def schedule_cancel(self, name):
-        """Cancel a scheduled function call.
-        
-        @param name: schedule name to cancel
-        """
-        self.scheduler.cancel(name)
-
-    def domain_restarts_schedule(self, delay=1):
-        """Schedule domain_restarts to be called later.
-        
-        @param delay: delay in seconds
-        """
-        self.schedule_later(delay, 'domain_restarts', self.domain_restarts)
-        
-    def domain_restarts_cancel(self):
-        """Cancel any scheduled call of domain_restarts.
-        """
-        self.schedule_cancel('domain_restarts')
-        
     def rm_all(self):
         """Remove all domain info. Used after reboot.
         """
@@ -302,8 +273,6 @@
                eserver.inject('xend.domain.exit', [name, id, 'crash']) 
             destroyed += 1
             self.final_domain_destroy(id)
-        if self.domain_restarts_exist():
-            self.domain_restarts_schedule()
 
     def refresh(self):
         """Refresh domain list from Xen.
@@ -316,14 +285,17 @@
                 self.domain_lookup(id)
         # Remove entries for domains that no longer exist.
         # Update entries for existing domains.
+        do_domain_restarts = False
         for d in self.domain_by_id.values():
             info = doms.get(d.id)
             if info:
                 d.update(info)
             elif d.restart_pending():
-                pass
+                do_domain_restarts = True
             else:
                 self._delete_domain(d.id)
+        if do_domain_restarts:
+            self.scheduler.now(self.domain_restarts)
 
     def update_domain(self, id):
         """Update the saved info for a domain.
@@ -360,7 +332,6 @@
 
         @return: domain names
         """
-        self.refresh()
         return self.domain_by_id.keys()
 
     def domains(self):
@@ -368,7 +339,6 @@
 
         @return: domain objects
         """
-        self.refresh()
         return self.domain_by_id.values()
     
     def domain_create(self, config):
@@ -515,7 +485,6 @@
         """Process pending domain shutdowns.
         Destroys domains whose shutdowns have timed out.
         """
-        self.schedule_cancel('domain_shutdowns')
         timeout = SHUTDOWN_TIMEOUT
         for shutdown in self.shutdowns_by_id.values():
             id = shutdown.getDomain()
@@ -538,7 +507,7 @@
                 timeout = min(timeout, shutdown.getTimeout())
         if self.shutdowns_by_id:
             # Pending shutdowns remain - reschedule.
-            self.schedule_later(timeout, 'domain_shutdowns', 
self.domain_shutdowns)
+            self.scheduler.later(timeout, self.domain_shutdowns)
 
     def domain_restart_schedule(self, id, reason, force=False):
         """Schedule a restart for a domain if it needs one.
@@ -563,7 +532,6 @@
         log.info('Scheduling restart for domain: name=%s id=%s', dominfo.name, 
dominfo.id)
         eserver.inject("xend.domain.restart",
                        [dominfo.name, dominfo.id, "schedule"])
-        self.domain_restarts_schedule()
             
     def domain_restart_cancel(self, id):
         """Cancel any restart scheduled for a domain.
@@ -583,7 +551,6 @@
     def domain_restarts(self):
         """Execute any scheduled domain restarts for domains that have gone.
         """
-        self.domain_restarts_cancel()
         doms = self.xen_domains()
         for dominfo in self.restarts_by_id.values():
             print 'domain_restarts>', dominfo.name, dominfo.id
@@ -597,13 +564,7 @@
             del self.restarts_by_name[dominfo.name]
             print 'domain_restarts> restarting: ', dominfo.name
             self.domain_restart(dominfo)
-        if self.domain_restarts_exist():
-            # Run again later if any restarts remain.
-            self.domain_restarts_schedule(delay=10)
-
-    def domain_restarts_exist(self):
-        return len(self.restarts_by_id)
-        
+
     def final_domain_destroy(self, id):
         """Final destruction of a domain..
 
@@ -631,7 +592,6 @@
         """
         self.domain_restart_schedule(id, reason, force=True)
         val = self.final_domain_destroy(id)
-        self.refresh()
         return val
 
     def domain_migrate(self, id, dst, live=False, resource=0):
diff -Nru a/tools/python/xen/xend/scheduler.py 
b/tools/python/xen/xend/scheduler.py
--- a/tools/python/xen/xend/scheduler.py        2005-05-18 12:05:35 -04:00
+++ b/tools/python/xen/xend/scheduler.py        2005-05-18 12:05:35 -04:00
@@ -2,50 +2,28 @@
 
 class Scheduler:
 
-    def __init__(self):
-        self.lock = threading.Lock()
-        self.schedule = {}
-
-    def later(self, _delay, _name, _fn, args, kwargs={}):
-        """Schedule a function to be called later (if not already scheduled).
+    def later(self, _delay, _fn, args=(), kwargs={}):
+        """Schedule a function to be called later.
 
         @param _delay: delay in seconds
-        @param _name:  schedule name
         @param _fn:    function
         @param args:   arguments (list)
         @param kwargs  keyword arguments (map)
         """
-        try:
-            self.lock.acquire()
-            if self.schedule.get(_name): return
-            runargs = [ _name, _fn, args, kwargs ]
-            timer = threading.Timer(_delay, self._run, args=runargs)
-            self.schedule[_name] = timer
-        finally:
-            self.lock.release()
+        runargs = [ _fn, args, kwargs ]
+        timer = threading.Timer(_delay, self._run, args=runargs)
         timer.start()
 
-    def cancel(self, name):
-        """Cancel a scheduled function call.
-        
-        @param name: schedule name to cancel
-        """
-        timer = self._remove(name)
-        if timer:
-            timer.cancel()
+    def now(self, _fn, args=(), kwargs={}):
+        """Schedule a function to be called now.
 
-    def _remove(self, name):
-        try:
-            self.lock.acquire()
-            timer = self.schedule.get(name)
-            if timer:
-                del self.schedule[name]
-            return timer
-        finally:
-            self.lock.release()
+        @param _fn:    function
+        @param args:   arguments (list)
+        @param kwargs  keyword arguments (map)
+        """
+        runargs = [ _fn, args, kwargs ]
+        thread = threading.Thread(target=self._run, args=runargs)
+        thread.start()
 
-    def _run(self, name, fn, args, kwargs):
-        self._remove(name)
+    def _run(self, fn, args, kwargs):
         fn(*args, **kwargs)
-
-        

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] scheduler.py:, BitKeeper Bot <=