From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Thibault Subject: [PATCH] [Mini-OS] Make semaphores callback-safe Date: Fri, 23 Nov 2007 16:45:03 +0000 Message-ID: <20071123164503.GA12130@implementation.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org One may want to use semaphores in event handlers to wake threads waiting for a resource, so semaphores then need to be callback-safe. Signed-off-by: Samuel Thibault --- Note: there is no such use in the current code, but I have an overflow fix for netfront which depends on this. diff -r f2711b7eae95 -r 36bf1e737b87 extras/mini-os/include/semaphore.h --- a/extras/mini-os/include/semaphore.h Thu Nov 22 19:55:42 2007 +0000 +++ b/extras/mini-os/include/semaphore.h Fri Nov 23 13:21:02 2007 +0000 @@ -41,14 +41,25 @@ static void inline down(struct semaphore *sem) { - wait_event(sem->wait, sem->count > 0); + unsigned long flags; + while (1) { + wait_event(sem->wait, sem->count > 0); + local_irq_save(flags); + if (sem->count > 0) + break; + local_irq_restore(flags); + } sem->count--; + local_irq_restore(flags); } static void inline up(struct semaphore *sem) { + unsigned long flags; + local_irq_save(flags); sem->count++; wake_up(&sem->wait); + local_irq_restore(flags); } /* FIXME! Thre read/write semaphores are unimplemented! */