poky: subtree update:1203d1f24d..2dcd1f2a21

Alejandro Enedino Hernandez Samaniego (2):
      python3: Improve logging, syntax and update deprecated modules to create_manifest
      python3: Upgrade 3.9.2 -> 3.9.4

Alexander Kanavin (22):
      scripts/oe-debuginfod: correct several issues
      libmicrohttpd: add a recipe from meta-oe
      maintainers.inc: add libmicrohttpd entry
      xwayland: add a standalone recipe
      weston: use standalone xwayland instead of outdated xserver-xorg version
      elfutils: correct debuginfod builds on x32
      elfutils: adjust ptests for correct debuginfod testing
      default-distrovars.inc: add debuginfod to default DISTRO_FEATURES
      oeqa: tear down oeqa decorators if one of them raises an exception in setup
      meta/lib/oeqa/core/tests/cases/timeout.py: add a testcase for the previous fix
      core-image-weston: add sdk/ptest images
      oeqa/core/tests/test_data.py: use weston image instead of sato
      oeqa/selftest: transition to weston images
      core-image-multilib-example: base on weston, and not sato
      dev-manual/common-tasks.rst: correct the documentation for debuginfod
      diffoscope: add native libraries to LD_LIBRARY_PATH
      Revert "oeqa: Set LD_LIBRARY_PATH when executing native commands"
      boost: correct upstream version check
      vte: use tarballs again
      gdk-pixbuf: update 2.40.0 -> 2.42.6
      glib-2.0: update 2.68.0 -> 2.68.1
      gnu-config: update to latest revision

Anatol Belski (1):
      cross-canadian: Whitelist "mingw32" as TARGET_OS

Anders Wallin (3):
      lttng-tools: Fix missing legacy test files
      lttng-tools: Fix path for test_python_looging
      scripts/contrib/image-manifest: add new script

Andreas Müller (1):
      xwayland: remove protocol.txt - it clashes with xserver-xorg

Anthony Bagwell (1):
      systemd: upgrade 247.4 -> 247.6

Anuj Mittal (2):
      Revert "qemu: fix CVE-2021-3392"
      qemu: fix CVE-2021-3392

Armin Kuster (6):
      binutils: rename BRANCH var
      libseccomp: move recipe from meta-security to core
      gnutls: Enable seccomp if FEATURE is set
      systemd: Enable seccomp if FEATURE is set
      qemu: Enable seccomp if FEATURE is set
      default-distrovars.inc: Add seccomp to DISTRO_FEATURES_DEFAULT

Bastian Krause (1):
      ccache: add packageconfig docs option

Bruce Ashfield (20):
      kern-tools: add dropped options to audit output
      linux-yocto/5.4: update to v5.4.109
      linux-yocto/5.10: update to v5.10.27
      linux-yocto/5.10: BSP configuration fixes
      linux-yocto/5.10: update to v5.10.29
      linux-yocto/5.4: update to v5.4.111
      linux-yocto/5.10: update to v5.10.30
      linux-yocto-rt/5.10: update to -rt34
      linux-yocto/5.4: update to v5.4.112
      linux-yocto/5.4: fix arm defconfig warnings
      linux-yocto/5.10: fix arm defconfig warnings
      linux-yocto/5.10: aufs fixes
      linux-yocto/5.10: qemuriscv32.cfg: RV32 only supports 1G physical memory
      linux-yocto/5.10: update to v5.10.32
      perf: fix python-audit RDEPENDS
      linux-yocto/5.4: update to v5.4.114
      linux-yocto/5.10: update to v5.10.34
      linux-yocto/5.4: update to v5.4.116
      linux-yocto/5.10: qemuppc32: reduce serial shutdown issues
      yocto-check-layer: Only note a layer without a conf/layer.conf (versus error)

Changqing Li (2):
      libpam: make volatile files created successfully
      gcr: fix one parallel build failure

Chen Qi (3):
      busybox: fix CVE-2021-28831
      weston: fix build failure due to race condition
      rsync: fix CVE-2020-14387

Christophe Chapuis (1):
      rootfs.py: find .ko.gz and .ko.xz kernel modules as well

Daniel Ammann (1):
      archiver: Fix typos

Devendra Tewari (2):
      bitbake: lib/bb: Add bb.utils.rename() helper function and use for renaming
      classes/lib/scripts: Use bb.utils.rename() instead of os.rename()

Diego Sueiro (3):
      oeqa/selftest/bblayers: Add test case for bitbake-layers layerindex-show-depends
      bitbake: layerindex: Fix bitbake-layers layerindex-show-depends command
      bitbake: layerindex: Add --fetchdir parameter to layerindex-fetch

Douglas Royds (2):
      Revert "externalsrc: Detect code changes in submodules"
      externalsrc: Detect code changes in submodules

Gavin Li (1):
      kmod: do not symlink config.guess/config.sub during autoreconf

