<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>30141</bug_id>
          
          <creation_ts>2009-10-06 13:38:08 -0700</creation_ts>
          <short_desc>Make AtomicString construct StringImpls in single malloc blocks</short_desc>
          <delta_ts>2009-10-08 14:43:53 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jens Alfke">jens</reporter>
          <assigned_to name="David Levin">levin</assigned_to>
          <cc>darin</cc>
    
    <cc>levin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>152848</commentid>
    <comment_count>0</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-06 13:38:08 -0700</bug_when>
    <thetext>When AtomicString creates StringImpls, it calls &apos;new StringImpl(....)&apos;, which ends up allocating two heap blocks (one for the StringImpl object, the other for the character buffer.) It&apos;s very easy to change this to call &apos;StringImpl::create(...)&apos; instead, which allocates the string and buffer in a single block.

This saves the time of an extra malloc call, and the overhead of the block header (~20 bytes on OS X, IIRC.) It also improves locality of reference.

I have a patch for this, but it depends on the patch for bug 29500 so I&apos;ll wait for that one to get submitted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153429</commentid>
    <comment_count>1</comment_count>
      <attachid>40887</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-08 10:14:01 -0700</bug_when>
    <thetext>Created attachment 40887
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153436</commentid>
    <comment_count>2</comment_count>
      <attachid>40887</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-08 10:31:22 -0700</bug_when>
    <thetext>Comment on attachment 40887
patch

&gt; +        Make AtomicString create its StringImpl via create(), not the constructor,
&gt; +        so it gets allocated in a single heap block, saving memory and CPU cycles.

Beautiful!

&gt; +        This eliminates two StringImpl constructors, making the remaining ones
&gt; +        unambiguous, so the &quot;AdoptBuffer&quot; parameter is no longer needed.

The behavior of this constructor is a bit unconventional because it takes ownership of a buffer, but I guess that&apos;s OK because it&apos;s private. We should have a comment in the header making it clear that it adopts the buffer, though; this would be completely unclear if reading the header.

&gt; +        Added const attribute to UChar* in StringImpl constructor, eliminating the
&gt; +        need for several const_casts in calls to it.

Great!

It is a bit strange to have a function take ownership of a buffer but be given a const UChar* to it. But I guess the comment could clarify that sufficiently.

&gt; +        StringImpl also unfriends AtomicString (OMG drama!!!)

Superb!

But since nobody else needs access to the setHash or setInTable functions, is having those functions be public better than having AtomicString be a friend?

&gt; -        location = new StringImpl(c, strlen(c), hash); 
&gt; +        location = StringImpl::create(c).releaseRef(); 
&gt; +        location-&gt;setHash(hash);
&gt; +        location-&gt;setInTable();

Seems slightly unfortunate to set the hash twice and to set the in-table bit first to 0 and then to 1. Any clean way to avoid that?

On a related note, maybe the best thing here would be to have two create functions specifically intended for AtomicString&apos;s use instead of having the code here in AtomicString.cpp? Could we then eliminate both setHash and setInTable? I think that would be good.

&gt; +    void setHash(unsigned hash) {ASSERT(!m_hash); m_hash = hash;}

I don&apos;t think it was worthwhile to add this public function that is an error for anyone except AtomicString to use just so AtomicString doesn&apos;t have to be a friend. Please consider my suggestion above about how to avoid it.

You need some spaces inside the braces here.

review- but this seems almost right!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153466</commentid>
    <comment_count>3</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-08 12:04:11 -0700</bug_when>
    <thetext>&gt;On a related note, maybe the best thing here would be to have two create
&gt;functions specifically intended for AtomicString&apos;s use instead of having the
&gt;code here in AtomicString.cpp? Could we then eliminate both setHash and
&gt;setInTable? I think that would be good.

I actually had it that way at first, but it took significantly more code (had to add a hash parameter to the constructor and createUninitialized and two of the create methods, then create public create methods that don&apos;t take the hash and call through with zero.)

I just changed it back after your comment, but looking at it, I think this ends up taking more cycles than setting m_hash twice, due to the extra hash parameter being passed around through several levels of call stack on every StringImpl creation.

The existing code was already setting the flags twice via a call to setInTable, because they&apos;re always initialized to zero (which is free as a side effect of copying the pointer.)

It&apos;s not possible to eliminate setInTable because AtomicString::add(StringImpl*) has to call it. Given that, I prefer to have the other calls to setInTable in AtomicString.cpp, because that&apos;s the code that manages the table.

I just noticed that setHash can be made private, since only the friended XXXTranslator classes ever call it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153481</commentid>
    <comment_count>4</comment_count>
      <attachid>40900</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-08 12:29:34 -0700</bug_when>
    <thetext>Created attachment 40900
patch 2

- Made setHash private, since it only needs to be called by the friend XXXTranslator classes.
- Added whitespace in setHash definition.
- Added explanatory comment about the StringImpl ctor.

