From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Pip Cet Newsgroups: gmane.emacs.bugs Subject: bug#24548: 25.2.50; Long GC delays with many non-detached markers (PATCH) Date: Mon, 26 Sep 2016 15:12:10 +0000 Message-ID: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=047d7b5d5b82c10f25053d6a8f06 X-Trace: blaine.gmane.org 1474902926 27599 195.159.176.226 (26 Sep 2016 15:15:26 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 26 Sep 2016 15:15:26 +0000 (UTC) To: 24548@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Sep 26 17:15:21 2016 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1boXch-00061v-Lr for geb-bug-gnu-emacs@m.gmane.org; Mon, 26 Sep 2016 17:15:16 +0200 Original-Received: from localhost ([::1]:45096 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1boXcg-0007H3-1A for geb-bug-gnu-emacs@m.gmane.org; Mon, 26 Sep 2016 11:15:14 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41260) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1boXcZ-0007CU-7z for bug-gnu-emacs@gnu.org; Mon, 26 Sep 2016 11:15:09 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1boXcU-0008PV-Ph for bug-gnu-emacs@gnu.org; Mon, 26 Sep 2016 11:15:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:58601) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1boXcU-0008PI-M4 for bug-gnu-emacs@gnu.org; Mon, 26 Sep 2016 11:15:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1boXcU-0001kB-Iz for bug-gnu-emacs@gnu.org; Mon, 26 Sep 2016 11:15:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Pip Cet Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 26 Sep 2016 15:15:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 24548 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.14749028526609 (code B ref -1); Mon, 26 Sep 2016 15:15:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 26 Sep 2016 15:14:12 +0000 Original-Received: from localhost ([127.0.0.1]:36558 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1boXbf-0001iV-Fd for submit@debbugs.gnu.org; Mon, 26 Sep 2016 11:14:12 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:50113) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1boXbc-0001iG-Cf for submit@debbugs.gnu.org; Mon, 26 Sep 2016 11:14:10 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1boXbU-000862-VF for submit@debbugs.gnu.org; Mon, 26 Sep 2016 11:14:03 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:35589) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1boXbU-00085J-Sy for submit@debbugs.gnu.org; Mon, 26 Sep 2016 11:14:00 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41057) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1boXbS-0006rl-2W for bug-gnu-emacs@gnu.org; Mon, 26 Sep 2016 11:13:59 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1boXbM-000843-Qp for bug-gnu-emacs@gnu.org; Mon, 26 Sep 2016 11:13:56 -0400 Original-Received: from mail-wm0-f44.google.com ([74.125.82.44]:37145) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1boXbM-00083r-FS for bug-gnu-emacs@gnu.org; Mon, 26 Sep 2016 11:13:52 -0400 Original-Received: by mail-wm0-f44.google.com with SMTP id b130so154226993wmc.0 for ; Mon, 26 Sep 2016 08:13:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to; bh=5Ux3UkaEY4T2jP+lPp0jSMjAiMTj26w7bmVUP4fxSok=; b=avfbwlYRPLYkBnx6irzhlWDO6CClW6He9xUsaa/mpZQb7wpmhYJ81POfovulZZih9z rUZL0Jzd3w9AhvrENWHmtfjTsvQTM5oVZOv5iSxBKL1oiY9Q4jO+QkbUeZRWgmoNARXE ceVo7JCGj04Ii/dSs8mDcN7waUw1FUCO4tmVkZCSX8h5tRGV4r1U/WE+McZkrca0NKny +BlGQZ4owN4SSKSEmTTmZDwX6U0ngZdSBp3MG+1TCfTs8POcvmaoGyrdQj+qBV6FJcrn bgYd4pJO3ScNduZhjAdqydx67v6w4uD+deqK8PHFnGRIyYZb+kk6HEuaSKynPQMVOcky cl2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=5Ux3UkaEY4T2jP+lPp0jSMjAiMTj26w7bmVUP4fxSok=; b=JmwJRq+2PXvjSeQ3GZvXUAev18ZK7pp+Urc0311t+e9q1OTRzngKYu6FHCjEpfKhGp 930drlnecOciyA8K832XCLUwMFJKhL5MnaX3tlGzOQnmFIU+tEIurUMXK/zUY9LrBq/c uVqoUpKTcYEKGb6qObC/017rKfrjY3/etiGkWLIySJi57tEgPv1A41+utPd5uwONN+bi sWqGk8mAHBrrle6tGwYcsTxTHEEpyULUtKxuCyiE595RcJUhe0jJxWAKIJnnHuFckz0S F29FqOJKNEQjL75yyd26TXAm6licZfSOeh4qDZdhV01OLj/Yu2Ech7pm1szrZPfizoX2 3GZA== X-Gm-Message-State: AA6/9Rm4gRO+RVhv9zcbYYRy1Qhps/blDNk52wtO259z4wCSMKTYyEOosoasesK//kjRZx7hoYtJoW1PRu5pSg== X-Received: by 10.194.22.136 with SMTP id d8mr1883429wjf.5.1474902771121; Mon, 26 Sep 2016 08:12:51 -0700 (PDT) Original-Received: by 10.80.179.236 with HTTP; Mon, 26 Sep 2016 08:12:10 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:123701 Archived-At: --047d7b5d5b82c10f25053d6a8f06 Content-Type: text/plain; charset=UTF-8 This is an enhancement request for Emacs 25.2. When many markers are created but not explicitly made to point to no buffer after use, GC performance suffers severely. (Normal performance (apparently) suffers a little. That's okay and I don't consider that a problem.) An automated test script that was in no way explicitly designed to do so caused an Emacs session to be caught in garbage collection for more than an hour. The problem can be observed with this test code: ---------- (defvar l2 nil) (defun loop (lim) (let ((i 0) (l nil)) (while (< i lim) (push (copy-marker (point-max)) l) (push (copy-marker (point-min)) l) (push (copy-marker (point-max)) l2) (push (copy-marker (point-min)) l2) (setq i (1+ i))))) ---------- On this system, I'm seeing the following behaviour: ---------- $ time emacs -Q --load ~/git/ankol/emacs/loop.el --eval '(loop 10000)' --eval '(garbage-collect)' --kill real 0m2.556s user 0m2.392s sys 0m0.068s $ time emacs -Q --load ~/git/ankol/emacs/loop.el --eval '(loop 20000)' --eval '(garbage-collect)' --kill real 0m19.576s user 0m19.340s sys 0m0.068s ---------- Upon investigation, it turns out that we keep a buffer's markers in a singly-linked list, which we walk for every marker as it is collected. That's O(n^2) (where n is the number of collected markers, not that of markers that survive this garbage collection cycle); if Emacs is made to grow to considerable size, this begins to dominate and the hour-long GC problem appears. This happened to me while testing a new programming language mode that has a number of interactive commands that transform code without changing its semantics; in order to make sure the transformations weren't doing anything wrong, I ran them automatedly in large numbers, and that's when my test sessions would appear to freeze while caught in GC. I thought it would be very easy to modify the code to avoid the problem; it was a bit harder than I thought, because the GC mark bit is not equivalent to "this object survives the current GC cycle". In the attached patch, I ended up sacrificing one more bit to mean precisely that, so we can walk a buffer's marker list once and unchain all collected markers. If there's a better way of telling whether a marker is due to be collected in the current GC cycle, I'd be happy to modify the code. (I tried mem_find and PURE_P, but there appear to be some additional cases that are missed by that approach.) As always, the patch is merely a suggestion. However, it improves performance (of the test code above and the actual test case) so drastically that I think it is a good idea to fix this problem. In GNU Emacs 25.2.50.19 (x86_64-pc-linux-gnu, X toolkit, Xaw scroll bars) of 2016-09-26 built on amygdala Repository revision: 5ee56c4613e9380dbbe4bbaa97b29dd377e2134c Windowing system distributor 'The X.Org Foundation', version 11.0.11804000 System Description: Debian GNU/Linux unstable (sid) Recent messages: For information about GNU Emacs and the GNU system, type C-h C-a. Configured features: XPM JPEG TIFF GIF PNG SOUND DBUS GSETTINGS NOTIFY GNUTLS LIBXML2 FREETYPE XFT ZLIB TOOLKIT_SCROLL_BARS LUCID X11 Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: tooltip-mode: t global-eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message subr-x puny seq byte-opt gv bytecomp byte-compile cl-extra help-mode cconv cl-loaddefs pcase cl-lib dired dired-loaddefs format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils time-date mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese charscript case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote dbusbind inotify dynamic-setting system-font-setting font-render-setting x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 96543 9103) (symbols 48 20425 0) (miscs 40 47 168) (strings 32 18288 5117) (string-bytes 1 571191) (vectors 16 13407) (vector-slots 8 447852 3741) (floats 8 185 69) (intervals 56 221 0) (buffers 976 11)) --047d7b5d5b82c10f25053d6a8f06 Content-Type: text/plain; charset=US-ASCII; name="emacs-bug-001-002.diff" Content-Disposition: attachment; filename="emacs-bug-001-002.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_itk6ti1q0 ZGlmZiAtLWdpdCBhL3NyYy9hbGxvYy5jIGIvc3JjL2FsbG9jLmMKaW5kZXggNDFiMmY5ZS4uMWU5 MTg5YSAxMDA2NDQKLS0tIGEvc3JjL2FsbG9jLmMKKysrIGIvc3JjL2FsbG9jLmMKQEAgLTM2NzUs NiArMzY3NSw3IEBAIGFsbG9jYXRlX21pc2MgKGVudW0gTGlzcF9NaXNjX1R5cGUgdHlwZSkKICAg bWlzY19vYmplY3RzX2NvbnNlZCsrOwogICBYTUlTQ0FOWSAodmFsKS0+dHlwZSA9IHR5cGU7CiAg IFhNSVNDQU5ZICh2YWwpLT5nY21hcmtiaXQgPSAwOworICBYTUlTQ0FOWSAodmFsKS0+Z2Nzd2Vl cGJpdCA9IDA7CiAgIHJldHVybiB2YWw7CiB9CiAKQEAgLTY4OTMsNiArNjg5NCwyNCBAQCBzd2Vl cF9taXNjICh2b2lkKQogICBmb3IgKG1ibGsgPSBtYXJrZXJfYmxvY2s7IG1ibGs7IG1ibGsgPSAq bXByZXYpCiAgICAgewogICAgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7 IGkgPCBsaW07IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChtYmxrLT5tYXJrZXJzW2ld Lm0udV9hbnkudHlwZSA9PSBMaXNwX01pc2NfTWFya2VyKQorICAgICAgICAgICAgeworICAgICAg ICAgICAgICBpZiAoIW1ibGstPm1hcmtlcnNbaV0ubS51X2FueS5nY21hcmtiaXQpCisgICAgICAg ICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbWJsay0+bWFya2Vyc1tpXS5tLnVfbWFya2Vy Lmdjc3dlZXBiaXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg ICAgfQorICAgICAgbGltID0gTUFSS0VSX0JMT0NLX1NJWkU7CisgICAgICBtcHJldiA9ICZtYmxr LT5uZXh0OworICAgIH0KKyAgbGltID0gbWFya2VyX2Jsb2NrX2luZGV4OworICBmb3IgKG1ibGsg PSBtYXJrZXJfYmxvY2s7IG1ibGs7IG1ibGsgPSAqbXByZXYpCisgICAgeworICAgICAgcmVnaXN0 ZXIgaW50IGk7CiAgICAgICBpbnQgdGhpc19mcmVlID0gMDsKIAogICAgICAgZm9yIChpID0gMDsg aSA8IGxpbTsgaSsrKQpAQCAtNjkwMCw3ICs2OTE5LDcgQEAgc3dlZXBfbWlzYyAodm9pZCkKICAg ICAgICAgICBpZiAoIW1ibGstPm1hcmtlcnNbaV0ubS51X2FueS5nY21hcmtiaXQpCiAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgIGlmIChtYmxrLT5tYXJrZXJzW2ldLm0udV9hbnkudHlwZSA9 PSBMaXNwX01pc2NfTWFya2VyKQotICAgICAgICAgICAgICAgIHVuY2hhaW5fbWFya2VyICgmbWJs ay0+bWFya2Vyc1tpXS5tLnVfbWFya2VyKTsKKyAgICAgICAgICAgICAgICB1bmNoYWluX2NvbGxl Y3RlZF9tYXJrZXJzKG1ibGstPm1hcmtlcnNbaV0ubS51X21hcmtlci5idWZmZXIpOwogICAgICAg ICAgICAgICBlbHNlIGlmIChtYmxrLT5tYXJrZXJzW2ldLm0udV9hbnkudHlwZSA9PSBMaXNwX01p c2NfRmluYWxpemVyKQogICAgICAgICAgICAgICAgIHVuY2hhaW5fZmluYWxpemVyICgmbWJsay0+ bWFya2Vyc1tpXS5tLnVfZmluYWxpemVyKTsKICNpZmRlZiBIQVZFX01PRFVMRVMKZGlmZiAtLWdp dCBhL3NyYy9saXNwLmggYi9zcmMvbGlzcC5oCmluZGV4IGY2NTNkODUuLjFhZjRjMzQgMTAwNjQ0 Ci0tLSBhL3NyYy9saXNwLmgKKysrIGIvc3JjL2xpc3AuaApAQCAtMjA0MCwxNCArMjA0MCwxNiBA QCBzdHJ1Y3QgTGlzcF9NaXNjX0FueQkJLyogU3VwZXJ0eXBlIG9mIGFsbCBNaXNjIHR5cGVzLiAg Ki8KIHsKICAgRU5VTV9CRiAoTGlzcF9NaXNjX1R5cGUpIHR5cGUgOiAxNjsJCS8qID0gTGlzcF9N aXNjXz8/PyAqLwogICBib29sX2JmIGdjbWFya2JpdCA6IDE7Ci0gIHVuc2lnbmVkIHNwYWNlciA6 IDE1OworICBib29sX2JmIGdjc3dlZXBiaXQgOiAxOworICB1bnNpZ25lZCBzcGFjZXIgOiAxNDsK IH07CiAKIHN0cnVjdCBMaXNwX01hcmtlcgogewogICBFTlVNX0JGIChMaXNwX01pc2NfVHlwZSkg dHlwZSA6IDE2OwkJLyogPSBMaXNwX01pc2NfTWFya2VyICovCiAgIGJvb2xfYmYgZ2NtYXJrYml0 IDogMTsKLSAgdW5zaWduZWQgc3BhY2VyIDogMTM7CisgIGJvb2xfYmYgZ2Nzd2VlcGJpdCA6IDE7 CisgIHVuc2lnbmVkIHNwYWNlciA6IDEyOwogICAvKiBUaGlzIGZsYWcgaXMgdGVtcG9yYXJpbHkg dXNlZCBpbiB0aGUgZnVuY3Rpb25zCiAgICAgIGRlY29kZS9lbmNvZGVfY29kaW5nX29iamVjdCB0 byByZWNvcmQgdGhhdCB0aGUgbWFya2VyIHBvc2l0aW9uCiAgICAgIG11c3QgYmUgYWRqdXN0ZWQg YWZ0ZXIgdGhlIGNvbnZlcnNpb24uICAqLwpAQCAtMzk3Niw2ICszOTc4LDcgQEAgZXh0ZXJuIHZv aWQgY2xlYXJfY2hhcnBvc19jYWNoZSAoc3RydWN0IGJ1ZmZlciAqKTsKIGV4dGVybiBwdHJkaWZm X3QgYnVmX2NoYXJwb3NfdG9fYnl0ZXBvcyAoc3RydWN0IGJ1ZmZlciAqLCBwdHJkaWZmX3QpOwog ZXh0ZXJuIHB0cmRpZmZfdCBidWZfYnl0ZXBvc190b19jaGFycG9zIChzdHJ1Y3QgYnVmZmVyICos IHB0cmRpZmZfdCk7CiBleHRlcm4gdm9pZCB1bmNoYWluX21hcmtlciAoc3RydWN0IExpc3BfTWFy a2VyICptYXJrZXIpOworZXh0ZXJuIHZvaWQgdW5jaGFpbl9jb2xsZWN0ZWRfbWFya2VycyAoc3Ry dWN0IGJ1ZmZlciAqYnVmZmVyKTsKIGV4dGVybiBMaXNwX09iamVjdCBzZXRfbWFya2VyX3Jlc3Ry aWN0ZWQgKExpc3BfT2JqZWN0LCBMaXNwX09iamVjdCwgTGlzcF9PYmplY3QpOwogZXh0ZXJuIExp c3BfT2JqZWN0IHNldF9tYXJrZXJfYm90aCAoTGlzcF9PYmplY3QsIExpc3BfT2JqZWN0LCBwdHJk aWZmX3QsIHB0cmRpZmZfdCk7CiBleHRlcm4gTGlzcF9PYmplY3Qgc2V0X21hcmtlcl9yZXN0cmlj dGVkX2JvdGggKExpc3BfT2JqZWN0LCBMaXNwX09iamVjdCwKZGlmZiAtLWdpdCBhL3NyYy9tYXJr ZXIuYyBiL3NyYy9tYXJrZXIuYwppbmRleCAwNWU1YmI4Li45Y2Q3ZDI2IDEwMDY0NAotLS0gYS9z cmMvbWFya2VyLmMKKysrIGIvc3JjL21hcmtlci5jCkBAIC02MjksNiArNjI5LDQ2IEBAIHVuY2hh aW5fbWFya2VyIChyZWdpc3RlciBzdHJ1Y3QgTGlzcF9NYXJrZXIgKm1hcmtlcikKICAgICB9CiB9 CiAKKy8qIFJlbW92ZSBhbGwgbWFya2VycyB0aGF0IGFyZSBkdWUgdG8gYmUgc3dlcHQgZnJvbSB0 aGUgY2hhaW4gb2YKKyAgIEJVRkZFUiwgbGVhdmluZyB0aGVtIHBvaW50aW5nIHRvIG5vd2hlcmUu ICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcKKyAgIGdhcmJhZ2UgY29sbGVjdGlvbiwgc28gd2UgbXVz dCBiZSBjYXJlZnVsIHRvIGlnbm9yZSBhbmQgcHJlc2VydmUKKyAgIG1hcmsgYml0cywgaW5jbHVk aW5nIHRob3NlIGluIGNoYWluIGZpZWxkcyBvZiBtYXJrZXJzLiAgKi8KKwordm9pZAordW5jaGFp bl9jb2xsZWN0ZWRfbWFya2VycyAocmVnaXN0ZXIgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQorewor ICByZWdpc3RlciBzdHJ1Y3QgTGlzcF9NYXJrZXIgKnRhaWwsICoqcHJldjsKKworICBpZiAoIWJ1 ZmZlcikKKyAgICByZXR1cm47CisKKyAgLyogTm8gZGVhZCBidWZmZXJzIGhlcmUuICAqLworICBl YXNzZXJ0IChCVUZGRVJfTElWRV9QIChidWZmZXIpKTsKKworICBwcmV2ID0gJkJVRl9NQVJLRVJT IChidWZmZXIpOworCisgIGZvciAodGFpbCA9IEJVRl9NQVJLRVJTIChidWZmZXIpOyB0YWlsOyBw cmV2ID0gJnRhaWwtPm5leHQsIHRhaWwgPSAqcHJldikKKyAgICBpZiAodGFpbC0+Z2Nzd2VlcGJp dCkKKyAgICAgIHsKKyAgICAgICAgcmVnaXN0ZXIgc3RydWN0IExpc3BfTWFya2VyICpuZXh0Owor ICAgICAgICBmb3IgKG5leHQgPSB0YWlsOyBuZXh0ICYmIG5leHQtPmdjc3dlZXBiaXQ7IG5leHQg PSBuZXh0LT5uZXh0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQtPmdjc3dlZXBiaXQg PSAwOworICAgICAgICAgICAgbmV4dC0+YnVmZmVyID0gTlVMTDsKKyAgICAgICAgICB9CisgICAg ICAgIGlmICgqcHJldiA9PSBCVUZfTUFSS0VSUyAoYnVmZmVyKSkKKyAgICAgICAgICB7CisgICAg ICAgICAgICAvKiBEZWxldGluZyBmaXJzdCBtYXJrZXIgZnJvbSB0aGUgYnVmZmVyJ3MgY2hhaW4u ICBDcmFzaAorICAgICAgICAgICAgICAgaWYgbmV3IGZpcnN0IG1hcmtlciBpbiBjaGFpbiBkb2Vz IG5vdCBzYXkgaXQgYmVsb25ncworICAgICAgICAgICAgICAgdG8gdGhlIHNhbWUgYnVmZmVyLCBv ciBhdCBsZWFzdCB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZQorICAgICAgICAgICAgICAgYmFzZSBi dWZmZXIuICAqLworICAgICAgICAgICAgaWYgKG5leHQgJiYgYnVmZmVyLT50ZXh0ICE9IG5leHQt PmJ1ZmZlci0+dGV4dCkKKyAgICAgICAgICAgICAgZW1hY3NfYWJvcnQgKCk7CisgICAgICAgICAg fQorICAgICAgICAqcHJldiA9IG5leHQ7CisgICAgICB9Cit9CisKIC8qIFJldHVybiB0aGUgY2hh ciBwb3NpdGlvbiBvZiBtYXJrZXIgTUFSS0VSLCBhcyBhIEMgaW50ZWdlci4gICovCiAKIHB0cmRp ZmZfdAo= --047d7b5d5b82c10f25053d6a8f06--