Harald Brinkmann (1):
      bitbake: fetch/svn: Fix parsing revision of SVN repos with redirects

He Zhe (1):
      linux-yocto-dev: add features/scsi/scsi-debug.scc features/gpio/mockup.scc to KERNEL_FEATURES

Henning Schild (3):
      bitbake: fetch/git: add support for disabling shared clones on unpack
      bitbake: tests/fetch: deduplicate local git testing code
      bitbake: tests/fetch: add tests for local and remote "noshared" git fetching

Jon Mason (1):
      oeqa/runtime: space needed

Jonas Höppner (1):
      ltp: fix empty ltp-dev package

Jose Quaresma (4):
      gstreamer1.0: update patch upstream status
      ptest-runner: libgcc must be installed for pthread_cancel to work
      gstreamer1.0: rename patches
      gstreamer1.0: update ptest patch

Joshua Watt (2):
      bitbake: knotty: Re-enable command line logging levels
      classes/image: Use xargs to set file timestamps

Kai Kang (2):
      cmake.bbclass: remove ${B} before cmake_do_configure
      kernel-yocto.bbclass: chdir to ${WORKDIR} for do_kernel_checkout

Kevin Hao (3):
      modutils-initscripts: Bail out when no module is installed
      sysvinit-inittab/start_getty: Check /sys for the tty device existence
      Revert "inittab: Add getty launch on hvc0 for qemuppc64"

Khairul Rohaizzat Jamaluddin (1):
      qemu: Fix CVE-2020-35517

Khem Raj (54):
      gcc: Upgrade to 10.3.0 bug-fix release
      glibc: Rename glibc src package
      gcc-runtime: Make DEBUG_PREFIX_MAP relative to S
      valgrind: Delete trailing whitespaces
      valgrind: Add glibc-src to ptest rdeps
      valgrind: Add libstdc++ debug symbols for ptest
      vte: Upgrade to 0.64.0 release
      systemd: Fix build on mips/musl
      epiphany: Add missing dependency on gnutls
      cups: Turn gnutls into a packageconfig knob
      wpa-supplicant: Enable openssl
      curl: Use openssl backend
      libpsl: Add config knobs for runtime/builtin conversion choices
      glib-networking: Prefer openssl backend instead of gnutls
      gstreamer1.0-plugins-bad: Add packageconfigs for hls crypto backends
      ca-certificates: Fix openssl runtime cert dependencies
      weston: Drop loading xwayland.so module
      elfutils: Make 64bit time_t fix generic
      binutils: Fix linking failures when using dwarf-5
      go: Use dl.google.com for SRC_URI
      musl: Update to latest master
      llvm: Upgrade to LLVM 12 release
      python3-docutils: Upgrade to 0.17.1
      python3-markupsafe: Enable ptests
      python3-jinja2: Enable ptests
      python3-pyyaml: Add recipe
      apt: Fix build on musl when seccomp is enabled
      default-distrovars.inc: Remove seccomp for riscv32
      gcc-target: Create a LTO plugin symlink in bfd-plugins directory
      bitbake.conf: Use gcc-nm as default NM
      gcc-cross: Install linker LTO plugin for binutils tools
      gcc-cross-canadian: Install LTO linker plugin to BFD searchable location
      gnutls: Point to staging area for finding seccomp libs and includes
      libjpeg-turbo: Use --reproducible option for nasm
      libid3tag: Filter -ffile-prefix-map too
      openssl: Filter out -ffile-prefix-map as well
      ltp: Filter out -ffile-prefix-map
      gcc-runtime: Fix __FILE__ related reproducablity issues
      reproducible_build.bbclass: Enable -Wdate-time
      pkgconfig: Fix nativesdk builds for mingw sdk hosts
      m4: Do not use SIGSTKSZ
      bluez: Fix shadowing of pause function from libc
      valgrind: Disable leak_cpp_interior test
      findutils: Do not use SIGSTKSZ
      bash: Include files needed for run-heredoc ptest
      libpam: Provide needed env for tst-pam_start_confdir ptest
      cml1.bbclass: Return sorted list of cfg files
      busybox: Enable long options for enabled applets
      webkitgtk: Fix reproducibility in minibrowser
      webkitgtk: Update patch status
      libgcc-initial: Do not build fp128 to decimal ppc functions
      gcc: Upgrade to GCC 11
      busybox: Fix reproducibility
      strace: Upgrade to 5.12

Konrad Weihmann (2):
      cpan-base: set default UPSTREAM_CHECK_REGEX
      cve-update-db-native: skip on empty cpe23Uri

Marek Vasut (1):
      linux-firmware: Package RSI 911x WiFi firmware

Martin Jansa (2):
      xwayland: add opengl to REQUIRED_DISTRO_FEATURES
      ofono: prevent using bundled ell headers and fix build with ell-0.39

