[kaffe] unix-pthreads accept timeout
Mathieu Dube
mdube@8d.com
Wed, 7 Aug 2002 10:13:37 -0400
--------------Boundary-00=_PU8H4PTOKPVLE8BW8ECI
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Ok,
I changed it. I also put a check to see if the timeout is 0 to pass NULL to
select() and added a timeout*1000 since usecs and millisecs arent the same.
My java programmer here seems to say it works.
Thanks
Later
-Mat
On Wednesday 07 August 2002 10:02, you wrote:
> > Plus jthreadedAccept as a timeout passed as an argument. It works
> > perfectly in the unix-jthreads version.
>
> Right, I wouldn't have implemented it there if it hadn't been
> needed.
>
> > > (On a more general note, the interface contract of the jsyscall stuff
> > > is that you don't pass in arbitrary or arbitrarily modded file
> > > descriptors, you pass the fds you get from jthreadedSocket/Open/Accept
> > > etc. A minimum of encapsulation doesn't hurt.)
> >
> > Do you mean that I should write a function that waits for the timeout
> > instead of having the select() code directly in the jthreadedAccept
> > function?
>
> Just remove the test whether it's nonblocking in your patch.
> Assume that it's a fd return from a jthreaded* function, which
> is blocking. Other than that, select() might just work in
> pthreads.
>
> - Godmar
--
Mathieu Dube -- mdube@8d.com
8D Technologies Inc.
http://www.8d.com
--------------Boundary-00=_PU8H4PTOKPVLE8BW8ECI
Content-Type: text/x-c;
charset="iso-8859-1";
name="syscalls.c"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="syscalls.c"
LyoKICogc3lzY2FsbHMuYwogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcKICogICAgICBU
cmFuc3ZpcnR1YWwgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgog
KiBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBh
bmQgcmVkaXN0cmlidXRpb24KICogb2YgdGhpcyBmaWxlLgogKi8KCiNpbmNsdWRlICJjb25maWcu
aCIKI2luY2x1ZGUgImRlYnVnLmgiCiNpbmNsdWRlICJjb25maWctc3RkLmgiCiNpbmNsdWRlICJj
b25maWctbWVtLmgiCiNpbmNsdWRlICJjb25maWctaW8uaCIKI2luY2x1ZGUgImNvbmZpZy1zaWdu
YWwuaCIKI2luY2x1ZGUgImNvbmZpZy1uZXQuaCIKI2luY2x1ZGUgImd0eXBlcy5oIgojaW5jbHVk
ZSAianN5c2NhbGwuaCIKI2luY2x1ZGUgImpzaWduYWwuaCIKI2luY2x1ZGUgIm5ldHMuaCIKI2lm
IGRlZmluZWQoSEFWRV9TWVNfV0FJVF9IKQojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2VuZGlmCgoj
ZGVmaW5lIE5PVElNRU9VVAkwCgovKgogKiBXZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBleGVj
J2luZyBleHRlcm5hbCBwcm9jZXNzZXMuICBXaGlsZSB0aGF0CiAqIGlzIGVhc3kgdG8gZG8sIGl0
IHVuY2xlYXIgaG93IHdlIGNhbiB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBleGl0IHNpbmNlCiAq
IGl0IG11c3QgYmUgZG9uZSBmcm9tIHRoZSBzYW1lIHRocmVhZCB0aGF0IGNyZWF0ZWQgaXQuICBU
aGlzIG1pZ2h0IG5vdAogKiBiZSB0aGUgY2FzZS4KICogSXQncyBub3QgY2xlYXIgaG93IGJlc3Qg
dG8gYWNoaWV2ZSB0aGlzIC0gVElNIDEwLzE3Lzk5CiAqLwojdW5kZWYJSEFWRV9GT1JLCiN1bmRl
ZglIQVZFX1dBSVRQSUQKCi8qCiAqIHZhcmlvdXMgYnVpbGRpbmcgYmxvY2tzIGZvciB0aW1lb3V0
IHN5c3RlbSBjYWxsIGZ1bmN0aW9ucwogKi8KI2RlZmluZSBTRVRfREVBRExJTkUoZGVhZGxpbmUs
IHRpbWVvdXQpIAkJXAoJaWYgKHRpbWVvdXQgIT0gTk9USU1FT1VUKSB7CQkJXAoJCWRlYWRsaW5l
ID0gdGltZW91dCArIGN1cnJlbnRUaW1lKCk7CVwKCX0KCiNkZWZpbmUgQlJFQUtfSUZfTEFURShk
ZWFkbGluZSwgdGltZW91dCkJCVwKCWlmICh0aW1lb3V0ICE9IE5PVElNRU9VVCkgewkJCVwKCQlp
ZiAoY3VycmVudFRpbWUoKSA+PSBkZWFkbGluZSkgewlcCgkJCWVycm5vID0gRUlOVFI7CQkJXAoJ
CQlicmVhazsJCQkJXAoJCX0JCQkJCVwKCX0KCiNkZWZpbmUgSUdOT1JFX0VJTlRSKHIpCQkJCQlc
CglpZiAociA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgewkJXAoJCWNvbnRpbnVlOwkJCQlcCgl9
CgojZGVmaW5lIFNFVF9SRVRVUk4ocikJCQkJCVwKCWlmIChyID09IC0xKSB7CQkJCQlcCgkJciA9
IGVycm5vOwkJCQlcCgl9IAoKI2RlZmluZSBTRVRfUkVUVVJOX09VVChyLCBvdXQsIHJldCkJCQlc
CglpZiAociA9PSAtMSkgewkJCQkJXAoJCXIgPSBlcnJubzsJCQkJXAoJfSBlbHNlIHsJCQkJCVwK
CQkqb3V0ID0gcmV0OwkJCQlcCgkJciA9IDA7CQkJCQlcCgl9CgojZGVmaW5lIENBTExfQkxPQ0tf
T05fRklMRShBLCBCLCBDKQkJCQlcCglpZiAoYmxvY2tPbkZpbGUoQSwgQiwgQykpIHsJCQkJXAoJ
CS8qIGludGVycnVwdGVkIHZpYSBqdGhyZWFkX2ludGVycnVwdCgpICovIAlcCgkJZXJybm8gPSBF
SU5UUjsgCQkJCQlcCgkJYnJlYWs7CQkJCQkJXAoJfQoKc3RhdGljCmpsb25nCmN1cnJlbnRUaW1l
KHZvaWQpCnsKICAgIHN0cnVjdCB0aW1ldmFsIHRtOwogICAgZ2V0dGltZW9mZGF5KCZ0bSwgMCk7
CiAgICByZXR1cm4gKCgoamxvbmcpdG0udHZfc2VjICogMTAwMEwpICsgKChqbG9uZyl0bS50dl91
c2VjIC8gMTAwMEwpKTsKfQoKLyoKICogVGhyZWFkZWQgc29ja2V0IGNyZWF0ZS4KICovCmludApq
dGhyZWFkZWRTb2NrZXQoaW50IGFmLCBpbnQgdHlwZSwgaW50IHByb3RvLCBpbnQgKm91dCkKewog
ICAgICAgIGludCByOwoKICAgICAgICByID0gc29ja2V0KGFmLCB0eXBlLCBwcm90byk7CiAgICAg
ICAgaWYgKHIgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHIgPSBlcnJubzsKICAgICAgICB9IGVs
c2UgewogICAgICAgICAgICAgICAgKm91dCA9IHI7CiAgICAgICAgICAgICAgICByID0gMDsKICAg
ICAgICB9CiAgICAgICAgcmV0dXJuIChyKTsKfQoKaW50Cmp0aHJlYWRlZE9wZW4oY29uc3QgY2hh
ciogcGF0aCwgaW50IGZsYWdzLCBpbnQgbW9kZSwgaW50ICpvdXQpCnsKICAgICAgICBpbnQgcjsK
CiAgICAgICAgLyogQ3lnbnVzIFdpbk5UIHJlcXVpcmVzIHRoaXMgKi8KICAgICAgICByID0gb3Bl
bihwYXRoLCBmbGFnc3xPX0JJTkFSWSwgbW9kZSk7CiAgICAgICAgaWYgKHIgPT0gLTEpIHsKICAg
ICAgICAgICAgICAgIHIgPSBlcnJubzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAg
Km91dCA9IHI7CiAgICAgICAgICAgICAgICByID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJu
IChyKTsKfQoKc3RhdGljIGludApqdGhyZWFkZWRDbG9zZShpbnQgZmQpCnsKCWludCByYyA9IDA7
CgoJaWYgKGNsb3NlKGZkKSA9PSAtMSkgewoJCXJjID0gZXJybm87Cgl9CglyZXR1cm4gKHJjKTsK
fQoKc3RhdGljIGludApqdGhyZWFkZWRMaXN0ZW4oaW50IGZkLCBpbnQgbCkKewoJaW50IHJjID0g
MDsKCglpZiAobGlzdGVuKGZkLCBsKSA9PSAtMSkgewoJCXJjID0gZXJybm87Cgl9CglyZXR1cm4g
KHJjKTsKfQoKc3RhdGljIGludApqdGhyZWFkZWRLaWxsKGludCBwaWQsIGludCBzaWcpCnsKCWlu
dCByYyA9IDA7CgoJaWYgKGtpbGwocGlkLCBzaWcpID09IC0xKSB7CgkJcmMgPSBlcnJubzsKCX0K
CXJldHVybiAocmMpOwp9CgpzdGF0aWMgaW50Cmp0aHJlYWRlZEJpbmQoaW50IGZkLCBzdHJ1Y3Qg
c29ja2FkZHIgKmFkZHIsIGludCBuYW1lbGVuKQp7CglpbnQgcmMgPSAwOwoKCWlmIChiaW5kKGZk
LCBhZGRyLCBuYW1lbGVuKSA9PSAtMSkgewoJCXJjID0gZXJybm87Cgl9CglyZXR1cm4gKHJjKTsK
fQoKc3RhdGljIGludApqdGhyZWFkZWRMU2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdo
ZW5jZSwgb2ZmX3QgKm91dCkKewoJaW50IHJjID0gMDsKCgkqb3V0ID0gbHNlZWsoZmQsIG9mZnNl
dCwgd2hlbmNlKTsKCWlmICgqb3V0ID09IC0xKSB7CgkJcmMgPSBlcnJubzsKCX0KCXJldHVybiAo
cmMpOwp9CgpzdGF0aWMgaW50Cmp0aHJlYWRlZEZTdGF0KGludCBmZCwgc3RydWN0IHN0YXQgKnNi
KQp7CglpbnQgcmMgPSAwOwoKCWlmIChmc3RhdChmZCwgc2IpID09IC0xKSB7CgkJcmMgPSBlcnJu
bzsKCX0KCXJldHVybiAocmMpOwp9CgpzdGF0aWMgaW50Cmp0aHJlYWRlZFN0YXQoY29uc3QgY2hh
ciogcGF0aCwgc3RydWN0IHN0YXQgKnNiKQp7CglpbnQgcmMgPSAwOwoKCWlmIChzdGF0KHBhdGgs
IHNiKSA9PSAtMSkgewoJCXJjID0gZXJybm87Cgl9CglyZXR1cm4gKHJjKTsKfQoKc3RhdGljIGlu
dApqdGhyZWFkZWRNa2Rpcihjb25zdCBjaGFyICpwYXRoLCBpbnQgbW9kZSkKewoJaW50IHJjID0g
MDsKCglpZiAobWtkaXIocGF0aCwgbW9kZSkgPT0gLTEpIHsKCQlyYyA9IGVycm5vOwoJfQoJcmV0
dXJuIChyYyk7Cn0KCnN0YXRpYyBpbnQKanRocmVhZGVkUm1kaXIoY29uc3QgY2hhciAqcGF0aCkK
ewoJaW50IHJjID0gMDsKCglpZiAocm1kaXIocGF0aCkgPT0gLTEpIHsKCQlyYyA9IGVycm5vOwoJ
fQoJcmV0dXJuIChyYyk7Cn0KCnN0YXRpYyBpbnQKanRocmVhZGVkUmVuYW1lKGNvbnN0IGNoYXIg
KnBhdGgxLCBjb25zdCBjaGFyICpwYXRoMikKewoJaW50IHJjID0gMDsKCglpZiAocmVuYW1lKHBh
dGgxLCBwYXRoMikgPT0gLTEpIHsKCQlyYyA9IGVycm5vOwoJfQoJcmV0dXJuIChyYyk7Cn0KCnN0
YXRpYyBpbnQKanRocmVhZGVkUmVtb3ZlKGNvbnN0IGNoYXIgKmVudHJ5KQp7CglpbnQgcmMgPSAw
OwoKCWlmIChyZW1vdmUoZW50cnkpID09IC0xKSB7CgkJcmMgPSBlcnJubzsKCX0KCXJldHVybiAo
cmMpOwp9CgpzdGF0aWMgaW50ICAgICAKanRocmVhZGVkU2VuZHRvKGludCBhLCBjb25zdCB2b2lk
KiBiLCBzaXplX3QgYywgaW50IGQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciogZSwKCQlpbnQgZiwg
c3NpemVfdCAqb3V0KQp7CglpbnQgcmMgPSAwOwoKCSpvdXQgPSBlID8gc2VuZHRvKGEsIGIsIGMs
IGQsIGUsIGYpIDogc2VuZChhLCBiLCBjLCBkKTsKCWlmICgqb3V0ID09IC0xKSB7CgkJcmMgPSBl
cnJubzsKCX0KCXJldHVybiAocmMpOwp9CgpzdGF0aWMgaW50Cmp0aHJlYWRlZFNldFNvY2tPcHQo
aW50IGEsIGludCBiLCBpbnQgYywgY29uc3Qgdm9pZCogZCwgaW50IGUpCnsKCWludCByYyA9IDA7
CgoJaWYgKHNldHNvY2tvcHQoYSwgYiwgYywgZCwgZSkgPT0gLTEpIHsKCQlyYyA9IGVycm5vOwoJ
fQoJcmV0dXJuIChyYyk7Cn0KCnN0YXRpYyBpbnQKanRocmVhZGVkR2V0U29ja09wdChpbnQgYSwg
aW50IGIsIGludCBjLCB2b2lkKiBkLCBpbnQqIGUpCnsKCWludCByYyA9IDA7CgoJaWYgKGdldHNv
Y2tvcHQoYSwgYiwgYywgZCwgZSkgPT0gLTEpIHsKCQlyYyA9IGVycm5vOwoJfQoJcmV0dXJuIChy
Yyk7Cn0KCnN0YXRpYyBpbnQKanRocmVhZGVkR2V0U29ja05hbWUoaW50IGEsIHN0cnVjdCBzb2Nr
YWRkciogYiwgaW50KiBjKQp7CglpbnQgcmMgPSAwOwoKCWlmIChnZXRzb2NrbmFtZShhLCBiLCBj
KSA9PSAtMSkgewoJCXJjID0gZXJybm87Cgl9CglyZXR1cm4gKHJjKTsKfQoKc3RhdGljIGludApq
dGhyZWFkZWRHZXRQZWVyTmFtZShpbnQgYSwgc3RydWN0IHNvY2thZGRyKiBiLCBpbnQqIGMpCnsK
CWludCByYyA9IDA7CgoJaWYgKGdldHBlZXJuYW1lKGEsIGIsIGMpID09IC0xKSB7CgkJcmMgPSBl
cnJubzsKCX0KCXJldHVybiAocmMpOwp9CgpzdGF0aWMgaW50Cmp0aHJlYWRlZEdldEhvc3RCeU5h
bWUoY29uc3QgY2hhciAqaG9zdCwgc3RydWN0IGhvc3RlbnQqKiBvdXQpCnsKCWludCByYyA9IDA7
CgoJLyogTkI6IHRoaXMgd2lsbCBibG9jayB0aGUgd2hvbGUgcHJvY2VzcyB3aGlsZSB3ZSdyZSBs
b29raW5nIHVwCgkgKiBhIG5hbWUuICBIb3dldmVyLCBnZXRob3N0YnluYW1lIGlzIGV4dHJlbWVs
eSBhc3luYy1zaWduYWwtdW5zYWZlLAoJICogYW5kIGhlbmNlIHdlIGhhdmUgbm8gb3RoZXIgY2hv
aWNlLiAgTm93IEkgdW5kZXJzdGFuZCB3aHkgb2xkIAoJICogTmV0c2NhcGVzIGJsb2NrZWQgd2hl
biBsb29raW5nIHVwIGEgbmFtZS4gIAoJICoKCSAqIEluIGEgVU5JWHkgc3lzdGVtLCBhIHBvc3Np
YmxlIHNvbHV0aW9uIGlzIHRvIHNwYXduIGEgcHJvY2VzcwoJICogZm9yIGxvb2t1cHMsIHdoaWNo
IEkgdGhpbmsgaXMgd2hhdCBOUyBldmVudHVhbGx5IGRpZC4KCSAqLwoJKm91dCA9IGdldGhvc3Ri
eW5hbWUoaG9zdCk7CglpZiAoKm91dCA9PSAwKSB7CgkJcmMgPSBoX2Vycm5vOwoJCWlmIChyYyA9
PSAwKSB7CgkJCSpvdXQgPSAodm9pZCopLTE7CgkJCXJjID0gZXJybm87CgkJfQoJfQoJcmV0dXJu
IChyYyk7Cn0KCnN0YXRpYyBpbnQKanRocmVhZGVkR2V0SG9zdEJ5QWRkcihjb25zdCBjaGFyICpo
b3N0LCBpbnQgbCwgaW50IHQsIHN0cnVjdCBob3N0ZW50Kiogb3V0KQp7CglpbnQgcmMgPSAwOwoK
CS8qIE5COiBzYW1lIGNvbW1lbnQgYXMgZm9yIGp0aHJlYWRlZEdldEhvc3RCeU5hbWUgYXBwbGll
cyBoZXJlICovCgkqb3V0ID0gZ2V0aG9zdGJ5YWRkcihob3N0LCBsLCB0KTsKCWlmICgqb3V0ID09
IDApIHsKCQlyYyA9IGhfZXJybm87CgkJaWYgKHJjID09IDApIHsKCQkJKm91dCA9ICh2b2lkKikt
MTsKCQkJcmMgPSBlcnJubzsKCQl9Cgl9CglyZXR1cm4gKHJjKTsKfQoKc3RhdGljIGludApqdGhy
ZWFkZWRTZWxlY3QoaW50IGEsIGZkX3NldCogYiwgZmRfc2V0KiBjLCBmZF9zZXQqIGQsIAoJCXN0
cnVjdCB0aW1ldmFsKiBlLCBpbnQqIG91dCkKewoJaW50IHJjID0gMDsKCglpZiAoKCpvdXQgPSBz
ZWxlY3QoYSwgYiwgYywgZCwgZSkpID09IC0xKSB7CgkJcmMgPSBlcnJubzsKCX0KCXJldHVybiAo
cmMpOwp9CgovKgogKiBUaHJlYWRlZCBzb2NrZXQgY29ubmVjdC4KICovCmludApqdGhyZWFkZWRD
b25uZWN0KGludCBmZCwgc3RydWN0IHNvY2thZGRyKiBhZGRyLCBpbnQgbGVuLCBpbnQgdGltZW91
dCkKewoJaW50IHI7CglqbG9uZyBkZWFkbGluZSA9IDA7CglpbnQgaW5Qcm9ncmVzcyA9IDA7CgoJ
U0VUX0RFQURMSU5FKGRlYWRsaW5lLCB0aW1lb3V0KQoJZm9yICg7OykgewoJCXIgPSBjb25uZWN0
KGZkLCBhZGRyLCBsZW4pOwoJCWlmIChyID09IDAgfHwgIShlcnJubyA9PSBFSU5QUk9HUkVTUyAK
CQkJCXx8IGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVJU0NPTk4pKSB7CgkJCWJyZWFrOwkv
KiBzdWNjZXNzIG9yIHJlYWwgZXJyb3IgKi8KCQl9CgkJaWYgKHIgPT0gLTEgJiYgZXJybm8gPT0g
RUlTQ09OTikgewoJCQkvKiBPbiBTb2xhcmlzIDIuNSwgYWZ0ZXIgZ2V0dGluZyBFSU5QUk9HUkVT
UwoJCQkgICBmcm9tIGEgbm9uLWJsb2NraW5nIGNvbm5lY3QgcmVxdWVzdCwgd2UKCQkJICAgd29u
J3QgZXZlciBnZXQgc3VjY2Vzcy4gIFdoZW4gd2UncmUgd2FrZW4KCQkJICAgdXAsIHdlJ2xsIGVp
dGhlciBnZXQgRUlTQ09OTiwgd2hpY2ggc2hvdWxkCgkJCSAgIGJlIHRha2VuIGFzIHN1Y2Nlc3Ms
IG9yIGEgcmVhbCBmYWlsdXJlLgoJCQkgICBIb3dldmVyLCB3ZSBjYW4ndCBtYXAgRUlTQ09OTiB0
byBzdWNjZXNzCgkJCSAgIGluY29uZGl0aW9uYWxseSwgYmVjYXVzZSBhdHRlbXB0aW5nIHRvCgkJ
CSAgIGNvbm5lY3QgdGhlIHNhbWUgc29ja2V0IGFnYWluIHNob3VsZCByYWlzZQoJCQkgICBhbiBl
eGNlcHRpb24uCgoJCQkgICBNYXBwaW5nIEVJU0NPTk4gdG8gc3VjY2VzcyBtaWdodCBsZWFkIHRv
CgkJCSAgIGZhbHNlIHBvc2l0aXZlcyBpZiBjb25uZWN0IGZhaWxzIGFuZAoJCQkgICBhbm90aGVy
IHRocmVhZCBzdWNjZWVkcyB0byBjb25uZWN0IHRoaXMKCQkJICAgc29ja2V0IGJlZm9yZSB0aGlz
IG9uZSBpcyB3YWtlbiB1cC4gIExldCdzCgkJCSAgIGp1c3QgaG9wZSBpdCBkb2Vzbid0IGhhcHBl
biBmb3Igbm93LiAgKi8KCQkJaWYgKGluUHJvZ3Jlc3MpIHsKCQkJCXIgPSAwOwoJCQl9CgkJCWJy
ZWFrOwoJCX0gZWxzZSBpZiAociA9PSAtMSAmJiBlcnJubyA9PSBFSU5QUk9HUkVTUykgewoJCQlp
blByb2dyZXNzID0gMTsKCQl9CgkJSUdOT1JFX0VJTlRSKHIpCgkJQlJFQUtfSUZfTEFURShkZWFk
bGluZSwgdGltZW91dCkKCX0KCVNFVF9SRVRVUk4ocikKCXJldHVybiAocik7Cn0KCi8qCiAqIFRo
cmVhZGVkIHNvY2tldCBhY2NlcHQuCiAqLwppbnQKanRocmVhZGVkQWNjZXB0KGludCBmZCwgc3Ry
dWN0IHNvY2thZGRyKiBhZGRyLCBpbnQqIGxlbiwgCgkJaW50IHRpbWVvdXQsIGludCogb3V0KQp7
CgkvKiBhYnNvbHV0ZSB0aW1lIGF0IHdoaWNoIHRpbWUgb3V0IGlzIHJlYWNoZWQgKi8KCWpsb25n
IGRlYWRsaW5lID0gMDsKCWludCByLGZsYWdzLHJldDsKCWZkX3NldCByc2V0OwoJc3RydWN0IHRp
bWV2YWwgdHY7CgoJCglGRF9aRVJPKCZyc2V0KTsKCUZEX1NFVChmZCwmcnNldCk7Cgl0di50dl9z
ZWMgPSAwOyAKCXR2LnR2X3VzZWMgPSB0aW1lb3V0KjEwMDA7CglpZiAodGltZW91dCA9PSAwKSAK
CQlyZXQgPSBzZWxlY3QoZmQrMSwmcnNldCxOVUxMLE5VTEwsTlVMTCk7CgllbHNlCQoJCXJldCA9
IHNlbGVjdChmZCsxLCZyc2V0LE5VTEwsTlVMTCwmdHYpOwoJaWYgKHJldCkgewoJCWlmIChGRF9J
U1NFVChmZCwmcnNldCkpIHsKCQkJciA9IGFjY2VwdChmZCxhZGRyLGxlbik7CgkJCVNFVF9SRVRV
Uk5fT1VUKHIsIG91dCwgcikKCQkJcmV0dXJuIChyKTsKCQl9Cgl9CgllbHNlIHsKCQkvKnRpbWVk
IG91dCovCgkJZXJybm8gPSBFSU5UUjsJCQoJCXIgPSAtMTsKCX0KCQkJCglTRVRfUkVUVVJOX09V
VChyLCBvdXQsIHIpCglyZXR1cm4gKHIpOwp9CgovKgogKiBUaHJlYWRlZCByZWFkIHdpdGggdGlt
ZW91dAogKi8KaW50Cmp0aHJlYWRlZFRpbWVkUmVhZChpbnQgZmQsIHZvaWQqIGJ1Ziwgc2l6ZV90
IGxlbiwgaW50IHRpbWVvdXQsIHNzaXplX3QgKm91dCkKewoJc3NpemVfdCByID0gLTE7CgkvKiBh
YnNvbHV0ZSB0aW1lIGF0IHdoaWNoIHRpbWVvdXQgaXMgcmVhY2hlZCAqLwoJamxvbmcgZGVhZGxp
bmUgPSAwOwoKCWFzc2VydCh0aW1lb3V0ID49IDApOwoJU0VUX0RFQURMSU5FKGRlYWRsaW5lLCB0
aW1lb3V0KQoJZm9yICg7OykgewoJCXIgPSByZWFkKGZkLCBidWYsIGxlbik7CgkJaWYgKHIgPj0g
MCB8fCAhKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVJTlRSIAoJCQkJfHwgZXJy
bm8gPT0gRUFHQUlOKSkgewoJCQlicmVhazsJLyogcmVhbCBlcnJvciBvciBzdWNjZXNzICovCgkJ
fQoJCUlHTk9SRV9FSU5UUihyKQoJCUJSRUFLX0lGX0xBVEUoZGVhZGxpbmUsIHRpbWVvdXQpCgl9
CglTRVRfUkVUVVJOX09VVChyLCBvdXQsIHIpCglyZXR1cm4gKHIpOwp9CgovKgogKiBUaHJlYWRl
ZCByZWFkIHdpdGggbm8gdGltZSBvdXQKICovCmludApqdGhyZWFkZWRSZWFkKGludCBmZCwgdm9p
ZCogYnVmLCBzaXplX3QgbGVuLCBzc2l6ZV90ICpvdXQpCnsKCXJldHVybiAoanRocmVhZGVkVGlt
ZWRSZWFkKGZkLCBidWYsIGxlbiwgTk9USU1FT1VULCBvdXQpKTsKfQoKLyoKICogVGhyZWFkZWQg
d3JpdGUKICovCmludApqdGhyZWFkZWRXcml0ZShpbnQgZmQsIGNvbnN0IHZvaWQqIGJ1Ziwgc2l6
ZV90IGxlbiwgc3NpemVfdCAqb3V0KQp7Cglzc2l6ZV90IHIgPSAxOwoJY29uc3Qgdm9pZCogcHRy
OwoKCXB0ciA9IGJ1ZjsKCgl3aGlsZSAobGVuID4gMCAmJiByID4gMCkgewoJCXIgPSAoc3NpemVf
dCl3cml0ZShmZCwgcHRyLCBsZW4pOwoJCWlmIChyID49IDApIHsKCQkJcHRyICs9IHI7CgkJCWxl
biAtPSByOwoJCQlyID0gcHRyIC0gYnVmOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKGVycm5vID09
IEVJTlRSKSB7CgkJCS8qIGlnbm9yZSAqLwoJCQlyID0gMTsKCQkJY29udGludWU7CgkJfQoJCWlm
ICghKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikpIHsKCQkJLyogcmVh
bCBlcnJvciAqLwoJCQlicmVhazsKCQl9CgkJciA9IDE7Cgl9CglTRVRfUkVUVVJOX09VVChyLCBv
dXQsIHIpCglyZXR1cm4gKHIpOyAKfQoKLyoKICogVGhyZWFkZWQgcmVjdmZyb20gCiAqLwppbnQg
Cmp0aHJlYWRlZFJlY3Zmcm9tKGludCBmZCwgdm9pZCogYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxh
Z3MsIAoJc3RydWN0IHNvY2thZGRyKiBmcm9tLCBpbnQqIGZyb21sZW4sIGludCB0aW1lb3V0LCBz
c2l6ZV90ICpvdXQpCnsKCWludCByOwoJamxvbmcgZGVhZGxpbmUgPSAwOwogCglTRVRfREVBRExJ
TkUoZGVhZGxpbmUsIHRpbWVvdXQpCglmb3IgKDs7KSB7CgkJciA9IHJlY3Zmcm9tKGZkLCBidWYs
IGxlbiwgZmxhZ3MsIGZyb20sIGZyb21sZW4pOwoJCWlmIChyID49IDAgfHwgIShlcnJubyA9PSBF
V09VTERCTE9DSyB8fCBlcnJubyA9PSBFSU5UUiAKCQkJCQl8fCBlcnJubyA9PSBFQUdBSU4pKSB7
CgkJCWJyZWFrOwoJCX0KCQlJR05PUkVfRUlOVFIocikKCQlCUkVBS19JRl9MQVRFKGRlYWRsaW5l
LCB0aW1lb3V0KQoJfQoJU0VUX1JFVFVSTl9PVVQociwgb3V0LCByKQoJcmV0dXJuIChyKTsKfQoK
LyogaGVscGVyIGZ1bmN0aW9uIGZvciBmb3JrZXhlYywgY2xvc2UgZmRbMC4ubi0xXSAqLwpzdGF0
aWMgdm9pZApjbG9zZV9mZHMoaW50IGZkW10sIGludCBuKQp7CiAgICAgICAgaW50IGkgPSAwOwog
ICAgICAgIHdoaWxlIChpIDwgbikgewogICAgICAgICAgICAgICAgY2xvc2UoZmRbaSsrXSk7Cgl9
Cn0KCmludCAKanRocmVhZGVkRm9ya0V4ZWMoY2hhciAqKmFyZ3YsIGNoYXIgKiphcmdlLAoJaW50
IGlvZXNbNF0sIGludCAqb3V0cGlkLCBjb25zdCBjaGFyICpkaXIpCnsKLyogdGhlc2UgZGVmaW5l
cyBhcmUgaW5kaWNlcyBpbiBpb2VzICovCiNkZWZpbmUgSU5fSU4JCTAKI2RlZmluZSBJTl9PVVQJ
CTEKI2RlZmluZSBPVVRfSU4JCTIKI2RlZmluZSBPVVRfT1VUCQkzCiNkZWZpbmUgRVJSX0lOCQk0
CiNkZWZpbmUgRVJSX09VVAkJNQojZGVmaW5lIFNZTkNfSU4JCTYKI2RlZmluZSBTWU5DX09VVAk3
CgoJaW50IGZkc1s4XTsKCWludCBuZmQ7CQkvKiBudW1iZXIgb2YgZmRzIGluIGBmZHMnIHRoYXQg
YXJlIHZhbGlkICovCglzaWdzZXRfdCBuc2lnOwoJY2hhciBiWzFdOwoJaW50IHBpZCwgaSwgZXJy
OwoKCS8qIAoJICogd2UgbmVlZCBleGVjdmUoKSBhbmQgZm9yaygpIGZvciB0aGlzIHRvIHdvcmsu
ICBEb24ndCBib3RoZXIgaWYKCSAqIHdlIGRvbid0IGhhdmUgdGhlbS4KCSAqLwojaWYgIWRlZmlu
ZWQoSEFWRV9FWEVDVkUpICYmICFkZWZpbmVkKEhBVkVfRVhFQ1ZQKQoJdW5pbXAoIm5laXRoZXIg
ZXhlY3ZlKCkgbm9yIGV4ZWN2cCgpIHByb3ZpZGVkIik7CiNlbmRpZgojaWYgIWRlZmluZWQoSEFW
RV9GT1JLKQoJdW5pbXAoImZvcmsoKSBub3QgcHJvdmlkZWQiKTsKI2VuZGlmCgoJLyogQ3JlYXRl
IHRoZSBwaXBlcyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjaGlsZCAqLwoJLyogTWFrZSBzdXJl
IGZkcyBnZXQgY2xvc2VkIGlmIHdlIGNhbid0IGNyZWF0ZSBhbGwgcGlwZXMgKi8KCWZvciAobmZk
ID0gMDsgbmZkIDwgODsgbmZkICs9IDIpIHsKCQlpbnQgZTsKCQllcnIgPSBwaXBlKGZkcyArIG5m
ZCk7CgkJZSA9IGVycm5vOwoJCWlmIChlcnIgPT0gLTEpIHsKCQkJY2xvc2VfZmRzKGZkcywgbmZk
KTsKCQkJcmV0dXJuIChlKTsKCQl9Cgl9CgoJLyogCgkgKiBXZSBtdXN0IGF2b2lkIHRoYXQgdGhl
IGNoaWxkIGRpZXMgYmVjYXVzZSBvZiBTSUdWVEFMUk0gb3IKCSAqIG90aGVyIHNpZ25hbHMuICBX
ZSBkaXNhYmxlIGludGVycnVwdHMgYmVmb3JlIGZvcmtpbmcgYW5kIHRoZW4KCSAqIHJlZW5hYmxl
IHNpZ25hbHMgaW4gdGhlIGNoaWxkIGFmdGVyIHdlIGNsZWFuZWQgdXAuCgkgKi8KCXNpZ2ZpbGxz
ZXQoJm5zaWcpOwoJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbnNpZywgMCk7CgoJcGlkID0gZm9y
aygpOwoKCXN3aXRjaCAocGlkKSB7CgljYXNlIDA6CgkJLyogQ2hpbGQgKi8KCQkvKiBzZXQgYWxs
IHNpZ25hbHMgYmFjayB0byB0aGVpciBkZWZhdWx0IHN0YXRlICovCgkJZm9yIChpID0gMDsgaSA8
IE5TSUc7IGkrKykgewoJCQljbGVhclNpZ25hbChpKTsKCQl9CgoJCS8qIG5vdyByZWVuYWJsZSBp
bnRlcnJ1cHRzICovCgkJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZuc2lnLCAwKTsKCgkJLyog
c2V0IHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIgdXAgZnJvbSB0aGUgcGlwZXMgKi8KCQlkdXAy
KGZkc1tJTl9JTl0sIDApOwoJCWR1cDIoZmRzW09VVF9PVVRdLCAxKTsKCQlkdXAyKGZkc1tFUlJf
T1VUXSwgMik7CgoJCS8qIFdoYXQgaXMgc3luYyBhYm91dCBhbnlob3c/ICBXZWxsIG15IGN1cnJl
bnQgZ3Vlc3MgaXMgdGhhdAoJCSAqIHRoZSBwYXJlbnQgd3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8g
aXQgd2hlbiBpdCdzIHJlYWR5IHRvCgkJICogcHJvY2VlZC4gIFNvIGhlcmUgSSB3YWl0IHVudGls
IEkgZ2V0IGl0IGJlZm9yZSBkb2luZwoJCSAqIGFueXRoaW5nLgoJCSAqLwoJCS8qIG5vdGUgdGhh
dCB0aGlzIGlzIGEgYmxvY2tpbmcgcmVhZCAqLwoJCXJlYWQoZmRzW1NZTkNfSU5dLCBiLCBzaXpl
b2YoYikpOwoKCQkvKiBub3cgY2xvc2UgYWxsIHBpcGUgZmRzICovCgkJY2xvc2VfZmRzKGZkcywg
OCk7CgoJCS8qIGNoYW5nZSB3b3JraW5nIGRpcmVjdG9yeSAqLwojaWYgZGVmaW5lZChIQVZFX0NI
RElSKQoJCSh2b2lkKWNoZGlyKGRpcik7CiNlbmRpZgoKCQkvKgoJCSAqIElmIG5vIGVudmlyb25t
ZW50IHdhcyBnaXZlbiBhbmQgd2UgaGF2ZSBleGVjdnAsIHdlIHVzZSBpdC4KCQkgKiBJZiBhbiBl
bnZpcm9ubWVudCB3YXMgZ2l2ZW4sIHdlIHVzZSBleGVjdmUuCgkJICogVGhpcyBpcyByb3VnaGx5
IHdhcyB0aGUgbGludXggamRrIHNlZW1zIHRvIGRvLgoJCSAqLwoKCQkvKiBleGVjdXRlIHByb2dy
YW0gKi8KI2lmIGRlZmluZWQoSEFWRV9FWEVDVlApCgkJaWYgKGFyZ2UgPT0gTlVMTCkKCQkJZXhl
Y3ZwKGFyZ3ZbMF0sIGFyZ3YpOwoJCWVsc2UKI2VuZGlmCgkJCWV4ZWN2ZShhcmd2WzBdLCBhcmd2
LCBhcmdlKTsKCQlicmVhazsKCgljYXNlIC0xOgoJCS8qIEVycm9yICovCgkJZXJyID0gZXJybm87
CgkJLyogQ2xvc2UgYWxsIHBpcGUgZmRzICovCgkJY2xvc2VfZmRzKGZkcywgOCk7CgkJc2lncHJv
Y21hc2soU0lHX1VOQkxPQ0ssICZuc2lnLCAwKTsKCQlyZXR1cm4gKGVycik7CgoJZGVmYXVsdDoK
CQkvKiBQYXJlbnQgKi8KCQkvKiBjbG9zZSB0aGUgZmRzIHdlIHdvbid0IG5lZWQgKi8KCQljbG9z
ZShmZHNbSU5fSU5dKTsKCQljbG9zZShmZHNbT1VUX09VVF0pOwoJCWNsb3NlKGZkc1tFUlJfT1VU
XSk7CgkJY2xvc2UoZmRzW1NZTkNfSU5dKTsKCgkJLyogY29weSBhbmQgZml4IHVwIHRoZSBmZHMg
d2UgZG8gbmVlZCAqLwoJCWlvZXNbMF0gPSBmZHNbSU5fT1VUXTsKCQlpb2VzWzFdID0gZmRzW09V
VF9JTl07CgkJaW9lc1syXSA9IGZkc1tFUlJfSU5dOwoJCWlvZXNbM10gPSBmZHNbU1lOQ19PVVRd
OwoKCQlzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywgJm5zaWcsIDApOwoJCSpvdXRwaWQgPSBwaWQ7
CgkJcmV0dXJuICgwKTsKCX0KCglleGl0KC0xKTsKCS8qIE5FVkVSIFJFQUNIRUQgKi8JCn0KCi8q
IAogKiBXYWl0IGZvciBhIGNoaWxkIHByb2Nlc3MuCiAqLwppbnQKanRocmVhZGVkV2FpdHBpZChp
bnQgd3BpZCwgaW50KiBzdGF0dXMsIGludCBvcHRpb25zLCBpbnQgKm91dHBpZCkKewojaWYgZGVm
aW5lZChIQVZFX1dBSVRQSUQpCglpbnQgbnBpZDsKCglucGlkID0gd2FpdHBpZCh3cGlkLCBzdGF0
dXMsIG9wdGlvbnMpOwoJaWYgKG5waWQgPiAwKSB7CgkJKm91dHBpZCA9IG5waWQ7CgkJcmV0dXJu
ICgwKTsKCX0KCWVsc2UgewoJCXJldHVybiAoLTEpOwoJfQojZWxzZQoJcmV0dXJuICgtMSk7CiNl
bmRpZgp9CgovKgogKiBUaGUgc3lzY2FsbCBpbnRlcmZhY2UgYXMgcHJvdmlkZWQgYnkgdGhlIGlu
dGVybmFsIGp0aHJlYWQgc3lzdGVtLgogKi8KU3lzdGVtQ2FsbEludGVyZmFjZSBLYWZmZV9TeXN0
ZW1DYWxsSW50ZXJmYWNlID0gewogICAgICAgIGp0aHJlYWRlZE9wZW4sCiAgICAgICAganRocmVh
ZGVkUmVhZCwJCiAgICAgICAganRocmVhZGVkV3JpdGUsIAogICAgICAgIGp0aHJlYWRlZExTZWVr
LAogICAgICAgIGp0aHJlYWRlZENsb3NlLAogICAgICAgIGp0aHJlYWRlZEZTdGF0LAogICAgICAg
IGp0aHJlYWRlZFN0YXQsCiAgICAgICAganRocmVhZGVkTWtkaXIsCiAgICAgICAganRocmVhZGVk
Um1kaXIsCiAgICAgICAganRocmVhZGVkUmVuYW1lLAogICAgICAgIGp0aHJlYWRlZFJlbW92ZSwK
ICAgICAgICBqdGhyZWFkZWRTb2NrZXQsCiAgICAgICAganRocmVhZGVkQ29ubmVjdCwKICAgICAg
ICBqdGhyZWFkZWRCaW5kLAogICAgICAgIGp0aHJlYWRlZExpc3RlbiwKICAgICAgICBqdGhyZWFk
ZWRBY2NlcHQsIAogICAgICAgIGp0aHJlYWRlZFRpbWVkUmVhZCwJCiAgICAgICAganRocmVhZGVk
UmVjdmZyb20sCiAgICAgICAganRocmVhZGVkV3JpdGUsIAogICAgICAgIGp0aHJlYWRlZFNlbmR0
bywJCiAgICAgICAganRocmVhZGVkU2V0U29ja09wdCwJCiAgICAgICAganRocmVhZGVkR2V0U29j
a09wdCwKICAgICAgICBqdGhyZWFkZWRHZXRTb2NrTmFtZSwgCiAgICAgICAganRocmVhZGVkR2V0
UGVlck5hbWUsIAogICAgICAgIGp0aHJlYWRlZENsb3NlLAogICAgICAgIGp0aHJlYWRlZEdldEhv
c3RCeU5hbWUsCiAgICAgICAganRocmVhZGVkR2V0SG9zdEJ5QWRkciwKICAgICAgICBqdGhyZWFk
ZWRTZWxlY3QsCQogICAgICAgIGp0aHJlYWRlZEZvcmtFeGVjLAogICAgICAgIGp0aHJlYWRlZFdh
aXRwaWQsCiAgICAgICAganRocmVhZGVkS2lsbAp9Owo=
--------------Boundary-00=_PU8H4PTOKPVLE8BW8ECI--