From: Shugo Maeda Date: 2005-03-15T17:15:27+09:00 Subject: [ruby-dev:25917] fast profiler This is a multi-part message in MIME format. --------------040103030603090702020007 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit 前田です。 Shugo Maeda wrote: >>>パッチを当ててもよいですが、せっかく手を入れるんなら複数のイ >>>ベントフックを登録したいような気がするんですが、どう思います >>>か? >> >> >>そう思いつつ手を抜いていました。手が空いたら書き直します。 > > > 実装してみました。 > パッチを添付します。 1.8用のパッチも用意してみました。 ちなみに、 $ svn co http://svn.shugo.net/src/ruby-prof/trunk/ ruby-prof でプロファイラを取得できます。 パッチ(ruby-1.8.diffかruby-1.9.diff)をあててたRubyで、 $ ruby extconf.rb $ make # make install でインストールできます。 プロファイルを取るには、 $ ruby -v -r doprof ~/ruby/fib.rb ruby 1.8.2 (2005-03-14) [i686-linux] use clock(3) for profiling 6765 %% cumulative self self total time seconds seconds calls ms/call ms/call name 71.43 0.10 0.10 21891 0.00 0.09 Object#fib 14.29 0.12 0.02 21890 0.00 0.00 Fixnum#- 7.14 0.13 0.01 21891 0.00 0.00 Fixnum#< 7.14 0.14 0.01 10945 0.00 0.00 Fixnum#+ 0.00 0.14 0.00 2 0.00 0.00 IO#write 0.00 0.14 0.00 1 0.00 140.00 #toplevel 0.00 0.14 0.00 1 0.00 0.00 Kernel.print 0.00 0.14 0.00 1 0.00 0.00 Fixnum#to_s 0.00 0.14 0.00 1 0.00 0.00 Module#method_added のようにdoprof.rbをrequireするだけでOKです。 デフォルトではclock(3)を使いますが、環境変数RUBY_PROF_CLOCK_MODEの 値によって $ export RUBY_PROF_CLOCK_MODE=gettimeofday ならgettimeofday(2)を、 $ export RUBY_PROF_CLOCK_MODE=cpu ならCPUのクロックカウンタを使います(現状ではPentiumとPowerPCのみ対応)。 -- 前田 修吾 --------------040103030603090702020007 Content-Type: text/plain; name="ruby-1.8.diff" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="ruby-1.8.diff" SW5kZXg6IGV2YWwuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvdmFyL2N2cy9zcmMvcnVi eS9ldmFsLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNjE2LjIuODUKZGlmZiAtdSAtcCAt cjEuNjE2LjIuODUgZXZhbC5jCi0tLSBldmFsLmMJOCBNYXIgMjAwNSAwOTo1NjoxOCAtMDAw MAkxLjYxNi4yLjg1CisrKyBldmFsLmMJMTUgTWFyIDIwMDUgMDg6MDg6MDYgLTAwMDAKQEAg LTEwMTcsOSArMTAxNywyNyBAQCBzdGF0aWMgVkFMVUUgbW9kdWxlX3NldHVwIF8oKFZBTFVF LE5PREUqCiBzdGF0aWMgVkFMVUUgbWFzc2lnbiBfKChWQUxVRSxOT0RFKixWQUxVRSxpbnQp KTsKIHN0YXRpYyB2b2lkIGFzc2lnbiBfKChWQUxVRSxOT0RFKixWQUxVRSxpbnQpKTsKIAor dHlwZWRlZiBzdHJ1Y3QgZXZlbnRfaG9vayB7CisgICAgcmJfZXZlbnRfaG9va19mdW5jX3Qg ZnVuYzsKKyAgICByYl9ldmVudF90IGV2ZW50czsKKyAgICBzdHJ1Y3QgZXZlbnRfaG9vayAq bmV4dDsKK30gcmJfZXZlbnRfaG9va190OworCitzdGF0aWMgcmJfZXZlbnRfaG9va190ICpl dmVudF9ob29rczsKKworI2RlZmluZSBFWEVDX0VWRU5UX0hPT0soZXZlbnQsIG5vZGUsIHNl bGYsIGlkLCBrbGFzcykgXAorICAgIGRvIHsgXAorCXJiX2V2ZW50X2hvb2tfdCAqaG9vazsg XAorCVwKKwlmb3IgKGhvb2sgPSBldmVudF9ob29rczsgaG9vazsgaG9vayA9IGhvb2stPm5l eHQpIHsgXAorCSAgICBpZiAoaG9vay0+ZXZlbnRzICYgZXZlbnQpIFwKKwkJKCpob29rLT5m dW5jKShldmVudCwgbm9kZSwgc2VsZiwgaWQsIGtsYXNzKTsgXAorCX0gXAorICAgIH0gd2hp bGUgKDApCisKIHN0YXRpYyBWQUxVRSB0cmFjZV9mdW5jID0gMDsKIHN0YXRpYyBpbnQgdHJh Y2luZyA9IDA7Ci1zdGF0aWMgdm9pZCBjYWxsX3RyYWNlX2Z1bmMgXygoY2hhciosTk9ERSos VkFMVUUsSUQsVkFMVUUpKTsKK3N0YXRpYyB2b2lkIGNhbGxfdHJhY2VfZnVuYyBfKChyYl9l dmVudF90LE5PREUqLFZBTFVFLElELFZBTFVFKSk7CiAKICNpZiAwCiAjZGVmaW5lIFNFVF9D VVJSRU5UX1NPVVJDRSgpIChydWJ5X3NvdXJjZWZpbGUgPSBydWJ5X2N1cnJlbnRfbm9kZS0+ bmRfZmlsZSwgXApAQCAtMjM4NCw2ICsyNDAyLDQyIEBAIHJiX29ial9pc19wcm9jKHByb2Mp CiAgICAgcmV0dXJuIFFmYWxzZTsKIH0KIAordm9pZAorcmJfYWRkX2V2ZW50X2hvb2socmJf ZXZlbnRfaG9va19mdW5jX3QgZnVuYywgcmJfZXZlbnRfdCBldmVudHMpCit7CisgICAgcmJf ZXZlbnRfaG9va190ICpob29rOworCisgICAgaG9vayA9IEFMTE9DKHJiX2V2ZW50X2hvb2tf dCk7CisgICAgaG9vay0+ZnVuYyA9IGZ1bmM7CisgICAgaG9vay0+ZXZlbnRzID0gZXZlbnRz OworICAgIGhvb2stPm5leHQgPSBldmVudF9ob29rczsKKyAgICBldmVudF9ob29rcyA9IGhv b2s7Cit9CisKK2ludAorcmJfcmVtb3ZlX2V2ZW50X2hvb2socmJfZXZlbnRfaG9va19mdW5j X3QgZnVuYykKK3sKKyAgICByYl9ldmVudF9ob29rX3QgKnByZXYsICpob29rOworCisgICAg cHJldiA9IE5VTEw7CisgICAgaG9vayA9IGV2ZW50X2hvb2tzOworICAgIHdoaWxlIChob29r KSB7CisJaWYgKGhvb2stPmZ1bmMgPT0gZnVuYykgeworCSAgICBpZiAocHJldikgeworCQlw cmV2LT5uZXh0ID0gaG9vay0+bmV4dDsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJZXZlbnRf aG9va3MgPSBob29rLT5uZXh0OworCSAgICB9CisJICAgIHhmcmVlKGhvb2spOworCSAgICBy ZXR1cm4gMDsKKwl9CisJcHJldiA9IGhvb2s7CisJaG9vayA9IGhvb2stPm5leHQ7CisgICAg fQorICAgIHJldHVybiAtMTsKK30KKwogLyoKICAqICBjYWxsLXNlcToKICAqICAgICBzZXRf dHJhY2VfZnVuYyhwcm9jKSAgICA9PiBwcm9jCkBAIC0yNDMyLDE5ICsyNDg2LDUzIEBAIHN0 YXRpYyBWQUxVRQogc2V0X3RyYWNlX2Z1bmMob2JqLCB0cmFjZSkKICAgICBWQUxVRSBvYmos IHRyYWNlOwogeworICAgIHJiX2V2ZW50X2hvb2tfdCAqaG9vazsKKwogICAgIGlmIChOSUxf UCh0cmFjZSkpIHsKIAl0cmFjZV9mdW5jID0gMDsKKwlyYl9yZW1vdmVfZXZlbnRfaG9vayhj YWxsX3RyYWNlX2Z1bmMpOwogCXJldHVybiBRbmlsOwogICAgIH0KICAgICBpZiAoIXJiX29i al9pc19wcm9jKHRyYWNlKSkgewogCXJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJ0cmFjZV9m dW5jIG5lZWRzIHRvIGJlIFByb2MiKTsKICAgICB9Ci0gICAgcmV0dXJuIHRyYWNlX2Z1bmMg PSB0cmFjZTsKKyAgICB0cmFjZV9mdW5jID0gdHJhY2U7CisgICAgZm9yIChob29rID0gZXZl bnRfaG9va3M7IGhvb2s7IGhvb2sgPSBob29rLT5uZXh0KSB7CisJaWYgKGhvb2stPmZ1bmMg PT0gY2FsbF90cmFjZV9mdW5jKQorCSAgICByZXR1cm4gdHJhY2U7CisgICAgfQorICAgIHJi X2FkZF9ldmVudF9ob29rKGNhbGxfdHJhY2VfZnVuYywgUlVCWV9FVkVOVF9BTEwpOworICAg IHJldHVybiB0cmFjZTsKK30KKworc3RhdGljIGNoYXIgKgorZ2V0X2V2ZW50X25hbWUocmJf ZXZlbnRfdCBldmVudCkKK3sKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBSVUJZ X0VWRU5UX0xJTkU6CisJcmV0dXJuICJsaW5lIjsKKyAgICBjYXNlIFJVQllfRVZFTlRfQ0xB U1M6CisJcmV0dXJuICJjbGFzcyI7CisgICAgY2FzZSBSVUJZX0VWRU5UX0VORDoKKwlyZXR1 cm4gImVuZCI7CisgICAgY2FzZSBSVUJZX0VWRU5UX0NBTEw6CisJcmV0dXJuICJjYWxsIjsK KyAgICBjYXNlIFJVQllfRVZFTlRfUkVUVVJOOgorCXJldHVybiAicmV0dXJuIjsKKyAgICBj YXNlIFJVQllfRVZFTlRfQ19DQUxMOgorCXJldHVybiAiYy1jYWxsIjsKKyAgICBjYXNlIFJV QllfRVZFTlRfQ19SRVRVUk46CisJcmV0dXJuICJjLXJldHVybiI7CisgICAgY2FzZSBSVUJZ X0VWRU5UX1JBSVNFOgorCXJldHVybiAicmFpc2UiOworICAgIGRlZmF1bHQ6CisJcmV0dXJu ICJ1bmtub3duIjsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBjYWxsX3RyYWNlX2Z1bmMo ZXZlbnQsIG5vZGUsIHNlbGYsIGlkLCBrbGFzcykKLSAgICBjaGFyICpldmVudDsKKyAgICBy Yl9ldmVudF90IGV2ZW50OwogICAgIE5PREUgKm5vZGU7CiAgICAgVkFMVUUgc2VsZjsKICAg ICBJRCBpZDsKQEAgLTI0NTQsNiArMjU0Miw3IEBAIGNhbGxfdHJhY2VfZnVuYyhldmVudCwg bm9kZSwgc2VsZiwgaWQsIGsKICAgICBzdHJ1Y3QgRlJBTUUgKnByZXY7CiAgICAgTk9ERSAq bm9kZV9zYXZlOwogICAgIFZBTFVFIHNyY2ZpbGU7CisgICAgY2hhciAqZXZlbnRfbmFtZTsK IAogICAgIGlmICghdHJhY2VfZnVuYykgcmV0dXJuOwogICAgIGlmICh0cmFjaW5nKSByZXR1 cm47CkBAIC0yNDg4LDcgKzI1NzcsOCBAQCBjYWxsX3RyYWNlX2Z1bmMoZXZlbnQsIG5vZGUs IHNlbGYsIGlkLCBrCiAgICAgcmFpc2VkID0gdGhyZWFkX3Jlc2V0X3JhaXNlZCgpOwogICAg IGlmICgoc3RhdGUgPSBFWEVDX1RBRygpKSA9PSAwKSB7CiAJc3JjZmlsZSA9IHJiX3N0cl9u ZXcyKHJ1Ynlfc291cmNlZmlsZT9ydWJ5X3NvdXJjZWZpbGU6IihydWJ5KSIpOwotCXByb2Nf aW52b2tlKHRyYWNlX2Z1bmMsIHJiX2FyeV9uZXczKDYsIHJiX3N0cl9uZXcyKGV2ZW50KSwK KwlldmVudF9uYW1lID0gZ2V0X2V2ZW50X25hbWUoZXZlbnQpOworCXByb2NfaW52b2tlKHRy YWNlX2Z1bmMsIHJiX2FyeV9uZXczKDYsIHJiX3N0cl9uZXcyKGV2ZW50X25hbWUpLAogCQkJ CQkgICAgc3JjZmlsZSwKIAkJCQkJICAgIElOVDJGSVgocnVieV9zb3VyY2VsaW5lKSwKIAkJ CQkJICAgIGlkP0lEMlNZTShpZCk6UW5pbCwKQEAgLTI3NjksMTEgKzI4NTksOSBAQCByYl9l dmFsKHNlbGYsIG4pCiAJUkVUVVJOKFFmYWxzZSk7CiAKICAgICAgIGNhc2UgTk9ERV9JRjoK LQlpZiAodHJhY2VfZnVuYykgewotCSAgICBjYWxsX3RyYWNlX2Z1bmMoImxpbmUiLCBub2Rl LCBzZWxmLAotCQkJICAgIHJ1YnlfZnJhbWUtPmxhc3RfZnVuYywKLQkJCSAgICBydWJ5X2Zy YW1lLT5sYXN0X2NsYXNzKTsKLQl9CisJRVhFQ19FVkVOVF9IT09LKFJVQllfRVZFTlRfTElO RSwgbm9kZSwgc2VsZiwKKwkJCXJ1YnlfZnJhbWUtPmxhc3RfZnVuYywKKwkJCXJ1YnlfZnJh bWUtPmxhc3RfY2xhc3MpOwogCWlmIChSVEVTVChyYl9ldmFsKHNlbGYsIG5vZGUtPm5kX2Nv bmQpKSkgewogCSAgICBub2RlID0gbm9kZS0+bmRfYm9keTsKIAl9CkBAIC0yNzg5LDExICsy ODc3LDkgQEAgcmJfZXZhbChzZWxmLCBuKQogCSAgICBpZiAobmRfdHlwZShub2RlKSAhPSBO T0RFX1dIRU4pIGdvdG8gYWdhaW47CiAJICAgIHRhZyA9IG5vZGUtPm5kX2hlYWQ7CiAJICAg IHdoaWxlICh0YWcpIHsKLQkJaWYgKHRyYWNlX2Z1bmMpIHsKLQkJICAgIGNhbGxfdHJhY2Vf ZnVuYygibGluZSIsIHRhZywgc2VsZiwKLQkJCQkgICAgcnVieV9mcmFtZS0+bGFzdF9mdW5j LAotCQkJCSAgICBydWJ5X2ZyYW1lLT5sYXN0X2NsYXNzKTsKLQkJfQorCQlFWEVDX0VWRU5U X0hPT0soUlVCWV9FVkVOVF9MSU5FLCB0YWcsIHNlbGYsCisJCQkJcnVieV9mcmFtZS0+bGFz dF9mdW5jLAorCQkJCXJ1YnlfZnJhbWUtPmxhc3RfY2xhc3MpOwogCQlpZiAodGFnLT5uZF9o ZWFkICYmIG5kX3R5cGUodGFnLT5uZF9oZWFkKSA9PSBOT0RFX1dIRU4pIHsKIAkJICAgIFZB TFVFIHYgPSByYl9ldmFsKHNlbGYsIHRhZy0+bmRfaGVhZC0+bmRfaGVhZCk7CiAJCSAgICBs b25nIGk7CkBAIC0yODMyLDExICsyOTE4LDkgQEAgcmJfZXZhbChzZWxmLCBuKQogCQl9CiAJ CXRhZyA9IG5vZGUtPm5kX2hlYWQ7CiAJCXdoaWxlICh0YWcpIHsKLQkJICAgIGlmICh0cmFj ZV9mdW5jKSB7Ci0JCQljYWxsX3RyYWNlX2Z1bmMoImxpbmUiLCB0YWcsIHNlbGYsCi0JCQkJ CXJ1YnlfZnJhbWUtPmxhc3RfZnVuYywKLQkJCQkJcnVieV9mcmFtZS0+bGFzdF9jbGFzcyk7 Ci0JCSAgICB9CisJCSAgICBFWEVDX0VWRU5UX0hPT0soUlVCWV9FVkVOVF9MSU5FLCB0YWcs IHNlbGYsCisJCQkJICAgIHJ1YnlfZnJhbWUtPmxhc3RfZnVuYywKKwkJCQkgICAgcnVieV9m cmFtZS0+bGFzdF9jbGFzcyk7CiAJCSAgICBpZiAodGFnLT5uZF9oZWFkICYmIG5kX3R5cGUo dGFnLT5uZF9oZWFkKSA9PSBOT0RFX1dIRU4pIHsKIAkJCVZBTFVFIHYgPSByYl9ldmFsKHNl bGYsIHRhZy0+bmRfaGVhZC0+bmRfaGVhZCk7CiAJCQlsb25nIGk7CkBAIC0zODc1LDExICsz OTU5LDkgQEAgcmJfZXZhbChzZWxmLCBuKQogCWJyZWFrOwogCiAgICAgICBjYXNlIE5PREVf TkVXTElORToKLQlpZiAodHJhY2VfZnVuYykgewotCSAgICBjYWxsX3RyYWNlX2Z1bmMoImxp bmUiLCBub2RlLCBzZWxmLAotCQkJICAgIHJ1YnlfZnJhbWUtPmxhc3RfZnVuYywKLQkJCSAg ICBydWJ5X2ZyYW1lLT5sYXN0X2NsYXNzKTsKLQl9CisJRVhFQ19FVkVOVF9IT09LKFJVQllf RVZFTlRfTElORSwgbm9kZSwgc2VsZiwgCisJCQlydWJ5X2ZyYW1lLT5sYXN0X2Z1bmMsCisJ CQlydWJ5X2ZyYW1lLT5sYXN0X2NsYXNzKTsKIAlub2RlID0gbm9kZS0+bmRfbmV4dDsKIAln b3RvIGFnYWluOwogCkBAIC0zOTMwLDkgKzQwMTIsOCBAQCBtb2R1bGVfc2V0dXAobW9kdWxl LCBuKQogICAgIFBVU0hfQ1JFRihtb2R1bGUpOwogICAgIFBVU0hfVEFHKFBST1RfTk9ORSk7 CiAgICAgaWYgKChzdGF0ZSA9IEVYRUNfVEFHKCkpID09IDApIHsKLQlpZiAodHJhY2VfZnVu YykgewotCSAgICBjYWxsX3RyYWNlX2Z1bmMoImNsYXNzIiwgbiwgcnVieV9jYmFzZSwgcnVi eV9mcmFtZS0+bGFzdF9mdW5jLCBydWJ5X2ZyYW1lLT5sYXN0X2NsYXNzKTsKLQl9CisJRVhF Q19FVkVOVF9IT09LKFJVQllfRVZFTlRfQ0xBU1MsIG4sIHJ1YnlfY2Jhc2UsCisJCQlydWJ5 X2ZyYW1lLT5sYXN0X2Z1bmMsIHJ1YnlfZnJhbWUtPmxhc3RfY2xhc3MpOwogCXJlc3VsdCA9 IHJiX2V2YWwocnVieV9jYmFzZSwgbm9kZS0+bmRfbmV4dCk7CiAgICAgfQogICAgIFBPUF9U QUcoKTsKQEAgLTM5NDIsOSArNDAyMyw4IEBAIG1vZHVsZV9zZXR1cChtb2R1bGUsIG4pCiAg ICAgUE9QX0NMQVNTKCk7CiAKICAgICBydWJ5X2ZyYW1lID0gZnJhbWUudG1wOwotICAgIGlm ICh0cmFjZV9mdW5jKSB7Ci0JY2FsbF90cmFjZV9mdW5jKCJlbmQiLCBuLCAwLCBydWJ5X2Zy YW1lLT5sYXN0X2Z1bmMsIHJ1YnlfZnJhbWUtPmxhc3RfY2xhc3MpOwotICAgIH0KKyAgICBF WEVDX0VWRU5UX0hPT0soUlVCWV9FVkVOVF9FTkQsIG4sIDAsCisJCSAgICBydWJ5X2ZyYW1l LT5sYXN0X2Z1bmMsIHJ1YnlfZnJhbWUtPmxhc3RfY2xhc3MpOwogICAgIGlmIChzdGF0ZSkg SlVNUF9UQUcoc3RhdGUpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQzMzksOCArNDQx OSw4IEBAIHJiX2xvbmdqbXAodGFnLCBtZXNnKQogICAgIH0KIAogICAgIHJiX3RyYXBfcmVz dG9yZV9tYXNrKCk7Ci0gICAgaWYgKHRyYWNlX2Z1bmMgJiYgdGFnICE9IFRBR19GQVRBTCkg ewotCWNhbGxfdHJhY2VfZnVuYygicmFpc2UiLCBydWJ5X2N1cnJlbnRfbm9kZSwKKyAgICBp ZiAodGFnICE9IFRBR19GQVRBTCkgeworCUVYRUNfRVZFTlRfSE9PSyhSVUJZX0VWRU5UX1JB SVNFLCBydWJ5X2N1cnJlbnRfbm9kZSwKIAkJCXJ1YnlfZnJhbWUtPnNlbGYsCiAJCQlydWJ5 X2ZyYW1lLT5sYXN0X2Z1bmMsCiAJCQlydWJ5X2ZyYW1lLT5sYXN0X2NsYXNzKTsKQEAgLTU1 MDYsMTcgKzU1ODYsMTkgQEAgcmJfY2FsbDAoa2xhc3MsIHJlY3YsIGlkLCBvaWQsIGFyZ2Ms IGFyZwogCQlyYl9idWcoImJhZCBhcmdjICglZCkgc3BlY2lmaWVkIGZvciBgJXMoJXMpJyIs CiAJCSAgICAgICBsZW4sIHJiX2NsYXNzMm5hbWUoa2xhc3MpLCByYl9pZDJuYW1lKGlkKSk7 CiAJICAgIH0KLQkgICAgaWYgKHRyYWNlX2Z1bmMpIHsKKwkgICAgaWYgKGV2ZW50X2hvb2tz KSB7CiAJCWludCBzdGF0ZTsKIAotCQljYWxsX3RyYWNlX2Z1bmMoImMtY2FsbCIsIHJ1Ynlf Y3VycmVudF9ub2RlLCByZWN2LCBpZCwga2xhc3MpOworCQlFWEVDX0VWRU5UX0hPT0soUlVC WV9FVkVOVF9DX0NBTEwsIHJ1YnlfY3VycmVudF9ub2RlLAorCQkJCXJlY3YsIGlkLCBrbGFz cyk7CiAJCVBVU0hfVEFHKFBST1RfRlVOQyk7CiAJCWlmICgoc3RhdGUgPSBFWEVDX1RBRygp KSA9PSAwKSB7CiAJCSAgICByZXN1bHQgPSBjYWxsX2NmdW5jKGJvZHktPm5kX2NmbmMsIHJl Y3YsIGxlbiwgYXJnYywgYXJndik7CiAJCX0KIAkJUE9QX1RBRygpOwogCQlydWJ5X2N1cnJl bnRfbm9kZSA9IHJ1YnlfZnJhbWUtPm5vZGU7Ci0JCWNhbGxfdHJhY2VfZnVuYygiYy1yZXR1 cm4iLCBydWJ5X2N1cnJlbnRfbm9kZSwgcmVjdiwgaWQsIGtsYXNzKTsKKwkJRVhFQ19FVkVO VF9IT09LKFJVQllfRVZFTlRfQ19SRVRVUk4sIHJ1YnlfY3VycmVudF9ub2RlLAorCQkJCXJl Y3YsIGlkLCBrbGFzcyk7CiAJCWlmIChzdGF0ZSkgSlVNUF9UQUcoc3RhdGUpOwogCSAgICB9 CiAJICAgIGVsc2UgewpAQCAtNTY0NSw5ICs1NzI3LDcgQEAgcmJfY2FsbDAoa2xhc3MsIHJl Y3YsIGlkLCBvaWQsIGFyZ2MsIGFyZwogCQkgICAgfQogCQl9CiAKLQkJaWYgKHRyYWNlX2Z1 bmMpIHsKLQkJICAgIGNhbGxfdHJhY2VfZnVuYygiY2FsbCIsIGIyLCByZWN2LCBpZCwga2xh c3MpOwotCQl9CisJCUVYRUNfRVZFTlRfSE9PSyhSVUJZX0VWRU5UX0NBTEwsIGIyLCByZWN2 LCBpZCwga2xhc3MpOwogCQlyZXN1bHQgPSByYl9ldmFsKHJlY3YsIGJvZHkpOwogCSAgICB9 CiAJICAgIGVsc2UgaWYgKHN0YXRlID09IFRBR19SRVRVUk4gJiYgVEFHX0RTVCgpKSB7CkBA IC01NjU5LDkgKzU3MzksOCBAQCByYl9jYWxsMChrbGFzcywgcmVjdiwgaWQsIG9pZCwgYXJn YywgYXJnCiAJICAgIFBPUF9DTEFTUygpOwogCSAgICBQT1BfU0NPUEUoKTsKIAkgICAgcnVi eV9jcmVmID0gc2F2ZWRfY3JlZjsKLQkgICAgaWYgKHRyYWNlX2Z1bmMpIHsKLQkJY2FsbF90 cmFjZV9mdW5jKCJyZXR1cm4iLCBydWJ5X2ZyYW1lLT5wcmV2LT5ub2RlLCByZWN2LCBpZCwg a2xhc3MpOwotCSAgICB9CisJICAgIEVYRUNfRVZFTlRfSE9PSyhSVUJZX0VWRU5UX1JFVFVS TiwgcnVieV9mcmFtZS0+cHJldi0+bm9kZSwKKwkJCSAgICByZWN2LCBpZCwga2xhc3MpOwog CSAgICBzd2l0Y2ggKHN0YXRlKSB7CiAJICAgICAgY2FzZSAwOgogCQlicmVhazsKSW5kZXg6 IG5vZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvdmFyL2N2cy9zcmMvcnVieS9ub2Rl LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNTAuMi4yCmRpZmYgLXUgLXAgLXIxLjUwLjIu MiBub2RlLmgKLS0tIG5vZGUuaAkyIE9jdCAyMDA0IDExOjM0OjI5IC0wMDAwCTEuNTAuMi4y CisrKyBub2RlLmgJMTUgTWFyIDIwMDUgMDg6MDg6MDcgLTAwMDAKQEAgLTM1OSw2ICszNTks MjMgQEAgVkFMVUUgcmJfZ3Zhcl9nZXQgXygoc3RydWN0IGdsb2JhbF9lbnRyeQogVkFMVUUg cmJfZ3Zhcl9zZXQgXygoc3RydWN0IGdsb2JhbF9lbnRyeSAqLCBWQUxVRSkpOwogVkFMVUUg cmJfZ3Zhcl9kZWZpbmVkIF8oKHN0cnVjdCBnbG9iYWxfZW50cnkgKikpOwogCit0eXBlZGVm IHVuc2lnbmVkIGludCByYl9ldmVudF90OworCisjZGVmaW5lIFJVQllfRVZFTlRfTk9ORSAg ICAgMHgwMAorI2RlZmluZSBSVUJZX0VWRU5UX0xJTkUgICAgIDB4MDEKKyNkZWZpbmUgUlVC WV9FVkVOVF9DTEFTUyAgICAweDAyCisjZGVmaW5lIFJVQllfRVZFTlRfRU5EICAgICAgMHgw NAorI2RlZmluZSBSVUJZX0VWRU5UX0NBTEwgICAgIDB4MDgKKyNkZWZpbmUgUlVCWV9FVkVO VF9SRVRVUk4gICAweDEwCisjZGVmaW5lIFJVQllfRVZFTlRfQ19DQUxMICAgMHgyMAorI2Rl ZmluZSBSVUJZX0VWRU5UX0NfUkVUVVJOIDB4NDAKKyNkZWZpbmUgUlVCWV9FVkVOVF9SQUlT RSAgICAweDgwCisjZGVmaW5lIFJVQllfRVZFTlRfQUxMICAgICAgMHhmZgorCit0eXBlZGVm IHZvaWQgKCpyYl9ldmVudF9ob29rX2Z1bmNfdClfKChyYl9ldmVudF90LE5PREUqLFZBTFVF LElELFZBTFVFKSk7Cit2b2lkIHJiX2FkZF9ldmVudF9ob29rKHJiX2V2ZW50X2hvb2tfZnVu Y190LHJiX2V2ZW50X3QpOworaW50IHJiX3JlbW92ZV9ldmVudF9ob29rKHJiX2V2ZW50X2hv b2tfZnVuY190KTsKKwogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9ICAvKiBleHRlcm4g IkMiIHsgKi8KICNlbmRpZgo= --------------040103030603090702020007--