Michael Halstead (1):
      releases: update to include 3.3

Michael Opdenacker (7):
      dev-manual: fix code insertion
      manuals: simplify code insertion
      manuals: code insertion simplification over two lines
      bitbake: doc: bitbake-user-manual: simplify colon usage
      bitbake: doc: bitbake-user-manual: code insertion simplification over two lines
      dev-manual: update references to Docker installation instructions
      sanity.bbclass: mention CONNECTIVITY_CHECK_URIS in network failure message

Mikko Rapeli (4):
      bitbake: bitbake: tests/fetch: fix test execution without .gitconfig
      bitbake: bitbake: tests/fetch: remove write protected files too
      lz4: use CFLAGS from bitbake
      unzip: use optimization from bitbake

Mingli Yu (6):
      libxshmfence: Build fixes for riscv32
      packagegroup-core-tools-profile: Remove valgrind for riscv32
      packagegroup-core-tools-testapps.bb: Remove kexec for riscv32
      libtool: make sure autoheader run before automake
      groff: not ship /usr/bin/grap2graph
      rpm: Upgrade to 4.16.1.3

Minjae Kim (1):
      qemu: fix CVE-2021-3392

Nicolas Dechesne (1):
      bitbake: doc: bitbake-user-manual: fix typo left over from Sphinx migration

Niels Avonds (1):
      bitbake: fetch/gitsm: Fix crash when using git LFS and submodules

Oleksandr Kravchuk (2):
      python3-setuptools: update to 56.0.0
      autoconf-archive: update to 2021.02.19

Otavio Salvador (2):
      gstreamer1.0-plugins-base: Add 'viv-fb' OpenGL Window System option
      gstreamer1.0-plugins-base: Use bb.utils.filter to reduce code

Paul Barker (10):
      bitbake: hashserv: Use generic ConnectionError
      bitbake: asyncrpc: Common implementation of RPC using json & asyncio
      bitbake: hashserv: Refactor to use asyncrpc
      bitbake: prserv: Drop obsolete python version check
      bitbake: prserv: Drop unused dump_db method
      bitbake: prserv: Add connect function
      prservice: Use new connect API
      bitbake: prserv: Use multiprocessing to auto start prserver
      bitbake: prserv: Extract daemonization from PRServer class
      bitbake: prserv: Handle requests in main thread

Paulo Cesar Zaneti (1):
      perl: fix startperl configuration option for perl-native

Peter Budny (1):
      lib/oe/terminal: Fix tmux new-session on older tmux versions (<1.9)

Petr Vorel (1):
      ltp: Replace musl patches with do_patch[postfuncs]

Przemyslaw Gorszkowski (2):
      bitbake: progress: LineFilterProgressHandler - Handle parsing line which ends with CR only
      bitbake: fetch/s3: Add progress handler for S3 cp command

Randy MacLeod (2):
      sqlite3: upgrade 3.35.0 -> 3.35.3
      oe-time-dd-test.sh: increase timeout to 15 sec

Reto Schneider (2):
      license_image.bbclass: Detect broken symlinks
      license_image.bbclass: Fix symlink to generic license files

Richard Purdie (32):
      oeqa/selftest: Hardcode test assumptions about heartbeat event timings
      pseudo: Upgrade to add trailing slashes ignore path fix
      oeqa/selftest: Ensure packages classes are set correctly for maintainers test
      layer.conf: Update to add post 3.3 release honister series
      sanity: Add error check for '%' in build path
      bitbake: runqueue: Fix deferred task issues
      bitbake: tinfoil/data_smart: Allow variable history emit() to function remotely
      sanity: Further improve directory sanity tests
      bitbake: bitbake-server: Remove now unneeded code
      bitbake: doc/user-manual-fetching: Remove basepath unpack parameter docs
      poky.conf: Post release version bump
      runqemu: Ensure we cleanup snapshot files after image run
      patchelf: Backport fix from upstream for note section overlap error
      pyyaml: Add missing HOMEPAGE
      yocto-check-layer: Avoid bug when iterating and autoadding dependencies
      libseccomp: Add MAINTAINERS entry and HOMEPAGE
      libseccomp: Fix reproducibility issue
      apt: Disable libseccomp
      libxcrypt: Update to 4.4.19 release and fix symbol version issues
      patchelf: Fix note section alignment issues
      bitbake: runqueue: Fix multiconfig deferred task sstate validity caching issue
      bitbake: runqueue: Handle deferred task rehashing in multiconfig builds
      patchelf: Fix alignment patch
      pybootchart/draw: Avoid divide by zero error
      yocto-uninative: Update to 3.1 which includes a patchelf fix
      Revert "perl: fix startperl configuration option for perl-native"
      bitbake: bin/bitbake-getvar: Add a new command to query a variable value (with history)
      bitbake: bitbake: Switch to post release version number 1.51.0
      sanity.conf: Require bitbake 1.51.0
      oeqa/qemurunner: Improve logging thread exit handling for qemu shutdown test
      oeqa/qemurunner: Handle path length issues for qmp socket
      lib/package_manager: Use shutil.copy instead of bb.utils.copyfile for intercepts

