From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8159 invoked by alias); 26 Oct 2009 21:25:56 -0000 Received: (qmail 8011 invoked by uid 22791); 26 Oct 2009 21:25:51 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.45.13) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 26 Oct 2009 21:25:46 +0000 Received: from spaceape9.eur.corp.google.com (spaceape9.eur.corp.google.com [172.28.16.143]) by smtp-out.google.com with ESMTP id n9QLPhSb022732 for ; Mon, 26 Oct 2009 14:25:44 -0700 Received: from gxk4 (gxk4.prod.google.com [10.202.11.4]) by spaceape9.eur.corp.google.com with ESMTP id n9QLPdLt009812 for ; Mon, 26 Oct 2009 14:25:40 -0700 Received: by gxk4 with SMTP id 4so198321gxk.8 for ; Mon, 26 Oct 2009 14:25:39 -0700 (PDT) MIME-Version: 1.0 Received: by 10.101.128.27 with SMTP id f27mr1077275ann.182.1256592339398; Mon, 26 Oct 2009 14:25:39 -0700 (PDT) In-Reply-To: <200910252354.55084.pedro@codesourcery.com> References: <20091015191037.4091D76761@ppluzhnikov.mtv.corp.google.com> <8ac60eac0910171625n489736e1v94326e4d95b40f98@mail.gmail.com> <200910252354.55084.pedro@codesourcery.com> Date: Mon, 26 Oct 2009 21:25:00 -0000 Message-ID: <8ac60eac0910261425x363afd0bp43299ab0b18e576a@mail.gmail.com> Subject: Re: [patch] Fix for PR gdb/10757 From: Paul Pluzhnikov To: Pedro Alves Cc: gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary=001636c597c30470300476dd34bd X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-10/txt/msg00651.txt.bz2 --001636c597c30470300476dd34bd Content-Type: text/plain; charset=ISO-8859-1 Content-length: 3034 On Sun, Oct 25, 2009 at 4:54 PM, Pedro Alves wrote: > FTR, I've took a peek at nptl/nptl_db, to try to understand > a bit better why this happens (please do correct me if I'm > wrong): > > - First, it is worth remind us while nptl takes locks and barriers > to protect its internal structures, thread_db/ntpl_db doesn't, > since it runs in gdb's context. I wonder if it *could* take some lock that would make all other threads wait in pthread_create -- after all, thread_db does have access to inferior via ps_pdwrite. That would certainly make the interface cleaner, at a cost of an extra global lock on pthread_create path. Regardless of whether that's a good idea or not, I am stuck on glibc-2.3.6 for the time being, and even if this was to go into glibc-2.11, the "broken" glibc versions will be with us for a long time, and GDB should be able to deal with them. > - nptl adds new threads to one of the __stack_user or stack_used > lists. New nodes are added to the _head_ of the lists. > > - nptl_db/td_ta_thr_iter.c:td_ta_thr_iter iterates over > these thread lists from head to tail. > > From these last two points alone, one can infer that an iteration > over the thread list can miss new threads if they're added just while > the list is being iterated. Right. [While nptl_db is fresh in your mind, would you mind looking at gdb/10838 to double-check my diagnosis there? http://sourceware.org/bugzilla/show_bug.cgi?id=10838 This is related to current patch only in that linux/libthread_db is also involved.] > Another way to tackle this, would be iterate over > /proc/pid/task/ and attach to all lwps that way, instead of > relying on thread_db to do the initial iteration over all > threads. We'd still iterate using the thread_db interface > once afterwards, so to learn the matching pthread > ids of the lwps. I should note that /proc may not be mounted. I am not sure whether GDB currently requires /proc in other places. > With /proc/pid/task, you'd still need to keep iterating until > no new thread comes out, but, I think we could make the > number of loops unbounded much safely, since we wouldn't be > at risk of reading stale inferior data. Assuming no kernel > bugs, that is. Note that this is something that would be > a useful addition to gdb anyway, so that we could be able to > attach to multi-threaded apps that use raw clone instead of > pthreads. I'll put that on my TODO list :-) >> + /* Require NUM_LOOP successive iterations which do not find any new threads. */ > > This line too long. Fixed. >> + for (i = 0, loop = 0; loop < 4; ++i, ++loop) > > Err, s/4/num_loop/ ? A comment explain _why_ we need this is missing > as well. The patch looks OK otherwise. Fixed. > Actually, I'd rename the `num_loop' parameter into > say, `until_no_new', and do this instead: Good idea, done. I'll commit attached patch tomorrow if there are no further comments. A similar patch is required for gdbserver as well. Thanks, -- Paul Pluzhnikov --001636c597c30470300476dd34bd Content-Type: text/plain; charset=US-ASCII; name="gdb-pr10757-20091026.txt" Content-Disposition: attachment; filename="gdb-pr10757-20091026.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g19ql4bp0 Content-length: 9407 SW5kZXg6IGxpbnV4LXRocmVhZC1kYi5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KUkNTIGZpbGU6IC9jdnMvc3JjL3NyYy9nZGIvbGludXgtdGhyZWFkLWRi LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNjUKZGlmZiAtdSAtcCAtdSAt cjEuNjUgbGludXgtdGhyZWFkLWRiLmMKLS0tIGxpbnV4LXRocmVhZC1kYi5j CTE5IE9jdCAyMDA5IDA5OjUxOjQxIC0wMDAwCTEuNjUKKysrIGxpbnV4LXRo cmVhZC1kYi5jCTI2IE9jdCAyMDA5IDIxOjIwOjMxIC0wMDAwCkBAIC0xNjAs NiArMTYwLDcgQEAgc3RydWN0IHRocmVhZF9kYl9pbmZvCiBzdHJ1Y3QgdGhy ZWFkX2RiX2luZm8gKnRocmVhZF9kYl9saXN0OwogCiBzdGF0aWMgdm9pZCB0 aHJlYWRfZGJfZmluZF9uZXdfdGhyZWFkc18xIChwdGlkX3QgcHRpZCk7Citz dGF0aWMgdm9pZCB0aHJlYWRfZGJfZmluZF9uZXdfdGhyZWFkc18yIChwdGlk X3QgcHRpZCwgaW50IHVudGlsX25vX25ldyk7CiAKIC8qIEFkZCB0aGUgY3Vy cmVudCBpbmZlcmlvciB0byB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgdXNpbmcg bGlicHRocmVhZC4KICAgIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5 IGFsbG9jYXRlZCBvYmplY3QgdGhhdCB3YXMgYWRkZWQgdG8KQEAgLTIyOSw4 ICsyMzAsOCBAQCBkZWxldGVfdGhyZWFkX2RiX2luZm8gKGludCBwaWQpCiB9 CiAKIC8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1z dGF0aWMgdm9pZCBhdHRhY2hfdGhyZWFkIChwdGlkX3QgcHRpZCwgY29uc3Qg dGRfdGhyaGFuZGxlX3QgKnRoX3AsCi0JCQkgICBjb25zdCB0ZF90aHJpbmZv X3QgKnRpX3ApOworc3RhdGljIGludCBhdHRhY2hfdGhyZWFkIChwdGlkX3Qg cHRpZCwgY29uc3QgdGRfdGhyaGFuZGxlX3QgKnRoX3AsCisJCQkgIGNvbnN0 IHRkX3RocmluZm9fdCAqdGlfcCk7CiBzdGF0aWMgdm9pZCBkZXRhY2hfdGhy ZWFkIChwdGlkX3QgcHRpZCk7CiAMCiAKQEAgLTU5Nyw3ICs1OTgsNyBAQCB0 aHJlYWRfZGJfZmluZF9uZXdfdGhyZWFkc19zaWxlbnRseSAocHRpCiAKICAg VFJZX0NBVENIIChleGNlcHQsIFJFVFVSTl9NQVNLX0VSUk9SKQogICAgIHsK LSAgICAgIHRocmVhZF9kYl9maW5kX25ld190aHJlYWRzXzEgKHB0aWQpOwor ICAgICAgdGhyZWFkX2RiX2ZpbmRfbmV3X3RocmVhZHNfMiAocHRpZCwgMSk7 CiAgICAgfQogCiAgIGlmIChleGNlcHQucmVhc29uIDwgMCAmJiBpbmZvX3Zl cmJvc2UpCkBAIC05NzcsOSArOTc4LDkgQEAgdGhyZWFkX2RiX25ld19vYmpm aWxlIChzdHJ1Y3Qgb2JqZmlsZSAqbwogCiAvKiBBdHRhY2ggdG8gYSBuZXcg dGhyZWFkLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNl aXZlIGEKICAgIFREX0NSRUFURSBldmVudCBvciB3aGVuIHdlIGl0ZXJhdGUg b3ZlciBhbGwgdGhyZWFkcyBhbmQgZmluZCBvbmUKLSAgIHRoYXQgd2Fzbid0 IGFscmVhZHkgaW4gb3VyIGxpc3QuICAqLworICAgdGhhdCB3YXNuJ3QgYWxy ZWFkeSBpbiBvdXIgbGlzdC4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAg Ki8KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGF0dGFjaF90aHJlYWQg KHB0aWRfdCBwdGlkLCBjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCwKIAkg ICAgICAgY29uc3QgdGRfdGhyaW5mb190ICp0aV9wKQogewpAQCAtMTAxMyw3 ICsxMDE0LDcgQEAgYXR0YWNoX3RocmVhZCAocHRpZF90IHB0aWQsIGNvbnN0 IHRkX3RocgogICAgICAgaWYgKHRwLT5wcml2YXRlICE9IE5VTEwpCiAJewog CSAgaWYgKCF0cC0+cHJpdmF0ZS0+ZHlpbmcpCi0JICAgIHJldHVybjsKKwkg ICAgcmV0dXJuIDA7CiAKIAkgIGRlbGV0ZV90aHJlYWQgKHB0aWQpOwogCSAg dHAgPSBOVUxMOwpAQCAtMTAyMywxMiArMTAyNCwxMiBAQCBhdHRhY2hfdGhy ZWFkIChwdGlkX3QgcHRpZCwgY29uc3QgdGRfdGhyCiAgIGNoZWNrX3RocmVh ZF9zaWduYWxzICgpOwogCiAgIGlmICh0aV9wLT50aV9zdGF0ZSA9PSBURF9U SFJfVU5LTk9XTiB8fCB0aV9wLT50aV9zdGF0ZSA9PSBURF9USFJfWk9NQklF KQotICAgIHJldHVybjsJCQkvKiBBIHpvbWJpZSB0aHJlYWQgLS0gZG8gbm90 IGF0dGFjaC4gICovCisgICAgcmV0dXJuIDA7CQkJLyogQSB6b21iaWUgdGhy ZWFkIC0tIGRvIG5vdCBhdHRhY2guICAqLwogCiAgIC8qIFVuZGVyIEdOVS9M aW51eCwgd2UgaGF2ZSB0byBhdHRhY2ggdG8gZWFjaCBhbmQgZXZlcnkgdGhy ZWFkLiAgKi8KICAgaWYgKHRwID09IE5VTEwKICAgICAgICYmIGxpbl9sd3Bf YXR0YWNoX2x3cCAoQlVJTERfTFdQICh0aV9wLT50aV9saWQsIEdFVF9QSUQg KHB0aWQpKSkgPCAwKQotICAgIHJldHVybjsKKyAgICByZXR1cm4gMDsKIAog ICAvKiBDb25zdHJ1Y3QgdGhlIHRocmVhZCdzIHByaXZhdGUgZGF0YS4gICov CiAgIHByaXZhdGUgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwcml2YXRl X3RocmVhZF9pbmZvKSk7CkBAIC0xMDU2LDYgKzEwNTcsNyBAQCBhdHRhY2hf dGhyZWFkIChwdGlkX3QgcHRpZCwgY29uc3QgdGRfdGhyCiAgIGlmIChlcnIg IT0gVERfT0spCiAgICAgZXJyb3IgKF8oIkNhbm5vdCBlbmFibGUgdGhyZWFk IGV2ZW50IHJlcG9ydGluZyBmb3IgJXM6ICVzIiksCiAJICAgdGFyZ2V0X3Bp ZF90b19zdHIgKHB0aWQpLCB0aHJlYWRfZGJfZXJyX3N0ciAoZXJyKSk7Cisg IHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTI4Miw2ICsxMjg0 LDEyIEBAIHRocmVhZF9kYl9tb3Vybl9pbmZlcmlvciAoc3RydWN0IHRhcmdl dF8KICAgICB1bnB1c2hfdGFyZ2V0IChvcHMpOwogfQogCitzdHJ1Y3QgY2Fs bGJhY2tfZGF0YQoreworICBzdHJ1Y3QgdGhyZWFkX2RiX2luZm8gKmluZm87 CisgIGludCBuZXdfdGhyZWFkczsKK307CisKIHN0YXRpYyBpbnQKIGZpbmRf bmV3X3RocmVhZHNfY2FsbGJhY2sgKGNvbnN0IHRkX3RocmhhbmRsZV90ICp0 aF9wLCB2b2lkICpkYXRhKQogewpAQCAtMTI4OSw3ICsxMjk3LDggQEAgZmlu ZF9uZXdfdGhyZWFkc19jYWxsYmFjayAoY29uc3QgdGRfdGhyaAogICB0ZF9l cnJfZSBlcnI7CiAgIHB0aWRfdCBwdGlkOwogICBzdHJ1Y3QgdGhyZWFkX2lu Zm8gKnRwOwotICBzdHJ1Y3QgdGhyZWFkX2RiX2luZm8gKmluZm8gPSBkYXRh OworICBzdHJ1Y3QgY2FsbGJhY2tfZGF0YSAqY2JfZGF0YSA9IGRhdGE7Cisg IHN0cnVjdCB0aHJlYWRfZGJfaW5mbyAqaW5mbyA9IGNiX2RhdGEtPmluZm87 CiAKICAgZXJyID0gaW5mby0+dGRfdGhyX2dldF9pbmZvX3AgKHRoX3AsICZ0 aSk7CiAgIGlmIChlcnIgIT0gVERfT0spCkBAIC0xMzMyLDIxICsxMzQxLDc2 IEBAIGZpbmRfbmV3X3RocmVhZHNfY2FsbGJhY2sgKGNvbnN0IHRkX3RocmgK ICAgcHRpZCA9IHB0aWRfYnVpbGQgKGluZm8tPnBpZCwgdGkudGlfbGlkLCAw KTsKICAgdHAgPSBmaW5kX3RocmVhZF9wdGlkIChwdGlkKTsKICAgaWYgKHRw ID09IE5VTEwgfHwgdHAtPnByaXZhdGUgPT0gTlVMTCkKLSAgICBhdHRhY2hf dGhyZWFkIChwdGlkLCB0aF9wLCAmdGkpOworICAgIHsKKyAgICAgIGlmIChh dHRhY2hfdGhyZWFkIChwdGlkLCB0aF9wLCAmdGkpKQorCWNiX2RhdGEtPm5l d190aHJlYWRzICs9IDE7CisgICAgICBlbHNlCisJLyogUHJvYmxlbSBhdHRh Y2hpbmcgdGhpcyB0aHJlYWQ7IHBlcmhhcHMgaXQgZXhpdGVkIGJlZm9yZSB3 ZQorCSAgIGNvdWxkIGF0dGFjaCBpdD8KKwkgICBUaGlzIGNvdWxkIG1lYW4g dGhhdCB0aGUgdGhyZWFkIGxpc3QgaW5zaWRlIGdsaWJjIGl0c2VsZiBpcyBp bgorCSAgIGluY29uc2lzdGVudCBzdGF0ZSwgYW5kIGxpYnRocmVhZF9kYiBj b3VsZCBnbyBvbiBsb29waW5nIGZvcmV2ZXIKKwkgICAob2JzZXJ2ZWQgd2l0 aCBnbGliYy0yLjMuNikuICBUbyBwcmV2ZW50IHRoYXQsIHRlcm1pbmF0ZQor CSAgIGl0ZXJhdGlvbjogdGhyZWFkX2RiX2ZpbmRfbmV3X3RocmVhZHNfMiB3 aWxsIHJldHJ5LiAgKi8KKwlyZXR1cm4gMTsKKyAgICB9CiAKICAgcmV0dXJu IDA7CiB9CiAKKy8qIEhlbHBlciBmb3IgdGhyZWFkX2RiX2ZpbmRfbmV3X3Ro cmVhZHNfMi4KKyAgIFJldHVybnMgbnVtYmVyIG9mIG5ldyB0aHJlYWRzIGZv dW5kLiAgKi8KKworc3RhdGljIGludAorZmluZF9uZXdfdGhyZWFkc19vbmNl IChzdHJ1Y3QgdGhyZWFkX2RiX2luZm8gKmluZm8sIGludCBpdGVyYXRpb24s CisJCSAgICAgICBpbnQgKmVycnApCit7CisgIHZvbGF0aWxlIHN0cnVjdCBn ZGJfZXhjZXB0aW9uIGV4Y2VwdDsKKyAgc3RydWN0IGNhbGxiYWNrX2RhdGEg ZGF0YTsKKyAgaW50IGVyciA9IFREX0VSUjsKKworICBkYXRhLmluZm8gPSBp bmZvOworICBkYXRhLm5ld190aHJlYWRzID0gMDsKKworICBUUllfQ0FUQ0gg KGV4Y2VwdCwgUkVUVVJOX01BU0tfRVJST1IpCisgICAgeworICAgICAgLyog SXRlcmF0ZSBvdmVyIGFsbCB1c2VyLXNwYWNlIHRocmVhZHMgdG8gZGlzY292 ZXIgbmV3IHRocmVhZHMuICAqLworICAgICAgZXJyID0gaW5mby0+dGRfdGFf dGhyX2l0ZXJfcCAoaW5mby0+dGhyZWFkX2FnZW50LAorCQkJCSAgICBmaW5k X25ld190aHJlYWRzX2NhbGxiYWNrLAorCQkJCSAgICAmZGF0YSwKKwkJCQkg ICAgVERfVEhSX0FOWV9TVEFURSwKKwkJCQkgICAgVERfVEhSX0xPV0VTVF9Q UklPUklUWSwKKwkJCQkgICAgVERfU0lHTk9fTUFTSywKKwkJCQkgICAgVERf VEhSX0FOWV9VU0VSX0ZMQUdTKTsKKyAgICB9CisKKyAgaWYgKGluZm9fdmVy Ym9zZSkKKyAgICB7CisgICAgICBpZiAoZXhjZXB0LnJlYXNvbiA8IDApCisJ ZXhjZXB0aW9uX2ZwcmludGYgKGdkYl9zdGRlcnIsIGV4Y2VwdCwKKwkJCSAg ICJXYXJuaW5nOiBmaW5kX25ld190aHJlYWRzX29uY2U6ICIpOworCisgICAg ICBwcmludGZfZmlsdGVyZWQgKF8oIkZvdW5kICVkIG5ldyB0aHJlYWRzIGlu IGl0ZXJhdGlvbiAlZC5cbiIpLAorCQkgICAgICAgZGF0YS5uZXdfdGhyZWFk cywgaXRlcmF0aW9uKTsKKyAgICB9CisKKyAgaWYgKGVycnAgIT0gTlVMTCkK KyAgICAqZXJycCA9IGVycjsKKworICByZXR1cm4gZGF0YS5uZXdfdGhyZWFk czsKK30KKwogLyogU2VhcmNoIGZvciBuZXcgdGhyZWFkcywgYWNjZXNzaW5n IG1lbW9yeSB0aHJvdWdoIHN0b3BwZWQgdGhyZWFkCi0gICBQVElELiAgKi8K KyAgIFBUSUQuICBJZiBVTlRJTF9OT19ORVcgaXMgdHJ1ZSwgcmVwZWF0IHNl YXJjaGluZyB1bnRpbCBzZXZlcmFsCisgICBzZWFyY2hlcyBpbiBhIHJvdyBk byBub3QgZGlzY292ZXIgYW55IG5ldyB0aHJlYWRzLiAgKi8KIAogc3RhdGlj IHZvaWQKLXRocmVhZF9kYl9maW5kX25ld190aHJlYWRzXzEgKHB0aWRfdCBw dGlkKQordGhyZWFkX2RiX2ZpbmRfbmV3X3RocmVhZHNfMiAocHRpZF90IHB0 aWQsIGludCB1bnRpbF9ub19uZXcpCiB7CiAgIHRkX2Vycl9lIGVycjsKICAg c3RydWN0IGx3cF9pbmZvICpscDsKICAgc3RydWN0IHRocmVhZF9kYl9pbmZv ICppbmZvOwogICBpbnQgcGlkID0gcHRpZF9nZXRfcGlkIChwdGlkKTsKKyAg aW50IGksIGxvb3A7CiAKICAgLyogSW4gbGludXgsIHdlIGNhbiBvbmx5IHJl YWQgbWVtb3J5IHRocm91Z2ggYSBzdG9wcGVkIGx3cC4gICovCiAgIEFMTF9M V1BTIChscCwgcHRpZCkKQEAgLTEzNjEsMTUgKzE0MjUsMzYgQEAgdGhyZWFk X2RiX2ZpbmRfbmV3X3RocmVhZHNfMSAocHRpZF90IHB0aQogCiAgIC8qIEFj Y2VzcyBhbiBsd3Agd2Uga25vdyBpcyBzdG9wcGVkLiAgKi8KICAgaW5mby0+ cHJvY19oYW5kbGUucHRpZCA9IHB0aWQ7Ci0gIC8qIEl0ZXJhdGUgb3ZlciBh bGwgdXNlci1zcGFjZSB0aHJlYWRzIHRvIGRpc2NvdmVyIG5ldyB0aHJlYWRz LiAgKi8KLSAgZXJyID0gaW5mby0+dGRfdGFfdGhyX2l0ZXJfcCAoaW5mby0+ dGhyZWFkX2FnZW50LCBmaW5kX25ld190aHJlYWRzX2NhbGxiYWNrLAotCQkJ CWluZm8sIFREX1RIUl9BTllfU1RBVEUsIFREX1RIUl9MT1dFU1RfUFJJT1JJ VFksCi0JCQkJVERfU0lHTk9fTUFTSywgVERfVEhSX0FOWV9VU0VSX0ZMQUdT KTsKLSAgaWYgKGVyciAhPSBURF9PSykKLSAgICBlcnJvciAoXygiQ2Fubm90 IGZpbmQgbmV3IHRocmVhZHM6ICVzIiksIHRocmVhZF9kYl9lcnJfc3RyIChl cnIpKTsKKworICBpZiAodW50aWxfbm9fbmV3KQorICAgIHsKKyAgICAgIC8q IFJlcXVpcmUgNCBzdWNjZXNzaXZlIGl0ZXJhdGlvbnMgd2hpY2ggZG8gbm90 IGZpbmQgYW55IG5ldyB0aHJlYWRzLgorCSBUaGUgNCBpcyBhIGhldXJpc3Rp YzogdGhlcmUgaXMgYW4gaW5oZXJlbnQgcmFjZSBoZXJlLCBhbmQgSSBoYXZl CisJIHNlZW4gdGhhdCAyIGl0ZXJhdGlvbnMgaW4gYSByb3cgYXJlIG5vdCBh bHdheXMgc3VmZmljaWVudCB0bworCSAiY2FwdHVyZSIgYWxsIHRocmVhZHMu ICAqLworICAgICAgZm9yIChpID0gMCwgbG9vcCA9IDA7IGxvb3AgPCA0OyAr K2ksICsrbG9vcCkKKwlpZiAoZmluZF9uZXdfdGhyZWFkc19vbmNlIChpbmZv LCBpLCBOVUxMKSAhPSAwKQorCSAgLyogRm91bmQgc29tZSBuZXcgdGhyZWFk cy4gIFJlc3RhcnQgdGhlIGxvb3AgZnJvbSBiZWdpbm5pbmcuCSovCisJICBs b29wID0gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGVy cjsKKworICAgICAgZmluZF9uZXdfdGhyZWFkc19vbmNlIChpbmZvLCAwLCAm ZXJyKTsKKyAgICAgIGlmIChlcnIgIT0gVERfT0spCisJZXJyb3IgKF8oIkNh bm5vdCBmaW5kIG5ldyB0aHJlYWRzOiAlcyIpLCB0aHJlYWRfZGJfZXJyX3N0 ciAoZXJyKSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAordGhyZWFkX2Ri X2ZpbmRfbmV3X3RocmVhZHNfMSAocHRpZF90IHB0aWQpCit7CisgIHRocmVh ZF9kYl9maW5kX25ld190aHJlYWRzXzIgKHB0aWQsIDApOworfQorCisKK3N0 YXRpYyB2b2lkCiB0aHJlYWRfZGJfZmluZF9uZXdfdGhyZWFkcyAoc3RydWN0 IHRhcmdldF9vcHMgKm9wcykKIHsKICAgc3RydWN0IHRocmVhZF9kYl9pbmZv ICppbmZvOwo= --001636c597c30470300476dd34bd--