import os
import sys

from gunicorn.workers.base import Worker
from gunicorn.glogging import Logger

from meinheld import server
from meinheld.mlogging import _access, _error


class MeinheldWorker(Worker):

    def __init__(self, *args, **kwargs):
        Worker.__init__(self, *args, **kwargs)
        Logger.access = _access
        Logger.error = _error

        if self.cfg.accesslog is self.cfg.logconfig is None:
            server.set_access_logger(None)
        else:
            server.set_access_logger(self.log)

        server.set_error_logger(self.log)

    def watchdog(self):
        self.notify()

        if self.ppid != os.getppid():
            self.log.info("Parent changed, shutting down: %s" % self)
            server.stop(int(self.timeout))

    def run(self):

        if hasattr(self, "sockets"):
            fds = [s.fileno() for s in self.sockets]
        else:
            fds = [self.socket.fileno()]

        server.set_keepalive(self.cfg.keepalive)
        server.set_picoev_max_fd(self.cfg.worker_connections)

        server.set_fastwatchdog(self.tmp.fileno(), self.ppid, int(self.timeout))
        #server.set_watchdog(self.watchdog)

        server.set_listen_socket(fds)
        try:
            server.run(self.wsgi)
        except KeyboardInterrupt:
            pass

    def handle_quit(self, sig, frame):
        server.stop(int(self.timeout))

    def handle_exit(self, sig, frame):
        server.stop()
        sys.exit(0)