Robert Joslyn (3):
      btrfs-tools: Update to 5.11.1
      btrfs-tools: Add PACKAGECONFIG options
      btrfs-tools: Try to follow style guide

Robert P. J. Day (3):
      sdk-manual: "beablebone" -> "beaglebone"
      sdk-manual: fix broken formatting of sample command
      bitbake.conf: sort MIRROR list, add missing SAMBA_MIRROR

Ross Burton (4):
      glslang: strip whitespace in pkgconfig file
      insane: clean up some more warning messages
      bitbake: bitbake-server: ensure server timeout is a float
      oe-buildenv-internal: add BitBake's library to PYTHONPATH

Sakib Sajal (12):
      oe-time-dd-test.sh: make executable
      oe-time-dd-test.sh: provide more information from "top"
      qemu: fix CVE-2021-20181
      qemu: fix CVE-2020-29443
      qemu: fix CVE-2021-20221
      qemu: fix CVE-2021-3409
      qemu: fix CVE-2021-3416
      qemu: fix CVE-2021-20257
      oe-time-dd-test.sh: collect cooker log when timeout is exceeded
      buildstats.bbclass: collect data in the same file.
      qemu: fix CVE-2020-27821
      qemu: fix CVE-2021-20263

Samuli Piippo (1):
      assimp: BBCLASSEXTEND to native and nativesdk

Saul Wold (4):
      pango: re-enable ptest
      qemu-system-native: install qmp python module
      qemurunner: Add support for qmp commands
      qemurunner: change warning to info

Stefan Ghinea (3):
      wpa-supplicant: fix CVE-2021-30004
      libssh2: fix build failure with option no-ecdsa
      xserver-xorg: fix CVE-2021-3472

Stefano Babic (1):
      libubootenv: upgrade 0.3.1 -> 0.3.2

Teoh Jay Shen (6):
      oeqa/manual/bsp-hw.json : remove boot_from_runlevel_3 and boot_from_runlevel_5 manual test
      oeqa/manual/bsp-hw.json : remove ethernet_static_ip_set_in_connman and ethernet_get_IP_in_connman_via_DHCP manual test
      oeqa/manual/bsp-hw.json : remove standby and Test_if_LAN_device_works_well_after_resume_from_suspend_state manual test
      oeqa/manual/bsp-hw.json : remove click_terminal_icon_on_X_desktop manual test
      oeqa/manual/bsp-hw.json :remove Check_if_RTC_(Real_Time_Clock)_can_work_correctly manual test
      oeqa/manual/bsp-hw.json : remove Test_if_usb_hid_device_works_well_after_resume_from_suspend_state manual test

Trevor Gamblin (2):
      nettle: upgrade 3.7.1 -> 3.7.2
      ref-manual/variables.rst: Add incompatibility warning for SERIAL_CONSOLES_CHECK

Ulrich Ölmann (1):
      arch-armv6m.inc: fix access rights

Vinay Kumar (1):
      binutils: Fix CVE-2021-20197

Vineela Tummalapalli (1):
      Adding dunfell 3.1.7 to the switcher and release list.

Wang Mingyu (6):
      at-spi2-core: upgrade 2.38.0 -> 2.40.0
      babeltrace2: upgrade 2.0.3 -> 2.0.4
      boost-build-native: upgrade 4.3.0 -> 4.4.1
      libassuan: upgrade 2.5.4 -> 2.5.5
      webkitgtk: upgrade 2.30.5 -> 2.30.6
      vte: upgrade 0.62.2 -> 0.62.3

Wes Lindauer (1):
      oeqa/runtime/cases: Only disable/enable for current boot

Yanfei Xu (1):
      parselogs: ignore floppy error on qemu-system-x86 at boot stage

Yi Fan Yu (7):
      valgrind: update 3.16.1 -> 3.17.0
      valgrind: Disable ptest swapcontext.vgtest
      valgrind: Fix ptest swapcontext.vgtest
      Revert "glib-2.0: add workaround to fix codegen.py.test failing"
      re2c: Upgrade 2.0.3 -> 2.1.1
      valgrind: Enable drd/tests/bar_bad* ptest
      libevent: Increase ptest timing tolerance 50 ms -> 100 ms

Zqiang (1):
      rt-tests: Update rt-tests

hongxu (1):
      deb: apply postinstall on sdk

