Source code for enamlnative.core.eventloop.posix

#!/usr/bin/env python
#
# Copyright 2011 Facebook
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

"""Posix implementations of platform-specific functionality."""

from __future__ import division, print_function

import fcntl
import os

from . import interface
from . import common


[docs]def set_close_exec(fd): flags = fcntl.fcntl(fd, fcntl.F_GETFD)
fcntl.fcntl(fd, fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC) def _set_nonblocking(fd): flags = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK)
[docs]class Waker(interface.Waker):
[docs] def __init__(self): r, w = os.pipe() _set_nonblocking(r) _set_nonblocking(w) set_close_exec(r) set_close_exec(w) self.reader = os.fdopen(r, "rb", 0)
self.writer = os.fdopen(w, "wb", 0)
[docs] def fileno(self):
return self.reader.fileno()
[docs] def write_fileno(self):
return self.writer.fileno()
[docs] def wake(self): try: self.writer.write(b"x") except (IOError, ValueError):
pass
[docs] def consume(self): try: while True: result = self.reader.read() if not result: break except IOError:
pass
[docs] def close(self): self.reader.close()
common.try_close(self.writer)