bbf6d9b026
Bugfix for feeds - removed categories related and up - load new books now working - category random now working login page is free of non accessible elements boolean custom column is vivible in UI books with only with certain languages can be shown book shelfs can be deleted from UI Anonymous user view is more resticted Added browse of series in sidebar Dependencys in vendor folder are updated to newer versions (licencs files are now present) Bugfix editing Authors names Made upload on windows working
92 lines
3.4 KiB
Python
92 lines
3.4 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# Copyright 2012 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.
|
|
"""KQueue-based IOLoop implementation for BSD/Mac systems."""
|
|
from __future__ import absolute_import, division, print_function, with_statement
|
|
|
|
import select
|
|
|
|
from tornado.ioloop import IOLoop, PollIOLoop
|
|
|
|
assert hasattr(select, 'kqueue'), 'kqueue not supported'
|
|
|
|
|
|
class _KQueue(object):
|
|
"""A kqueue-based event loop for BSD/Mac systems."""
|
|
def __init__(self):
|
|
self._kqueue = select.kqueue()
|
|
self._active = {}
|
|
|
|
def fileno(self):
|
|
return self._kqueue.fileno()
|
|
|
|
def close(self):
|
|
self._kqueue.close()
|
|
|
|
def register(self, fd, events):
|
|
if fd in self._active:
|
|
raise IOError("fd %s already registered" % fd)
|
|
self._control(fd, events, select.KQ_EV_ADD)
|
|
self._active[fd] = events
|
|
|
|
def modify(self, fd, events):
|
|
self.unregister(fd)
|
|
self.register(fd, events)
|
|
|
|
def unregister(self, fd):
|
|
events = self._active.pop(fd)
|
|
self._control(fd, events, select.KQ_EV_DELETE)
|
|
|
|
def _control(self, fd, events, flags):
|
|
kevents = []
|
|
if events & IOLoop.WRITE:
|
|
kevents.append(select.kevent(
|
|
fd, filter=select.KQ_FILTER_WRITE, flags=flags))
|
|
if events & IOLoop.READ:
|
|
kevents.append(select.kevent(
|
|
fd, filter=select.KQ_FILTER_READ, flags=flags))
|
|
# Even though control() takes a list, it seems to return EINVAL
|
|
# on Mac OS X (10.6) when there is more than one event in the list.
|
|
for kevent in kevents:
|
|
self._kqueue.control([kevent], 0)
|
|
|
|
def poll(self, timeout):
|
|
kevents = self._kqueue.control(None, 1000, timeout)
|
|
events = {}
|
|
for kevent in kevents:
|
|
fd = kevent.ident
|
|
if kevent.filter == select.KQ_FILTER_READ:
|
|
events[fd] = events.get(fd, 0) | IOLoop.READ
|
|
if kevent.filter == select.KQ_FILTER_WRITE:
|
|
if kevent.flags & select.KQ_EV_EOF:
|
|
# If an asynchronous connection is refused, kqueue
|
|
# returns a write event with the EOF flag set.
|
|
# Turn this into an error for consistency with the
|
|
# other IOLoop implementations.
|
|
# Note that for read events, EOF may be returned before
|
|
# all data has been consumed from the socket buffer,
|
|
# so we only check for EOF on write events.
|
|
events[fd] = IOLoop.ERROR
|
|
else:
|
|
events[fd] = events.get(fd, 0) | IOLoop.WRITE
|
|
if kevent.flags & select.KQ_EV_ERROR:
|
|
events[fd] = events.get(fd, 0) | IOLoop.ERROR
|
|
return events.items()
|
|
|
|
|
|
class KQueueIOLoop(PollIOLoop):
|
|
def initialize(self, **kwargs):
|
|
super(KQueueIOLoop, self).initialize(impl=_KQueue(), **kwargs)
|