wangmy (34):
      ell: upgrade 0.38 -> 0.39
      dbus-glib: upgrade 0.110 -> 0.112
      ccache: upgrade 4.2 -> 4.2.1
      gcr: upgrade 3.38.1 -> 3.40.0
      ghostscript: upgrade 9.53.3 -> 9.54.0
      libsolv: upgrade 0.7.17 -> 0.7.18
      glib-2.0: upgrade 2.66.7 -> 2.68.0
      file: upgrade 5.39 -> 5.40
      curl: upgrade 7.75.0 -> 7.76.0
      acpica: upgrade 20210105 -> 20210331
      help2man: upgrade 1.48.2 -> 1.48.3
      libportal: upgrade 0.3 -> 0.4
      libksba: upgrade 1.5.0 -> 1.5.1
      go: upgrade 1.16.2 -> 1.16.3
      libcap: upgrade 2.48 -> 2.49
      libcomps: upgrade 0.1.15 -> 0.1.16
      icu: upgrade 68.2 -> 69.1
      mpg123: upgrade 1.26.4 -> 1.26.5
      man-pages: upgrade 5.10 -> 5.11
      go: update SRC_URI to use https protocol
      mesa: upgrade 21.0.1 -> 21.0.2
      openssh: upgrade 8.5p1 -> 8.6p1
      mtools: upgrade 4.0.26 -> 4.0.27
      python3-cython: upgrade 0.29.22 -> 0.29.23
      tiff: upgrade 4.2.0 -> 4.3.0
      boost: upgrade 1.75.0 -> 1.76.0
      wpebackend-fdo: upgrade 1.8.2 -> 1.8.3
      mesa: upgrade 21.0.2 -> 21.0.3
      gdb: upgrade 10.1 -> 10.2
      glib-networking: upgrade 2.66.0 -> 2.68.1
      glslang: upgrade 11.2.0 -> 11.4.0
      hdparm: upgrade 9.60 -> 9.61
      libhandy: upgrade 1.2.1 -> 1.2.2
      libjitterentropy: upgrade 3.0.1 -> 3.0.2

zangrc (1):
      maintainers.inc: Modify email address

zhengruoqin (19):
      epiphany: upgrade 3.38.2 -> 3.38.3
      wpebackend-fdo: upgrade 1.8.0 -> 1.8.2
      netbase: upgrade 6.2 -> 6.3
      python3-dbusmock: upgrade 0.22.0 -> 0.23.0
      python3-gitdb: upgrade 4.0.5 -> 4.0.7
      libva: upgrade 2.10.0 -> 2.11.0
      ruby: upgrade 3.0.0 -> 3.0.1
      libva-utils: upgrade 2.10.0 -> 2.11.1
      libdazzle: upgrade 3.38.0 -> 3.40.0
      librepo: upgrade 1.13.0 -> 1.14.0
      libdrm: upgrade 2.4.104 -> 2.4.105
      python3-pygobject: upgrade 3.38.0 -> 3.40.1
      libedit: upgrade 20210216-3.1 -> 20210419-3.1
      libhandy: upgrade 1.2.0 -> 1.2.1
      libical: upgrade 3.0.9 -> 3.0.10
      libsolv: upgrade 0.7.18 -> 0.7.19
      libmicrohttpd: upgrade 0.9.72 -> 0.9.73
      python3-numpy: upgrade 1.20.1 -> 1.20.2
      wireless-regdb: upgrade 2020.11.20 -> 2021.04.21

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: Ibdaea694cae40b0749d472bf08b53002a45b31d7
diff --git a/poky/bitbake/lib/prserv/serv.py b/poky/bitbake/lib/prserv/serv.py
index 25dcf8a..5e322bf 100644
--- a/poky/bitbake/lib/prserv/serv.py
+++ b/poky/bitbake/lib/prserv/serv.py
@@ -5,8 +5,6 @@
 import os,sys,logging
 import signal, time
 from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
-import threading
-import queue
 import socket
 import io
 import sqlite3
@@ -14,14 +12,10 @@
 import prserv
 import prserv.db
 import errno
-import select
+import multiprocessing
 
 logger = logging.getLogger("BitBake.PRserv")
 
-if sys.hexversion < 0x020600F0:
-    print("Sorry, python 2.6 or later is required.")
-    sys.exit(1)
-
 class Handler(SimpleXMLRPCRequestHandler):
     def _dispatch(self,method,params):
         try:
@@ -37,7 +31,7 @@
 
 
 class PRServer(SimpleXMLRPCServer):
