Date: Sat, 25 May 2013 16:27:07 -0400 From: Lee Thomas <lee_thomas@aslantools.com> To: <freebsd-hackers@freebsd.org> Subject: Performance improvement to strnlen(). Message-ID: <afa77dcc2e1cb351cfaded708acbdae0@lthomas.net>
next in thread | raw e-mail | index | archive | help
--=_2697a7f791e36da50ef742466c06863a Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=UTF-8; format=flowed Hello FreeBSD devs, I have found a performance improvement to libc's strnlen(). lib/libc/string/strnlen.c is a trivial byte-by-byte implementation, where strlen.c has a smarter word-by-word implementation. I have implemented strnlen similarly to strlen. It runs about 4x as fast, at the cost of a binary codesize increase from 30 bytes to 221. In writing this I needed a test, and there isn't one in tools/regression/lib/libc/string, so I wrote a unit test for strnlen. This really only makes sense for a word-by-word implementation, as it tests each combination of string and limit length, overread characters, and starting alignment. Could someone please review these patches? I am not very experienced in C, and am even less experienced with FreeBSD's style guidelines, so they likely have a bunch of style and idiom issues. Even if one or both of them prove not worth committing, it would still be useful for my learning. If/When these patches prove worthy of submitting, what is the next step after that? Should I submit a PR, or is there some other process? This code is quite similar to the existing strlen.c, and doesn't do anything fancy with e.g. endianness, but I haven't tested it for correctness or performance on anything other than x86... And finally, there is some other low-hanging fruit in the other strn* functions. Would it be worth it for me to give those the same treatment? Thanks, Lee Thomas Test platform: $uname -a FreeBSD LeeDesktop 9.1-STABLE FreeBSD 9.1-STABLE #15 r250831: Mon May 20 17:31:28 EDT 2013 lthomas@LeeDesktop:/usr/obj/usr/src/sys/NOSOUND amd64 $dmesg | grep CPU: CPU: Intel(R) Xeon(R) CPU X5650 @ 2.67GHz (2666.81-MHz K8-class CPU) $clang --version FreeBSD clang version 3.2 (tags/RELEASE_32/final 170710) 20121221 Target: x86_64-unknown-freebsd9.1 Thread model: posix My timing test was a file of 10000 strings, of uniformly random length, 50% between 0 and 20 bytes long, and 50% between 21 and 1000 bytes long. Each was filled with random generated bytes in the range [1, 255]. The test executables run their strlen on each string in the file 1000 times, and a shell script ran the test programs alternately 100 times. Here are the clang results; gcc results are roughly the same. I will share the actual timing code if someone wants it, but it is pretty ugly C++ and shell and I don't guarantee it working :-). Results: x ./times_bsd_strnlen.txt + ./times_my_strnlen.txt +--------------------------------------------------------------------------+ |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |+ x| |A A| +--------------------------------------------------------------------------+ N Min Max Median Avg Stddev x 101 1.8685486 1.8693889 1.8687506 1.8687894 0.0001484903 + 101 0.42704683 0.42779486 0.42712813 0.42715597 0.00010681494 Difference at 95.0% confidence -1.44163 +/- 3.56739e-05 -77.1426% +/- 0.00190893% (Student's t, pooled s = 0.000129342) Note: I manually shortened the histogram, as it was 100 lines long of exactly the same. --=_2697a7f791e36da50ef742466c06863a Content-Transfer-Encoding: base64 Content-Type: text/plain; name=strnlen.diff Content-Disposition: attachment; filename=strnlen.diff; size=3185 SW5kZXg6IHN0cm5sZW4uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9oZWFkL2xpYi9saWJjL3N0 cmluZy9zdHJubGVuLmMgYi9oZWFkL2xpYi9saWJjL3N0cmluZy9zdHJubGVuLmMKLS0tIGEvaGVh ZC9saWIvbGliYy9zdHJpbmcvc3Rybmxlbi5jCShyZXZpc2lvbiAyNTA5NTEpCisrKyBiL2hlYWQv bGliL2xpYmMvc3RyaW5nL3N0cm5sZW4uYwkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAK IC8qLQotICogQ29weXJpZ2h0IChjKSAyMDA5IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9y Zz4KKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBYaW4gTEkgPGRlbHBoaWpARnJlZUJTRC5v cmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTGVlIFRob21hcyA8bGVlX3Rob21hc0BBc2xhblRv b2xzLmNvbT4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24g YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0y NywxNiArMjgsOTEgQEAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIF9fRkJTRElEKCIkRnJlZUJT RCQiKTsKIAorI2luY2x1ZGUgPHN5cy9saW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K ICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorLyoKKyAqIFBvcnRhYmxlIHN0cm5sZW4oKSBmb3IgMzIt Yml0IGFuZCA2NC1iaXQgc3lzdGVtcy4KKyAqCisgKiBSYXRpb25hbGU6IGl0IGlzIGdlbmVyYWxs eSBtdWNoIG1vcmUgZWZmaWNpZW50IHRvIGRvIHdvcmQgbGVuZ3RoCisgKiBvcGVyYXRpb25zIGFu ZCBhdm9pZCBicmFuY2hlcyBvbiBtb2Rlcm4gY29tcHV0ZXIgc3lzdGVtcywgYXMKKyAqIGNvbXBh cmVkIHRvIGJ5dGUtbGVuZ3RoIG9wZXJhdGlvbnMgd2l0aCBhIGxvdCBvZiBicmFuY2hlcy4KKyAq CisgKiBUaGUgZXhwcmVzc2lvbjoKKyAqCisgKgkoKHggLSAweDAxLi4uLjAxKSAmIH54ICYgMHg4 MC4uLi44MCkKKyAqCisgKiB3b3VsZCBldmFsdWF0ZSB0byBhIG5vbi16ZXJvIHZhbHVlIGlmZiBh bnkgb2YgdGhlIGJ5dGVzIGluIHRoZQorICogb3JpZ2luYWwgd29yZCBpcyB6ZXJvLgorICoKKyAq IE9uIG11bHRpLWlzc3VlIHByb2Nlc3NvcnMsIHdlIGNhbiBkaXZpZGUgdGhlIGFib3ZlIGV4cHJl c3Npb24gaW50bzoKKyAqCWEpICAoeCAtIDB4MDEuLi4uMDEpCisgKgliKSAofnggJiAweDgwLi4u LjgwKQorICoJYykgYSAmIGIKKyAqCisgKiBXaGVyZSwgYSkgYW5kIGIpIGNhbiBiZSBwYXJ0aWFs bHkgY29tcHV0ZWQgaW4gcGFyYWxsZWwuCisgKgorICogVGhlIGFsZ29yaXRobSBhYm92ZSBpcyBm b3VuZCBvbiAiSGFja2VyJ3MgRGVsaWdodCIgYnkKKyAqIEhlbnJ5IFMuIFdhcnJlbiwgSnIuCisg Ki8KKworLyogTWFnaWMgbnVtYmVycyBmb3IgdGhlIGFsZ29yaXRobSAqLworI2lmIExPTkdfQklU ID09IDMyCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrMDEgPSAweDAxMDEwMTAxOwor c3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzazgwID0gMHg4MDgwODA4MDsKKyNlbGlmIExP TkdfQklUID09IDY0CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrMDEgPSAweDAxMDEw MTAxMDEwMTAxMDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrODAgPSAweDgwODA4 MDgwODA4MDgwODA7CisjZWxzZQorI2Vycm9yIFVuc3VwcG9ydGVkIHdvcmQgc2l6ZQorI2VuZGlm CisKKyNkZWZpbmUJTE9OR1BUUl9NQVNLIChzaXplb2YobG9uZykgLSAxKQorCiBzaXplX3QKLXN0 cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG1heGxlbikKK3N0cm5sZW4oY29uc3QgY2hhciAq c3RyLCBzaXplX3QgbWF4bGVuKQogewotCXNpemVfdCBsZW47CisJY29uc3QgY2hhciAqc3RvcCwg KnNob3J0X3N0b3A7CisJY29uc3QgY2hhciAqcDsKKwljb25zdCB1bnNpZ25lZCBsb25nICpscDsK Kwlsb25nIHZhLCB2YjsKIAotCWZvciAobGVuID0gMDsgbGVuIDwgbWF4bGVuOyBsZW4rKywgcysr KSB7Ci0JCWlmICghKnMpCi0JCQlicmVhazsKKwlpZiAobWF4bGVuPT0wKSByZXR1cm4gMDsKKwor CXN0b3A9c3RyK21heGxlbjsKKwkvKgorCSAqIEJlZm9yZSB0cnlpbmcgdGhlIGhhcmQgKHVuYWxp Z25lZCBieXRlLWJ5LWJ5dGUgYWNjZXNzKSB3YXkKKwkgKiB0byBmaWd1cmUgb3V0IHdoZXRoZXIg dGhlcmUgaXMgYSBudWwgY2hhcmFjdGVyLCB0cnkgdG8gc2VlCisJICogaWYgdGhlcmUgaXMgYSBu dWwgY2hhcmFjdGVyIGlzIHdpdGhpbiB0aGlzIGFjY2Vzc2libGUgd29yZAorCSAqIGZpcnN0Lgor CSAqCisJICogcCBhbmQgKHAgJiB+TE9OR1BUUl9NQVNLKSBtdXN0IGJlIGVxdWFsbHkgYWNjZXNz aWJsZSBzaW5jZQorCSAqIHRoZXkgYWx3YXlzIGZhbGwgaW4gdGhlIHNhbWUgbWVtb3J5IHBhZ2Us IGFzIGxvbmcgYXMgcGFnZQorCSAqIGJvdW5kYXJpZXMgaXMgaW50ZWdyYWwgbXVsdGlwbGUgb2Yg d29yZCBzaXplLgorCSAqLworCWxwID0gKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikoKHVpbnRwdHJf dClzdHIgJiB+TE9OR1BUUl9NQVNLKTsKKwl2YSA9ICgqbHAgLSBtYXNrMDEpOworCXZiID0gKCh+ KmxwKSAmIG1hc2s4MCk7CisJbHArKzsKKwlpZiAodmEgJiB2YikgeworCQkvKiBDaGVjayBpZiB3 ZSBoYXZlIFwwIGluIHRoZSBmaXJzdCBwYXJ0ICovCisJCXNob3J0X3N0b3A9KGNvbnN0IGNoYXIg KilscDsKKwkJaWYgKHN0b3A8c2hvcnRfc3RvcCkgc2hvcnRfc3RvcD1zdG9wOworCQlmb3IgKHA9 c3RyOyBwICE9IHNob3J0X3N0b3A7IHArKykKKwkJCWlmICgqcCA9PSAnXDAnKQorCQkJCXJldHVy biAocC1zdHIpOwogCX0KLQlyZXR1cm4gKGxlbik7CisJLyogU2NhbiB0aGUgcmVzdCBvZiB0aGUg c3RyaW5nIHVzaW5nIHdvcmQgc2l6ZWQgb3BlcmF0aW9uICovCisJZm9yICg7IChjb25zdCBjaGFy ICopbHAgPCBzdG9wOyBscCsrKSB7CisJCXZhID0gKCpscCAtIG1hc2swMSk7CisJCXZiID0gKCh+ KmxwKSAmIG1hc2s4MCk7CisJCWlmICh2YSAmIHZiKSB7CisJCQlmb3IgKHA9KGNvbnN0IGNoYXIg KilscDsgcCAhPSBzdG9wOyBwKyspCisJCQkJaWYgKCpwID09ICdcMCcpCisJCQkJCWJyZWFrOwor CQkJcmV0dXJuIChwLXN0cik7CisJCX0KKwl9CisJcmV0dXJuIChtYXhsZW4pOwogfQo= --=_2697a7f791e36da50ef742466c06863a Content-Transfer-Encoding: base64 Content-Type: text/plain; name=test-strnlen.diff Content-Disposition: attachment; filename=test-strnlen.diff; size=4392 SW5kZXg6IE1ha2VmaWxlCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2hlYWQvdG9vbHMvcmVncmVz c2lvbi9saWIvbGliYy9zdHJpbmcvTWFrZWZpbGUgYi9oZWFkL3Rvb2xzL3JlZ3Jlc3Npb24vbGli L2xpYmMvc3RyaW5nL01ha2VmaWxlCi0tLSBhL2hlYWQvdG9vbHMvcmVncmVzc2lvbi9saWIvbGli Yy9zdHJpbmcvTWFrZWZpbGUJKHJldmlzaW9uIDI1MDk1MSkKKysrIGIvaGVhZC90b29scy9yZWdy ZXNzaW9uL2xpYi9saWJjL3N0cmluZy9NYWtlZmlsZQkod29ya2luZyBjb3B5KQpAQCAtNCw3ICs0 LDcgQEAKIExERkxBR1MrPQktTC91c3IvbG9jYWwvbGliCiBMRExJQlM9CQktbHRhcAogCi1URVNU Uz0JdGVzdC1zdHBuY3B5IHRlc3Qtc3RyZXJyb3IgdGVzdC13Y3NjYXNlY21wIHRlc3Qtd2Nzbmxl bgorVEVTVFM9CXRlc3Qtc3RwbmNweSB0ZXN0LXN0cmVycm9yIHRlc3Qtc3RybmxlbiB0ZXN0LXdj c2Nhc2VjbXAgdGVzdC13Y3NubGVuCiAKIC5QSE9OWTogdGVzdHMKIHRlc3RzOiAke1RFU1RTfQpJ bmRleDogdGVzdC1zdHJubGVuLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvaGVhZC90b29scy9y ZWdyZXNzaW9uL2xpYi9saWJjL3N0cmluZy90ZXN0LXN0cm5sZW4uYyBiL2hlYWQvdG9vbHMvcmVn cmVzc2lvbi9saWIvbGliYy9zdHJpbmcvdGVzdC1zdHJubGVuLmMKbmV3IGZpbGUgbW9kZSAxMDY0 NAotLS0gL2Rldi9udWxsCShyZXZpc2lvbiAwKQorKysgYi9oZWFkL3Rvb2xzL3JlZ3Jlc3Npb24v bGliL2xpYmMvc3RyaW5nL3Rlc3Qtc3Rybmxlbi5jCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs ODMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDEzIExlZSBUaG9tYXMgPGxlZV90aG9tYXNA QXNsYW5Ub29scy5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91 dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JT IGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAq IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklC VVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVE SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMK KyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F U1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1Ig VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX QVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP RiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSA8c3lz L2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxzdGRpby5oPgor I2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIE1BWF9M RU4gKHNpemVvZihsb25nKSAqIDIpCitzdGF0aWMgdm9pZCB0ZXN0X3N0cm5sZW4oY2hhciBqdW5r X2ZpbGwsIHNpemVfdCBzdHJfbGVuLCBzaXplX3QgYWwpOworCisvKgorICogVGVzdHMgc3Rybmxl biBmb3IgdmFyaW91cyBsZW5ndGhzLCBidWZmZXIgcmVzdHJpY3Rpb25zLCBhbmQgYWxpZ25tZW50 cy4KKyAqIFNpbmNlIHN0cm5sZW4gcG90ZW50aWFsbHkgcmVhZHMgKGFuZCBicmFuY2hlcykgb24g YWxsIG9mIHRoZSBieXRlcyBpbiB0aGUKKyAqIGFsaWduZWQgd29yZHMgY29udGFpbmluZyB0aGUg c3RhcnQgYW5kIGVuZCBvZiB0aGUgdW5hbGlnbmVkIHN0cmluZywgd2UKKyAqIG5lZWQgdG8gdGVz dCBib3RoIHplcm8gYW5kIG5vbnplcm8gdmFsdWVzIG9mIHRob3NlIHJlYWQtYnV0LWRpc3JlZ2Fy ZGVkIGJ5dGVzLgorICogTm90ZSB0aGF0IHRoZSByZWFkcyB0aGVtc2VsdmVzIGFyZSBzYWZlIGJl Y2F1c2UgdGhlIHBhZ2Ugc2l6ZSBpcyBhbiBpbnRlZ2VyCisgKiBtdWx0aXBsZSBvZiB0aGUgd29y ZHNpemUuCisgKi8KK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc2l6ZV90 IGFsLCBzdHJfbGVuLCBydW5zOworCWNoYXIganVua19maWxsOworCXByaW50ZigiMS4uMVxuIik7 CisJZm9yIChqdW5rX2ZpbGwgPSAwOyBqdW5rX2ZpbGwgPD0gMTsganVua19maWxsKyspIHsKKwkJ Zm9yIChzdHJfbGVuID0gMDsgc3RyX2xlbiA8IE1BWF9MRU47IHN0cl9sZW4rKykgeworCQkJZm9y IChhbCA9IHNpemVvZihsb25nKTsgYWwgPCAyICogc2l6ZW9mKGxvbmcpOyBhbCsrKSB7CisJCQkJ dGVzdF9zdHJubGVuKGp1bmtfZmlsbCwgc3RyX2xlbiwgYWwpOworCQkJfQorCQl9CisJfQorCXBy aW50Zigib2sgMSAtIHN0cm5sZW5cbiIpOworCXJldHVybiAwOworfQorc3RhdGljIHZvaWQgCit0 ZXN0X3N0cm5sZW4oY2hhciBqdW5rX2ZpbGwsIHNpemVfdCBzdHJfbGVuLCBzaXplX3QgYWwpCit7 CisJLyoKKwkgKiBSZXF1aXJlZCBzaXplIGlzIDIqc2l6ZW9mKGxvbmcpIGp1bmssIE1BWF9MRU4g Y2hhcnMsIDEgbnVsLCBhbmQgCisJICogdGhlbiBzaXplb2YobG9uZykganVuaworCSAqLworCWNo YXIgYnVmW01BWF9MRU4gKyAxICsgMyAqIHNpemVvZihsb25nKV07CisJY2hhciAqIHN0cjsKKwlz aXplX3QgbGltaXRfbGVuLCBjb3JyZWN0X3Jlc3VsdDsKKwkKKwlzdHIgPSBidWYgKyBhbDsKKwlt ZW1zZXQoYnVmLCBqdW5rX2ZpbGwsIGFsKTsKKwltZW1zZXQoc3RyLCAnYScsIHN0cl9sZW4pOwor CXN0cltzdHJfbGVuXSA9ICdcMCc7CisJbWVtc2V0KHN0ciArIHN0cl9sZW4gKyAxLCBqdW5rX2Zp bGwsIHNpemVvZihsb25nKSk7CisJZm9yIChsaW1pdF9sZW4gPSAwOyBsaW1pdF9sZW4gPCBNQVhf TEVOICsgMjsgbGltaXRfbGVuKyspIHsKKwkJY29ycmVjdF9yZXN1bHQgPSBsaW1pdF9sZW4gPCBz dHJfbGVuID8gbGltaXRfbGVuIDogc3RyX2xlbjsKKwkJaWYgKHN0cm5sZW4oc3RyLCBsaW1pdF9s ZW4pICE9IGNvcnJlY3RfcmVzdWx0KSB7CisJCQlwcmludGYoIm5vdCBvayAtIHN0cm5sZW5cbiIp OworCQkJZXhpdCgxKTsKKwkJfQorCX0KK30KClByb3BlcnR5IGNoYW5nZXMgb246IGhlYWQvdG9v bHMvcmVncmVzc2lvbi9saWIvbGliYy9zdHJpbmcvdGVzdC1zdHJubGVuLmMKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpB ZGRlZDogc3ZuOm1pbWUtdHlwZQojIyAtMCwwICsxICMjCit0ZXh0L3BsYWluClwgTm8gbmV3bGlu ZSBhdCBlbmQgb2YgcHJvcGVydHkKQWRkZWQ6IHN2bjprZXl3b3JkcwojIyAtMCwwICsxICMjCitG cmVlQlNEPSVIClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgcHJvcGVydHkKQWRkZWQ6IHN2bjplb2wt c3R5bGUKIyMgLTAsMCArMSAjIworbmF0aXZlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgcHJvcGVy dHkK --=_2697a7f791e36da50ef742466c06863a--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?afa77dcc2e1cb351cfaded708acbdae0>