'Acquire, run, release.
This function takes a callable as its first argument and any
number of other positional and keyword arguments.  When the
lock or semaphore is acquired, the callable will be invoked
with those arguments.
The callable may return a L{Deferred}; if it does, the lock or
semaphore won\'t be released until that L{Deferred} fires.
@return: L{Deferred} of function result.'

def run(*args, **kwargs):

    if (len(args) < 2):
        if (not args):
            raise TypeError('run()    takes    at    least    2    arguments,    none    given.')
        raise TypeError(('%s.run()    takes    at    least    2    arguments,    1    given' % (args[0].__class__.__name__,)))
    (self, f) = args[:2]
    args = args[2:]
    def execute(ignoredResult):
        d = maybeDeferred(f, *args, **kwargs)
        d.addBoth(self._releaseAndReturn)
        return d
    d = self.acquire()
    d.addCallback(execute)
    return d