After investigating I decided against Darin&apos;s suggestion of customized create methods, because it introduced more code, including passing a hash parameter through several layers of method calls, which I think cancels out any win from only initializing the member once. (See my previous comment.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153501</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-08 13:21:02 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; I just changed it back after your comment, but looking at it, I think this ends
&gt; up taking more cycles than setting m_hash twice, due to the extra hash
&gt; parameter being passed around through several levels of call stack on every
&gt; StringImpl creation.

Typically the way to avoid this is inlining, but I accept your explanation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153533</commentid>
    <comment_count>6</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-10-08 14:19:12 -0700</bug_when>
    <thetext>Assigned to Levin to landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153545</commentid>
    <comment_count>7</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-10-08 14:43:53 -0700</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/49322</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40887</attachid>
            <date>2009-10-08 10:14:01 -0700</date>
            <delta_ts>2009-10-08 12:29:34 -0700</delta_ts>
            <desc>patch</desc>
            <filename>atomicstring.patch</filename>
            <type>text/plain</type>
            <size>8117</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTMwNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMDktMTAtMDggIEplbnMgQWxma2UgIDxzbmVqQGNocm9taXVtLm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNYWtl
IEF0b21pY1N0cmluZyBjcmVhdGUgaXRzIFN0cmluZ0ltcGwgdmlhIGNyZWF0ZSgpLCBub3QgdGhl
IGNvbnN0cnVjdG9yLAorICAgICAgICBzbyBpdCBnZXRzIGFsbG9jYXRlZCBpbiBhIHNpbmdsZSBo
ZWFwIGJsb2NrLCBzYXZpbmcgbWVtb3J5IGFuZCBDUFUgY3ljbGVzLgorICAgICAgICBUaGlzIGVs
aW1pbmF0ZXMgdHdvIFN0cmluZ0ltcGwgY29uc3RydWN0b3JzLCBtYWtpbmcgdGhlIHJlbWFpbmlu
ZyBvbmVzCisgICAgICAgIHVuYW1iaWd1b3VzLCBzbyB0aGUgIkFkb3B0QnVmZmVyIiBwYXJhbWV0
ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAgQWRkZWQgY29uc3QgYXR0cmlidXRlIHRv
IFVDaGFyKiBpbiBTdHJpbmdJbXBsIGNvbnN0cnVjdG9yLCBlbGltaW5hdGluZyB0aGUKKyAgICAg
ICAgbmVlZCBmb3Igc2V2ZXJhbCBjb25zdF9jYXN0cyBpbiBjYWxscyB0byBpdC4KKyAgICAgICAg
U3RyaW5nSW1wbCBhbHNvIHVuZnJpZW5kcyBBdG9taWNTdHJpbmcgKE9NRyBkcmFtYSEhISkKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMwMTQxCisKKyAg
ICAgICAgKiBwbGF0Zm9ybS90ZXh0L0F0b21pY1N0cmluZy5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDU3RyaW5nVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogQ2FsbCBTdHJpbmdJbXBsOjpjcmVhdGUo
KS4KKyAgICAgICAgKFdlYkNvcmU6OlVDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I6OnRy
YW5zbGF0ZSk6IERpdHRvLgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpTdHJpbmdJbXBsKTogUmVtb3ZlIHVubmVj
ZXNzYXJ5IEFkb3B0QnVmZmVyIHBhcmFtLgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6
YWRvcHQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5p
dGlhbGl6ZWQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6OmNyZWF0ZSk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6Y3Jvc3NUaHJlYWRTdHJpbmcp
OiBEaXR0by4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaDoKKyAgICAgICAg
KFdlYkNvcmU6OlN0cmluZ0ltcGw6OnNldEhhc2gpOiBVc2VkIGJ5IEF0b21pY1N0cmluZyB3aGVu
IGNyZWF0aW5nIFN0cmluZ0ltcGxzLgorCiAyMDA5LTEwLTA4ICBEaXJrIFNjaHVsemUgIDxrcml0
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmNwcAkocmV2aXNpb24gNDkzMDUpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NjUsNyArNjUsOSBAQCBzdHJ1Y3QgQ1N0cmluZ1RyYW5zbGF0b3IgewogCiAgICAgc3RhdGljIHZv
aWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgY2hhciogY29uc3QmIGMs
IHVuc2lnbmVkIGhhc2gpCiAgICAgewotICAgICAgICBsb2NhdGlvbiA9IG5ldyBTdHJpbmdJbXBs
KGMsIHN0cmxlbihjKSwgaGFzaCk7IAorICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0ltcGw6OmNy
ZWF0ZShjKS5yZWxlYXNlUmVmKCk7IAorICAgICAgICBsb2NhdGlvbi0+c2V0SGFzaChoYXNoKTsK
KyAgICAgICAgbG9jYXRpb24tPnNldEluVGFibGUoKTsKICAgICB9CiB9OwogCkBAIC0xNDAsNyAr
MTQyLDkgQEAgc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvciB7CiAKICAgICBzdGF0aWMgdm9p
ZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBVQ2hhckJ1ZmZlciYgYnVm
LCB1bnNpZ25lZCBoYXNoKQogICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSBuZXcgU3RyaW5nSW1w
bChidWYucywgYnVmLmxlbmd0aCwgaGFzaCk7IAorICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0lt
cGw6OmNyZWF0ZShidWYucywgYnVmLmxlbmd0aCkucmVsZWFzZVJlZigpOyAKKyAgICAgICAgbG9j
YXRpb24tPnNldEhhc2goaGFzaCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRJblRhYmxlKCk7CiAg
ICAgfQogfTsKIApAQCAtMTY0LDcgKzE2OCw5IEBAIHN0cnVjdCBIYXNoQW5kQ2hhcmFjdGVyc1Ry
YW5zbGF0b3IgewogCiAgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2Nh
dGlvbiwgY29uc3QgSGFzaEFuZENoYXJhY3RlcnMmIGJ1ZmZlciwgdW5zaWduZWQgaGFzaCkKICAg
ICB7Ci0gICAgICAgIGxvY2F0aW9uID0gbmV3IFN0cmluZ0ltcGwoYnVmZmVyLmNoYXJhY3RlcnMs
IGJ1ZmZlci5sZW5ndGgsIGhhc2gpOyAKKyAgICAgICAgbG9jYXRpb24gPSBTdHJpbmdJbXBsOjpj
cmVhdGUoYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpLnJlbGVhc2VSZWYoKTsKKyAg
ICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRJblRh
YmxlKCk7CiAgICAgfQogfTsKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0lt
cGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNw
cAkocmV2aXNpb24gNDkzMDUpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTg5LDcgKzg5LDcgQEAgU3RyaW5nSW1wbDo6U3RyaW5nSW1w
bCgpCiAgICAgaGFzaCgpOwogfQogCi1pbmxpbmUgU3RyaW5nSW1wbDo6U3RyaW5nSW1wbChVQ2hh
ciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoLCBBZG9wdEJ1ZmZlcikKK2lubGluZSBTdHJp
bmdJbXBsOjpTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5n
dGgpCiAgICAgOiBtX2RhdGEoY2hhcmFjdGVycykKICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKICAg
ICAsIG1faGFzaCgwKQpAQCAtOTgsNDEgKzk4LDYgQEAgaW5saW5lIFN0cmluZ0ltcGw6OlN0cmlu
Z0ltcGwoVUNoYXIqIGNoYQogICAgIEFTU0VSVChsZW5ndGgpOwogfQogCi0vLyBUaGlzIGNvbnN0
cnVjdG9yIGlzIG9ubHkgZm9yIHVzZSBieSBBdG9taWNTdHJpbmcuCi1TdHJpbmdJbXBsOjpTdHJp
bmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVk
IGhhc2gpCi0gICAgOiBtX2RhdGEoMCkKLSAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKLSAgICAsIG1f
aGFzaChoYXNoKQotewotICAgIEFTU0VSVChoYXNoKTsKLSAgICBBU1NFUlQoY2hhcmFjdGVycyk7
Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0KLSAgICBzZXRJblRhYmxlKCk7Ci0gICAgVUNoYXIqIGRh
dGEgPSBuZXdVQ2hhclZlY3RvcihsZW5ndGgpOwotICAgIG1lbWNweShkYXRhLCBjaGFyYWN0ZXJz
LCBsZW5ndGggKiBzaXplb2YoVUNoYXIpKTsKLSAgICBtX2RhdGEgPSBkYXRhOwotfQotCi0vLyBU
aGlzIGNvbnN0cnVjdG9yIGlzIG9ubHkgZm9yIHVzZSBieSBBdG9taWNTdHJpbmcuCi1TdHJpbmdJ
bXBsOjpTdHJpbmdJbXBsKGNvbnN0IGNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCwg
dW5zaWduZWQgaGFzaCkKLSAgICA6IG1fZGF0YSgwKQotICAgICwgbV9sZW5ndGgobGVuZ3RoKQot
ICAgICwgbV9oYXNoKGhhc2gpCi17Ci0gICAgQVNTRVJUKGhhc2gpOwotICAgIEFTU0VSVChjaGFy
YWN0ZXJzKTsKLSAgICBBU1NFUlQobGVuZ3RoKTsKLQotICAgIHNldEluVGFibGUoKTsKLSAgICBV
Q2hhciogZGF0YSA9IG5ld1VDaGFyVmVjdG9yKGxlbmd0aCk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSAhPSBsZW5ndGg7ICsraSkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBjaGFy
YWN0ZXJzW2ldOwotICAgICAgICBkYXRhW2ldID0gYzsKLSAgICB9Ci0gICAgbV9kYXRhID0gZGF0
YTsKLX0KLQogU3RyaW5nSW1wbDo6flN0cmluZ0ltcGwoKQogewogICAgIGlmIChpblRhYmxlKCkp
CkBAIC05MzMsNyArODk4LDcgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjph
ZG9wdAogICAgIHVuc2lnbmVkIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKICAgICBpZiAobGVu
Z3RoID09IDApCiAgICAgICAgIHJldHVybiBlbXB0eSgpOwotICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgU3RyaW5nSW1wbChidWZmZXIucmVsZWFzZSgpLCBsZW5ndGgsIEFkb3B0QnVmZmVyKCkpKTsK
KyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmluZ0ltcGwoYnVmZmVyLnJlbGVhc2UoKSwgbGVu
Z3RoKSk7CiB9CiAKIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6YWRvcHQoVmVj
dG9yPFVDaGFyPiYgdmVjdG9yKQpAQCAtOTQxLDcgKzkwNiw3IEBAIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gU3RyaW5nSW1wbDo6YWRvcHQKICAgICBzaXplX3Qgc2l6ZSA9IHZlY3Rvci5zaXplKCk7
CiAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBTdHJpbmdJbXBsKHZlY3Rvci5yZWxlYXNlQnVmZmVyKCksIHNpemUsIEFk
b3B0QnVmZmVyKCkpKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmluZ0ltcGwodmVjdG9y
LnJlbGVhc2VCdWZmZXIoKSwgc2l6ZSkpOwogfQogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0
cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hhciomIGRh
dGEpCkBAIC05NTcsNyArOTIyLDcgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBs
OjpjcmVhdAogICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKFN0cmluZ0ltcGwpICsgbGVuZ3RoICog
c2l6ZW9mKFVDaGFyKTsKICAgICBTdHJpbmdJbXBsKiBzdHJpbmcgPSBzdGF0aWNfY2FzdDxTdHJp
bmdJbXBsKj4oZmFzdE1hbGxvYyhzaXplKSk7CiAgICAgZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
VUNoYXIqPihzdHJpbmcgKyAxKTsKLSAgICBzdHJpbmcgPSBuZXcgKHN0cmluZykgU3RyaW5nSW1w
bChkYXRhLCBsZW5ndGgsIEFkb3B0QnVmZmVyKCkpOworICAgIHN0cmluZyA9IG5ldyAoc3RyaW5n
KSBTdHJpbmdJbXBsKGRhdGEsIGxlbmd0aCk7CiAgICAgcmV0dXJuIGFkb3B0UmVmKHN0cmluZyk7
CiB9CiAKQEAgLTk5OCw3ICs5NjMsNyBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0lt
cGw6OmNyZWF0CiB7CiAgICAgU2hhcmVkVUNoYXIqIHNoYXJlZEJ1ZmZlciA9IGNvbnN0X2Nhc3Q8
SlNDOjpVU3RyaW5nKj4oJnN0ciktPnJlcCgpLT5zaGFyZWRCdWZmZXIoKTsKICAgICBpZiAoc2hh
cmVkQnVmZmVyKSB7Ci0gICAgICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gaW1wbCA9IGFkb3B0
UmVmKG5ldyBTdHJpbmdJbXBsKGNvbnN0X2Nhc3Q8VUNoYXIqPihzdHIuZGF0YSgpKSwgc3RyLnNp
emUoKSwgQWRvcHRCdWZmZXIoKSkpOworICAgICAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGlt
cGwgPSBhZG9wdFJlZihuZXcgU3RyaW5nSW1wbChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKSk7CiAg
ICAgICAgIHNoYXJlZEJ1ZmZlci0+cmVmKCk7CiAgICAgICAgIGltcGwtPm1fc2hhcmVkQnVmZmVy
QW5kRmxhZ3Muc2V0KHNoYXJlZEJ1ZmZlcik7CiAgICAgICAgIHJldHVybiBpbXBsOwpAQCAtMTA0
Myw3ICsxMDA4LDcgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcm9zcwog
ewogICAgIFNoYXJlZFVDaGFyKiBzaGFyZWQgPSBzaGFyZWRCdWZmZXIoKTsKICAgICBpZiAoc2hh
cmVkKSB7Ci0gICAgICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBpbXBsID0gYWRvcHRSZWYobmV3IFN0
cmluZ0ltcGwoY29uc3RfY2FzdDxVQ2hhcio+KG1fZGF0YSksIG1fbGVuZ3RoLCBBZG9wdEJ1ZmZl
cigpKSk7CisgICAgICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBpbXBsID0gYWRvcHRSZWYobmV3IFN0
cmluZ0ltcGwobV9kYXRhLCBtX2xlbmd0aCkpOwogICAgICAgICBpbXBsLT5tX3NoYXJlZEJ1ZmZl
ckFuZEZsYWdzLnNldChzaGFyZWQtPmNyb3NzVGhyZWFkQ29weSgpLnJlbGVhc2VSZWYoKSk7CiAg
ICAgICAgIHJldHVybiBpbXBsLnJlbGVhc2UoKTsKICAgICB9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL3RleHQvU3RyaW5nSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4
dC9TdHJpbmdJbXBsLmgJKHJldmlzaW9uIDQ5MzA1KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0
L1N0cmluZ0ltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsNiBAQCB0eXBlZGVmIGNv
bnN0IHN0cnVjdCBfX0NGU3RyaW5nICogQ0ZTdHJpCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAot
Y2xhc3MgQXRvbWljU3RyaW5nOwogY2xhc3MgU3RyaW5nQnVmZmVyOwogCiBzdHJ1Y3QgQ1N0cmlu
Z1RyYW5zbGF0b3I7CkBAIC02MCwyMCArNTksMTMgQEAgZW51bSBUZXh0Q2FzZVNlbnNpdGl2aXR5
IHsgVGV4dENhc2VTZW5zaQogdHlwZWRlZiBib29sICgqQ2hhcmFjdGVyTWF0Y2hGdW5jdGlvblB0
cikoVUNoYXIpOwogCiBjbGFzcyBTdHJpbmdJbXBsIDogcHVibGljIFJlZkNvdW50ZWQ8U3RyaW5n
SW1wbD4gewotICAgIGZyaWVuZCBjbGFzcyBBdG9taWNTdHJpbmc7CiAgICAgZnJpZW5kIHN0cnVj
dCBDU3RyaW5nVHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0IEhhc2hBbmRDaGFyYWN0ZXJz
VHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKIHBy
aXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIFRocmVhZEdsb2JhbERhdGE7CiAgICAgU3RyaW5nSW1w
bCgpOwotCi0gICAgc3RydWN0IEFkb3B0QnVmZmVyIHsgfTsKLSAgICBTdHJpbmdJbXBsKFVDaGFy
KiwgdW5zaWduZWQgbGVuZ3RoLCBBZG9wdEJ1ZmZlcik7Ci0KLSAgICAvLyBGb3IgQXRvbWljU3Ry
aW5nLgotICAgIFN0cmluZ0ltcGwoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2ln
bmVkIGhhc2gpOwotICAgIFN0cmluZ0ltcGwoY29uc3QgY2hhciosIHVuc2lnbmVkIGxlbmd0aCwg
dW5zaWduZWQgaGFzaCk7CisgICAgU3RyaW5nSW1wbChjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxl
bmd0aCk7CiAKICAgICB0eXBlZGVmIENyb3NzVGhyZWFkUmVmQ291bnRlZDxPd25GYXN0TWFsbG9j
UHRyPFVDaGFyPiA+IFNoYXJlZFVDaGFyOwogCkBAIC0xMDgsNiArMTAwLDcgQEAgcHVibGljOgog
ICAgIHVuc2lnbmVkIGV4aXN0aW5nSGFzaCgpIGNvbnN0IHsgQVNTRVJUKG1faGFzaCk7IHJldHVy
biBtX2hhc2g7IH0KICAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUhhc2goY29uc3QgVUNoYXIq
LCB1bnNpZ25lZCBsZW4pOwogICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlSGFzaChjb25zdCBj
aGFyKik7CisgICAgdm9pZCBzZXRIYXNoKHVuc2lnbmVkIGhhc2gpIHtBU1NFUlQoIW1faGFzaCk7
IG1faGFzaCA9IGhhc2g7fQogICAgIAogICAgIC8vIFJldHVybnMgYSBTdHJpbmdJbXBsIHN1aXRh
YmxlIGZvciB1c2Ugb24gYW5vdGhlciB0aHJlYWQuCiAgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiBjcm9zc1RocmVhZFN0cmluZygpOwo=
</data>
<flag name="review"
          id="22175"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40900</attachid>
            <date>2009-10-08 12:29:34 -0700</date>
            <delta_ts>2009-10-08 13:23:28 -0700</delta_ts>
            <desc>patch 2</desc>
            <filename>atomicstring.patch</filename>
            <type>text/plain</type>
            <size>7934</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTMwNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMDktMTAtMDggIEplbnMgQWxma2UgIDxzbmVqQGNocm9taXVtLm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNYWtl
IEF0b21pY1N0cmluZyBjcmVhdGUgaXRzIFN0cmluZ0ltcGwgdmlhIGNyZWF0ZSgpLCBub3QgdGhl
IGNvbnN0cnVjdG9yLAorICAgICAgICBzbyBpdCBnZXRzIGFsbG9jYXRlZCBpbiBhIHNpbmdsZSBo
ZWFwIGJsb2NrLCBzYXZpbmcgbWVtb3J5IGFuZCBDUFUgY3ljbGVzLgorICAgICAgICBUaGlzIGVs
aW1pbmF0ZXMgdHdvIFN0cmluZ0ltcGwgY29uc3RydWN0b3JzLCBtYWtpbmcgdGhlIHJlbWFpbmlu
ZyBvbmVzCisgICAgICAgIHVuYW1iaWd1b3VzLCBzbyB0aGUgIkFkb3B0QnVmZmVyIiBwYXJhbWV0
ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAgQWRkZWQgY29uc3QgYXR0cmlidXRlIHRv
IFVDaGFyKiBpbiBTdHJpbmdJbXBsIGNvbnN0cnVjdG9yLCBlbGltaW5hdGluZyB0aGUKKyAgICAg
ICAgbmVlZCBmb3Igc2V2ZXJhbCBjb25zdF9jYXN0cyBpbiBjYWxscyB0byBpdC4KKyAgICAgICAg
U3RyaW5nSW1wbCBhbHNvIHVuZnJpZW5kcyBBdG9taWNTdHJpbmcgKE9NRyBkcmFtYSEhISkKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMwMTQxCisKKyAg
ICAgICAgKiBwbGF0Zm9ybS90ZXh0L0F0b21pY1N0cmluZy5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDU3RyaW5nVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTogQ2FsbCBTdHJpbmdJbXBsOjpjcmVhdGUo
KS4KKyAgICAgICAgKFdlYkNvcmU6OlVDaGFyQnVmZmVyVHJhbnNsYXRvcjo6dHJhbnNsYXRlKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I6OnRy
YW5zbGF0ZSk6IERpdHRvLgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpTdHJpbmdJbXBsKTogUmVtb3ZlIHVubmVj
ZXNzYXJ5IEFkb3B0QnVmZmVyIHBhcmFtLgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6
YWRvcHQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5p
dGlhbGl6ZWQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6OmNyZWF0ZSk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6Y3Jvc3NUaHJlYWRTdHJpbmcp
OiBEaXR0by4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaDoKKyAgICAgICAg
KFdlYkNvcmU6OlN0cmluZ0ltcGw6OnNldEhhc2gpOiBVc2VkIGJ5IEF0b21pY1N0cmluZyB3aGVu
IGNyZWF0aW5nIFN0cmluZ0ltcGxzLgorCiAyMDA5LTEwLTA4ICBEaXJrIFNjaHVsemUgIDxrcml0
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmNwcAkocmV2aXNpb24gNDkzMDUpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRvbWljU3RyaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NjUsNyArNjUsOSBAQCBzdHJ1Y3QgQ1N0cmluZ1RyYW5zbGF0b3IgewogCiAgICAgc3RhdGljIHZv
aWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3QgY2hhciogY29uc3QmIGMs
IHVuc2lnbmVkIGhhc2gpCiAgICAgewotICAgICAgICBsb2NhdGlvbiA9IG5ldyBTdHJpbmdJbXBs
KGMsIHN0cmxlbihjKSwgaGFzaCk7IAorICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0ltcGw6OmNy
ZWF0ZShjKS5yZWxlYXNlUmVmKCk7IAorICAgICAgICBsb2NhdGlvbi0+c2V0SGFzaChoYXNoKTsK
KyAgICAgICAgbG9jYXRpb24tPnNldEluVGFibGUoKTsKICAgICB9CiB9OwogCkBAIC0xNDAsNyAr
MTQyLDkgQEAgc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvciB7CiAKICAgICBzdGF0aWMgdm9p
ZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBVQ2hhckJ1ZmZlciYgYnVm
LCB1bnNpZ25lZCBoYXNoKQogICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSBuZXcgU3RyaW5nSW1w
bChidWYucywgYnVmLmxlbmd0aCwgaGFzaCk7IAorICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0lt
cGw6OmNyZWF0ZShidWYucywgYnVmLmxlbmd0aCkucmVsZWFzZVJlZigpOyAKKyAgICAgICAgbG9j
YXRpb24tPnNldEhhc2goaGFzaCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRJblRhYmxlKCk7CiAg
ICAgfQogfTsKIApAQCAtMTY0LDcgKzE2OCw5IEBAIHN0cnVjdCBIYXNoQW5kQ2hhcmFjdGVyc1Ry
YW5zbGF0b3IgewogCiAgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2Nh
dGlvbiwgY29uc3QgSGFzaEFuZENoYXJhY3RlcnMmIGJ1ZmZlciwgdW5zaWduZWQgaGFzaCkKICAg
ICB7Ci0gICAgICAgIGxvY2F0aW9uID0gbmV3IFN0cmluZ0ltcGwoYnVmZmVyLmNoYXJhY3RlcnMs
IGJ1ZmZlci5sZW5ndGgsIGhhc2gpOyAKKyAgICAgICAgbG9jYXRpb24gPSBTdHJpbmdJbXBsOjpj
cmVhdGUoYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpLnJlbGVhc2VSZWYoKTsKKyAg
ICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7CisgICAgICAgIGxvY2F0aW9uLT5zZXRJblRh
YmxlKCk7CiAgICAgfQogfTsKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0lt
cGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNw
cAkocmV2aXNpb24gNDkzMDUpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTg5LDcgKzg5LDcgQEAgU3RyaW5nSW1wbDo6U3RyaW5nSW1w
bCgpCiAgICAgaGFzaCgpOwogfQogCi1pbmxpbmUgU3RyaW5nSW1wbDo6U3RyaW5nSW1wbChVQ2hh
ciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoLCBBZG9wdEJ1ZmZlcikKK2lubGluZSBTdHJp
bmdJbXBsOjpTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5n
dGgpCiAgICAgOiBtX2RhdGEoY2hhcmFjdGVycykKICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKICAg
ICAsIG1faGFzaCgwKQpAQCAtOTgsNDEgKzk4LDYgQEAgaW5saW5lIFN0cmluZ0ltcGw6OlN0cmlu
Z0ltcGwoVUNoYXIqIGNoYQogICAgIEFTU0VSVChsZW5ndGgpOwogfQogCi0vLyBUaGlzIGNvbnN0
cnVjdG9yIGlzIG9ubHkgZm9yIHVzZSBieSBBdG9taWNTdHJpbmcuCi1TdHJpbmdJbXBsOjpTdHJp
bmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVk
IGhhc2gpCi0gICAgOiBtX2RhdGEoMCkKLSAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKLSAgICAsIG1f
aGFzaChoYXNoKQotewotICAgIEFTU0VSVChoYXNoKTsKLSAgICBBU1NFUlQoY2hhcmFjdGVycyk7
Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0KLSAgICBzZXRJblRhYmxlKCk7Ci0gICAgVUNoYXIqIGRh
dGEgPSBuZXdVQ2hhclZlY3RvcihsZW5ndGgpOwotICAgIG1lbWNweShkYXRhLCBjaGFyYWN0ZXJz
LCBsZW5ndGggKiBzaXplb2YoVUNoYXIpKTsKLSAgICBtX2RhdGEgPSBkYXRhOwotfQotCi0vLyBU
aGlzIGNvbnN0cnVjdG9yIGlzIG9ubHkgZm9yIHVzZSBieSBBdG9taWNTdHJpbmcuCi1TdHJpbmdJ
bXBsOjpTdHJpbmdJbXBsKGNvbnN0IGNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCwg
dW5zaWduZWQgaGFzaCkKLSAgICA6IG1fZGF0YSgwKQotICAgICwgbV9sZW5ndGgobGVuZ3RoKQot
ICAgICwgbV9oYXNoKGhhc2gpCi17Ci0gICAgQVNTRVJUKGhhc2gpOwotICAgIEFTU0VSVChjaGFy
YWN0ZXJzKTsKLSAgICBBU1NFUlQobGVuZ3RoKTsKLQotICAgIHNldEluVGFibGUoKTsKLSAgICBV
Q2hhciogZGF0YSA9IG5ld1VDaGFyVmVjdG9yKGxlbmd0aCk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSAhPSBsZW5ndGg7ICsraSkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBjaGFy
YWN0ZXJzW2ldOwotICAgICAgICBkYXRhW2ldID0gYzsKLSAgICB9Ci0gICAgbV9kYXRhID0gZGF0
YTsKLX0KLQogU3RyaW5nSW1wbDo6flN0cmluZ0ltcGwoKQogewogICAgIGlmIChpblRhYmxlKCkp
CkBAIC05MzMsNyArODk4LDcgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjph
ZG9wdAogICAgIHVuc2lnbmVkIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKICAgICBpZiAobGVu
Z3RoID09IDApCiAgICAgICAgIHJldHVybiBlbXB0eSgpOwotICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgU3RyaW5nSW1wbChidWZmZXIucmVsZWFzZSgpLCBsZW5ndGgsIEFkb3B0QnVmZmVyKCkpKTsK
KyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmluZ0ltcGwoYnVmZmVyLnJlbGVhc2UoKSwgbGVu
Z3RoKSk7CiB9CiAKIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6YWRvcHQoVmVj
dG9yPFVDaGFyPiYgdmVjdG9yKQpAQCAtOTQxLDcgKzkwNiw3IEBAIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gU3RyaW5nSW1wbDo6YWRvcHQKICAgICBzaXplX3Qgc2l6ZSA9IHZlY3Rvci5zaXplKCk7
CiAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBTdHJpbmdJbXBsKHZlY3Rvci5yZWxlYXNlQnVmZmVyKCksIHNpemUsIEFk
b3B0QnVmZmVyKCkpKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmluZ0ltcGwodmVjdG9y
LnJlbGVhc2VCdWZmZXIoKSwgc2l6ZSkpOwogfQogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0
cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQodW5zaWduZWQgbGVuZ3RoLCBVQ2hhciomIGRh
dGEpCkBAIC05NTcsNyArOTIyLDcgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBs
OjpjcmVhdAogICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKFN0cmluZ0ltcGwpICsgbGVuZ3RoICog
c2l6ZW9mKFVDaGFyKTsKICAgICBTdHJpbmdJbXBsKiBzdHJpbmcgPSBzdGF0aWNfY2FzdDxTdHJp
bmdJbXBsKj4oZmFzdE1hbGxvYyhzaXplKSk7CiAgICAgZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
VUNoYXIqPihzdHJpbmcgKyAxKTsKLSAgICBzdHJpbmcgPSBuZXcgKHN0cmluZykgU3RyaW5nSW1w
bChkYXRhLCBsZW5ndGgsIEFkb3B0QnVmZmVyKCkpOworICAgIHN0cmluZyA9IG5ldyAoc3RyaW5n
KSBTdHJpbmdJbXBsKGRhdGEsIGxlbmd0aCk7CiAgICAgcmV0dXJuIGFkb3B0UmVmKHN0cmluZyk7
CiB9CiAKQEAgLTk5OCw3ICs5NjMsNyBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0lt
cGw6OmNyZWF0CiB7CiAgICAgU2hhcmVkVUNoYXIqIHNoYXJlZEJ1ZmZlciA9IGNvbnN0X2Nhc3Q8
SlNDOjpVU3RyaW5nKj4oJnN0ciktPnJlcCgpLT5zaGFyZWRCdWZmZXIoKTsKICAgICBpZiAoc2hh
cmVkQnVmZmVyKSB7Ci0gICAgICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gaW1wbCA9IGFkb3B0
UmVmKG5ldyBTdHJpbmdJbXBsKGNvbnN0X2Nhc3Q8VUNoYXIqPihzdHIuZGF0YSgpKSwgc3RyLnNp
emUoKSwgQWRvcHRCdWZmZXIoKSkpOworICAgICAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGlt
cGwgPSBhZG9wdFJlZihuZXcgU3RyaW5nSW1wbChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKSk7CiAg
ICAgICAgIHNoYXJlZEJ1ZmZlci0+cmVmKCk7CiAgICAgICAgIGltcGwtPm1fc2hhcmVkQnVmZmVy
QW5kRmxhZ3Muc2V0KHNoYXJlZEJ1ZmZlcik7CiAgICAgICAgIHJldHVybiBpbXBsOwpAQCAtMTA0
Myw3ICsxMDA4LDcgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcm9zcwog
ewogICAgIFNoYXJlZFVDaGFyKiBzaGFyZWQgPSBzaGFyZWRCdWZmZXIoKTsKICAgICBpZiAoc2hh
cmVkKSB7Ci0gICAgICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBpbXBsID0gYWRvcHRSZWYobmV3IFN0
cmluZ0ltcGwoY29uc3RfY2FzdDxVQ2hhcio+KG1fZGF0YSksIG1fbGVuZ3RoLCBBZG9wdEJ1ZmZl
cigpKSk7CisgICAgICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBpbXBsID0gYWRvcHRSZWYobmV3IFN0
cmluZ0ltcGwobV9kYXRhLCBtX2xlbmd0aCkpOwogICAgICAgICBpbXBsLT5tX3NoYXJlZEJ1ZmZl
ckFuZEZsYWdzLnNldChzaGFyZWQtPmNyb3NzVGhyZWFkQ29weSgpLnJlbGVhc2VSZWYoKSk7CiAg
ICAgICAgIHJldHVybiBpbXBsLnJlbGVhc2UoKTsKICAgICB9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL3RleHQvU3RyaW5nSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4
dC9TdHJpbmdJbXBsLmgJKHJldmlzaW9uIDQ5MzA1KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0
L1N0cmluZ0ltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsNiBAQCB0eXBlZGVmIGNv
bnN0IHN0cnVjdCBfX0NGU3RyaW5nICogQ0ZTdHJpCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAot
Y2xhc3MgQXRvbWljU3RyaW5nOwogY2xhc3MgU3RyaW5nQnVmZmVyOwogCiBzdHJ1Y3QgQ1N0cmlu
Z1RyYW5zbGF0b3I7CkBAIC02MCwyMSArNTksMTkgQEAgZW51bSBUZXh0Q2FzZVNlbnNpdGl2aXR5
IHsgVGV4dENhc2VTZW5zaQogdHlwZWRlZiBib29sICgqQ2hhcmFjdGVyTWF0Y2hGdW5jdGlvblB0
cikoVUNoYXIpOwogCiBjbGFzcyBTdHJpbmdJbXBsIDogcHVibGljIFJlZkNvdW50ZWQ8U3RyaW5n
SW1wbD4gewotICAgIGZyaWVuZCBjbGFzcyBBdG9taWNTdHJpbmc7CiAgICAgZnJpZW5kIHN0cnVj
dCBDU3RyaW5nVHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0IEhhc2hBbmRDaGFyYWN0ZXJz
VHJhbnNsYXRvcjsKICAgICBmcmllbmQgc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKIHBy
aXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIFRocmVhZEdsb2JhbERhdGE7CiAgICAgU3RyaW5nSW1w
bCgpOworICAgIAorICAgIC8vIFRoaXMgYWRvcHRzIHRoZSBVQ2hhciogd2l0aG91dCBjb3B5aW5n
IHRoZSBidWZmZXIuCisgICAgU3RyaW5nSW1wbChjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0
aCk7CiAKLSAgICBzdHJ1Y3QgQWRvcHRCdWZmZXIgeyB9OwotICAgIFN0cmluZ0ltcGwoVUNoYXIq
LCB1bnNpZ25lZCBsZW5ndGgsIEFkb3B0QnVmZmVyKTsKLQotICAgIC8vIEZvciBBdG9taWNTdHJp
bmcuCi0gICAgU3RyaW5nSW1wbChjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWdu
ZWQgaGFzaCk7Ci0gICAgU3RyaW5nSW1wbChjb25zdCBjaGFyKiwgdW5zaWduZWQgbGVuZ3RoLCB1
bnNpZ25lZCBoYXNoKTsKLQorICAgIC8vIEZvciB1c2Ugb25seSBieSBBdG9taWNTdHJpbmcncyBY
WFhUcmFuc2xhdG9yIGhlbHBlcnMuCisgICAgdm9pZCBzZXRIYXNoKHVuc2lnbmVkIGhhc2gpIHsg
QVNTRVJUKCFtX2hhc2gpOyBtX2hhc2ggPSBoYXNoOyB9CisgICAgCiAgICAgdHlwZWRlZiBDcm9z
c1RocmVhZFJlZkNvdW50ZWQ8T3duRmFzdE1hbGxvY1B0cjxVQ2hhcj4gPiBTaGFyZWRVQ2hhcjsK
IAogcHVibGljOgo=
</data>
<flag name="review"
          id="22191"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>