Skip site navigation (1)Skip section navigation (2)
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>