def cancel_call(self, call):
        """Cancels the specified deferred call."""

        for call_id in range(len(self.__deferred_calls)):
            if self.__deferred_calls[call_id] is call:
                del self.__deferred_calls[call_id]
                return
Example #2
0
def close_all_fds(except_fds=[STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO]):
    """Closes all opened file descriptors."""

    if platform.system() == "Darwin":
        fd_path = "/dev/fd"
    else:
        fd_path = "/proc/self/fd"

    try:
        opened_fds = [ int(fd) for fd in os.listdir(fd_path) ]
    except EnvironmentError:
        max_fd_num = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
        if max_fd_num == resource.RLIM_INFINITY:
            max_fd_num = 1024
        opened_fds = range(0, max_fd_num)

    for fd in opened_fds:
        if fd not in except_fds:
            try:
                eintr_retry(os.close)(fd)
            except EnvironmentError as e:
                if e.errno != errno.EBADF:
                    raise e
Example #3
0
File: __init__.py Project: wd5/psys
def close_all_fds(except_fds = [ STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO ]):
    """Closes all opened file descriptors."""

    if platform.system() == "Darwin":
        fd_path = "/dev/fd"
    else:
        fd_path = "/proc/self/fd"

    try:
        opened_fds = [ int(fd) for fd in os.listdir(fd_path) ]
    except EnvironmentError:
        max_fd_num = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
        if max_fd_num == resource.RLIM_INFINITY:
            max_fd_num = 1024
        opened_fds = range(0, max_fd_num)

    for fd in opened_fds:
        if fd not in except_fds:
            try:
                eintr_retry(os.close)(fd)
            except EnvironmentError as e:
                if e.errno != errno.EBADF:
                    raise e
    def __process_deferred_calls(self):
        """Processes pending deferred calls."""

        if not self.__deferred_calls:
            return

        cur_time = time.time()
        precision = 0.001

        for call_id in range(len(self.__deferred_calls)):
            if self.__deferred_calls[call_id].time - precision > cur_time:
                pending_calls = self.__deferred_calls[:call_id]
                del self.__deferred_calls[:call_id]
                break
        else:
            pending_calls = self.__deferred_calls
            self.__deferred_calls = []

        for call in pending_calls:
            try:
                call.func()
            except Exception:
                LOG.exception("A deferred call crashed.")