-    def __init__(self, dbfile, logfile, interface, daemon=True):
+    def __init__(self, dbfile, logfile, interface):
         ''' constructor '''
         try:
             SimpleXMLRPCServer.__init__(self, interface,
@@ -50,57 +44,18 @@
             raise PRServiceConfigError
 
         self.dbfile=dbfile
-        self.daemon=daemon
         self.logfile=logfile
-        self.working_thread=None
         self.host, self.port = self.socket.getsockname()
-        self.pidfile=PIDPREFIX % (self.host, self.port)
 
         self.register_function(self.getPR, "getPR")
-        self.register_function(self.quit, "quit")
         self.register_function(self.ping, "ping")
         self.register_function(self.export, "export")
-        self.register_function(self.dump_db, "dump_db")
         self.register_function(self.importone, "importone")
         self.register_introspection_functions()
 
-        self.quitpipein, self.quitpipeout = os.pipe()
-
-        self.requestqueue = queue.Queue()
-        self.handlerthread = threading.Thread(target = self.process_request_thread)
-        self.handlerthread.daemon = False
-
-    def process_request_thread(self):
-        """Same as in BaseServer but as a thread.
-
-        In addition, exception handling is done here.
-
-        """
-        iter_count = 1
+        self.iter_count = 0
         # 60 iterations between syncs or sync if dirty every ~30 seconds
-        iterations_between_sync = 60
-
-        bb.utils.set_process_name("PRServ Handler")
-
-        while not self.quitflag:
-            try:
-                (request, client_address) = self.requestqueue.get(True, 30)
-            except queue.Empty:
-                self.table.sync_if_dirty()
-                continue
-            if request is None:
-                continue
-            try:
-                self.finish_request(request, client_address)
-                self.shutdown_request(request)
-                iter_count = (iter_count + 1) % iterations_between_sync
-                if iter_count == 0:
-                    self.table.sync_if_dirty()
-            except:
-                self.handle_error(request, client_address)
-                self.shutdown_request(request)
-                self.table.sync()
-            self.table.sync_if_dirty()
+        self.iterations_between_sync = 60
 
     def sigint_handler(self, signum, stack):
         if self.table:
@@ -109,11 +64,30 @@
     def sigterm_handler(self, signum, stack):
         if self.table:
             self.table.sync()
-        self.quit()
-        self.requestqueue.put((None, None))
+        raise(SystemExit)
 
     def process_request(self, request, client_address):
-        self.requestqueue.put((request, client_address))
+        if request is None:
+            return
+        try:
+            self.finish_request(request, client_address)
+            self.shutdown_request(request)
+            self.iter_count = (self.iter_count + 1) % self.iterations_between_sync
+            if self.iter_count == 0:
+                self.table.sync_if_dirty()
+        except:
+            self.handle_error(request, client_address)
+            self.shutdown_request(request)
+            self.table.sync()
+        self.table.sync_if_dirty()
+
+    def serve_forever(self, poll_interval=0.5):
+        signal.signal(signal.SIGINT, self.sigint_handler)
+        signal.signal(signal.SIGTERM, self.sigterm_handler)
+
+        self.db = prserv.db.PRData(self.dbfile)
+        self.table = self.db["PRMAIN"]
+        return super().serve_forever(poll_interval)
 
     def export(self, version=None, pkgarch=None, checksum=None, colinfo=True):
         try:
@@ -122,31 +96,11 @@
             logger.error(str(exc))
             return None
 
-    def dump_db(self):
-        """
-        Returns a script (string) that reconstructs the state of the
-        entire database at the time this function is called. The script
-        language is defined by the backing database engine, which is a
-        function of server configuration.
-        Returns None if the database engine does not support dumping to
-        script or if some other error is encountered in processing.
-        """
-        buff = io.StringIO()
-        try:
-            self.table.sync()
-            self.table.dump_db(buff)
-            return buff.getvalue()
-        except Exception as exc:
-            logger.error(str(exc))
-            return None
-        finally:
-            buff.close()
-
     def importone(self, version, pkgarch, checksum, value):
         return self.table.importone(version, pkgarch, checksum, value)
 
     def ping(self):
-        return not self.quitflag
+        return True
 
     def getinfo(self):
         return (self.host, self.port)
@@ -161,144 +115,6 @@
             logger.error(str(exc))
             return None
 
-    def quit(self):
-        self.quitflag=True
-        os.write(self.quitpipeout, b"q")
-        os.close(self.quitpipeout)
-        return
-
-    def work_forever(self,):
-        self.quitflag = False
-        # This timeout applies to the poll in TCPServer, we need the select 
-        # below to wake on our quit pipe closing. We only ever call into handle_request
-        # if there is data there.
-        self.timeout = 0.01
-
-        bb.utils.set_process_name("PRServ")
-
-        # DB connection must be created after all forks
-        self.db = prserv.db.PRData(self.dbfile)
-        self.table = self.db["PRMAIN"]
-
-        logger.info("Started PRServer with DBfile: %s, IP: %s, PORT: %s, PID: %s" %
-                     (self.dbfile, self.host, self.port, str(os.getpid())))
-
-        self.handlerthread.start()
-        while not self.quitflag:
-            ready = select.select([self.fileno(), self.quitpipein], [], [], 30)
-            if self.quitflag:
-                break
-            if self.fileno() in ready[0]:
-                self.handle_request()
-        self.handlerthread.join()
-        self.db.disconnect()
-        logger.info("PRServer: stopping...")
-        self.server_close()
-        os.close(self.quitpipein)
-        return
-
-    def start(self):
-        if self.daemon:
-            pid = self.daemonize()
-        else:
-            pid = self.fork()
-            self.pid = pid
-
-        # Ensure both the parent sees this and the child from the work_forever log entry above
-        logger.info("Started PRServer with DBfile: %s, IP: %s, PORT: %s, PID: %s" %
-                     (self.dbfile, self.host, self.port, str(pid)))
-
-    def delpid(self):
-        os.remove(self.pidfile)
-
-    def daemonize(self):
-        """
-        See Advanced Programming in the UNIX, Sec 13.3
-        """
-        try:
-            pid = os.fork()
-            if pid > 0:
-                os.waitpid(pid, 0)
-                #parent return instead of exit to give control 
-                return pid
-        except OSError as e:
-            raise Exception("%s [%d]" % (e.strerror, e.errno))
-
-        os.setsid()
-        """
-        fork again to make sure the daemon is not session leader, 
-        which prevents it from acquiring controlling terminal
-        """
-        try:
-            pid = os.fork()
-            if pid > 0: #parent
-                os._exit(0)
-        except OSError as e:
-            raise Exception("%s [%d]" % (e.strerror, e.errno))
-
-        self.cleanup_handles()
-        os._exit(0)
-
-    def fork(self):
-        try:
-            pid = os.fork()
-            if pid > 0:
-                self.socket.close() # avoid ResourceWarning in parent
-                return pid
-        except OSError as e:
-            raise Exception("%s [%d]" % (e.strerror, e.errno))
-
-        bb.utils.signal_on_parent_exit("SIGTERM")
-        self.cleanup_handles()
-        os._exit(0)
-
-    def cleanup_handles(self):
-        signal.signal(signal.SIGINT, self.sigint_handler)
-        signal.signal(signal.SIGTERM, self.sigterm_handler)
-        os.chdir("/")
-
-        sys.stdout.flush()
-        sys.stderr.flush()
-
-        # We could be called from a python thread with io.StringIO as
-        # stdout/stderr or it could be 'real' unix fd forking where we need
-        # to physically close the fds to prevent the program launching us from
-        # potentially hanging on a pipe. Handle both cases.
-        si = open('/dev/null', 'r')
-        try:
-            os.dup2(si.fileno(),sys.stdin.fileno())
-        except (AttributeError, io.UnsupportedOperation):
-            sys.stdin = si
-        so = open(self.logfile, 'a+')
-        try:
-            os.dup2(so.fileno(),sys.stdout.fileno())
-        except (AttributeError, io.UnsupportedOperation):
-            sys.stdout = so
-        try:
-            os.dup2(so.fileno(),sys.stderr.fileno())
-        except (AttributeError, io.UnsupportedOperation):
-            sys.stderr = so
-
-        # Clear out all log handlers prior to the fork() to avoid calling
-        # event handlers not part of the PRserver
-        for logger_iter in logging.Logger.manager.loggerDict.keys():
-            logging.getLogger(logger_iter).handlers = []
-
-        # Ensure logging makes it to the logfile
-        streamhandler = logging.StreamHandler()
-        streamhandler.setLevel(logging.DEBUG)
-        formatter = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
-        streamhandler.setFormatter(formatter)
-        logger.addHandler(streamhandler)
-
-        # write pidfile
-        pid = str(os.getpid())
-        with open(self.pidfile, 'w') as pf:
-            pf.write("%s\n" % pid)
-
-        self.work_forever()
-        self.delpid()
-
 class PRServSingleton(object):
     def __init__(self, dbfile, logfile, interface):
         self.dbfile = dbfile
@@ -308,8 +124,10 @@
         self.port = None
 
     def start(self):
-        self.prserv = PRServer(self.dbfile, self.logfile, self.interface, daemon=False)
-        self.prserv.start()
+        self.prserv = PRServer(self.dbfile, self.logfile, self.interface)
+        self.process = multiprocessing.Process(target=self.prserv.serve_forever)
+        self.process.start()
+
         self.host, self.port = self.prserv.getinfo()
 
     def getinfo(self):
@@ -323,13 +141,6 @@
         self.port = port
         self.connection, self.transport = bb.server.xmlrpcclient._create_server(self.host, self.port)
 
-    def terminate(self):
-        try:
-            logger.info("Terminating PRServer...")
-            self.connection.quit()
-        except Exception as exc:
-            sys.stderr.write("%s\n" % str(exc))
-
     def getPR(self, version, pkgarch, checksum):
         return self.connection.getPR(version, pkgarch, checksum)
 
@@ -339,15 +150,82 @@
     def export(self,version=None, pkgarch=None, checksum=None, colinfo=True):
         return self.connection.export(version, pkgarch, checksum, colinfo)
 
-    def dump_db(self):
-        return self.connection.dump_db()
-
     def importone(self, version, pkgarch, checksum, value):
         return self.connection.importone(version, pkgarch, checksum, value)
 
     def getinfo(self):
         return self.host, self.port
 
+def run_as_daemon(func, pidfile, logfile):
+    """
+    See Advanced Programming in the UNIX, Sec 13.3
+    """
+    try:
+        pid = os.fork()
+        if pid > 0:
+            os.waitpid(pid, 0)
+            #parent return instead of exit to give control
+            return pid
+    except OSError as e:
+        raise Exception("%s [%d]" % (e.strerror, e.errno))
+
+    os.setsid()
+    """
+    fork again to make sure the daemon is not session leader,
+    which prevents it from acquiring controlling terminal
+    """
+    try:
+        pid = os.fork()
+        if pid > 0: #parent
+            os._exit(0)
+    except OSError as e:
+        raise Exception("%s [%d]" % (e.strerror, e.errno))
+
+    os.chdir("/")
+
+    sys.stdout.flush()
+    sys.stderr.flush()
+
+    # We could be called from a python thread with io.StringIO as
+    # stdout/stderr or it could be 'real' unix fd forking where we need
+    # to physically close the fds to prevent the program launching us from
+    # potentially hanging on a pipe. Handle both cases.
+    si = open('/dev/null', 'r')
+    try:
+        os.dup2(si.fileno(),sys.stdin.fileno())
+    except (AttributeError, io.UnsupportedOperation):
+        sys.stdin = si
+    so = open(logfile, 'a+')
+    try:
+        os.dup2(so.fileno(),sys.stdout.fileno())
+    except (AttributeError, io.UnsupportedOperation):
+        sys.stdout = so
+    try:
+        os.dup2(so.fileno(),sys.stderr.fileno())
+    except (AttributeError, io.UnsupportedOperation):
+        sys.stderr = so
+
+    # Clear out all log handlers prior to the fork() to avoid calling
+    # event handlers not part of the PRserver
+    for logger_iter in logging.Logger.manager.loggerDict.keys():
+        logging.getLogger(logger_iter).handlers = []
+
+    # Ensure logging makes it to the logfile
+    streamhandler = logging.StreamHandler()
+    streamhandler.setLevel(logging.DEBUG)
+    formatter = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
+    streamhandler.setFormatter(formatter)
+    logger.addHandler(streamhandler)
+
+    # write pidfile
+    pid = str(os.getpid())
+    with open(pidfile, 'w') as pf:
+        pf.write("%s\n" % pid)
+
+    func()
+    os.remove(pidfile)
+    os._exit(0)
+
 def start_daemon(dbfile, host, port, logfile):
     ip = socket.gethostbyname(host)
     pidfile = PIDPREFIX % (ip, port)
@@ -363,7 +241,7 @@
         return 1
 
     server = PRServer(os.path.abspath(dbfile), os.path.abspath(logfile), (ip,port))
-    server.start()
+    run_as_daemon(server.serve_forever, pidfile, os.path.abspath(logfile))
 
     # Sometimes, the port (i.e. localhost:0) indicated by the user does not match with
     # the one the server actually is listening, so at least warn the user about it
@@ -400,25 +278,13 @@
         return 1
 
     try:
-        PRServerConnection(ip, port).terminate()
-    except:
-        logger.critical("Stop PRService %s:%d failed" % (host,port))
+        if is_running(pid):
+            print("Sending SIGTERM to pr-server.")
+            os.kill(pid, signal.SIGTERM)
+            time.sleep(0.1)
 
-    try:
-        if pid:
-            wait_timeout = 0
-            print("Waiting for pr-server to exit.")
-            while is_running(pid) and wait_timeout < 50:
-                time.sleep(0.1)
-                wait_timeout += 1
-
-            if is_running(pid):
-                print("Sending SIGTERM to pr-server.")
-                os.kill(pid,signal.SIGTERM)
-                time.sleep(0.1)
-
-            if os.path.exists(pidfile):
-                os.remove(pidfile)
+        if os.path.exists(pidfile):
+            os.remove(pidfile)
 
     except OSError as e:
         err = str(e)
@@ -494,19 +360,14 @@
 
 def auto_shutdown():
     global singleton
-    if singleton:
-        host, port = singleton.getinfo()
-        try:
-            PRServerConnection(host, port).terminate()
-        except:
-            logger.critical("Stop PRService %s:%d failed" % (host,port))
-
-        try:
-            os.waitpid(singleton.prserv.pid, 0)
-        except ChildProcessError:
-            pass
+    if singleton and singleton.process:
+        singleton.process.terminate()
+        singleton.process.join()
         singleton = None
 
 def ping(host, port):
     conn=PRServerConnection(host, port)
     return conn.ping()
+
+def connect(host, port):
+    return PRServerConnection(host, port)