From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id BE903A0032; Tue, 19 Jul 2022 23:52:58 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6266B410F1; Tue, 19 Jul 2022 23:52:58 +0200 (CEST) Received: from smartserver.smartsharesystems.com (smartserver.smartsharesystems.com [77.243.40.215]) by mails.dpdk.org (Postfix) with ESMTP id D7F6A40FAE for ; Tue, 19 Jul 2022 23:52:56 +0200 (CEST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 Subject: RE: [PATCH v2] rwlock: prevent readers from starving writers Date: Tue, 19 Jul 2022 23:52:54 +0200 Message-ID: <98CBD80474FA8B44BF855DF32C47DC35D871D6@smartserver.smartshare.dk> In-Reply-To: <20220719202750.563166-1-stephen@networkplumber.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH v2] rwlock: prevent readers from starving writers Thread-Index: AdibrguPeO/pWQB1T+W274DllCiGKQABdoOg References: <20220707201226.618611-1-stephen@networkplumber.org> <20220719202750.563166-1-stephen@networkplumber.org> From: =?UTF-8?B?TW9ydGVuIEJyw7hydXA=?= To: "Stephen Hemminger" , X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org PiBGcm9tOiBTdGVwaGVuIEhlbW1pbmdlciBbbWFpbHRvOnN0ZXBoZW5AbmV0d29ya3BsdW1iZXIu b3JnXQ0KPiBTZW50OiBUdWVzZGF5LCAxOSBKdWx5IDIwMjIgMjIuMjgNCj4gDQo+IE1vZGlmeSBy ZWFkZXIvd3JpdGVyIGxvY2sgdG8gYXZvaWQgc3RhcnZhdGlvbiBvZiB3cml0ZXIuICBUaGUgcHJl dmlvdXMNCj4gaW1wbGVtZW50YXRpb24gd291bGQgY2F1c2UgYSB3cml0ZXIgdG8gZ2V0IHN0YXJ2 ZWQgaWYgcmVhZGVycyBrZXB0DQo+IGFjcXVpcmluZyB0aGUgbG9jay4gIFRoZSBuZXcgdmVyc2lv biB1c2VzIGFuIGFkZGl0aW9uYWwgYml0IHRvIGluZGljYXRlDQo+IHRoYXQgYSB3cml0ZXIgaXMg d2FpdGluZyBhbmQgd2hpY2gga2VlcHMgcmVhZGVycyBmcm9tIHN0YXJ2aW5nIHRoZQ0KPiB3cml0 ZXIuDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBTdGVwaGVuIEhlbW1pbmdlciA8c3RlcGhlbkBuZXR3 b3JrcGx1bWJlci5vcmc+DQo+IEFja2VkLWJ5OiBNb3J0ZW4gQnLDuHJ1cCA8bWJAc21hcnRzaGFy ZXN5c3RlbXMuY29tPg0KPiAtLS0NCj4gdjIgLSBpbmNvcnBvcmF0ZSBmZWVkYmFjaywgY2hhbmdl IGZyb20gUkZDIHRvIFBBVENIDQo+IA0KPiAgbGliL2VhbC9pbmNsdWRlL2dlbmVyaWMvcnRlX3J3 bG9jay5oIHwgMTE5ICsrKysrKysrKysrKysrKysrKystLS0tLS0tLQ0KPiAgMSBmaWxlIGNoYW5n ZWQsIDgzIGluc2VydGlvbnMoKyksIDM2IGRlbGV0aW9ucygtKQ0KPiANCj4gZGlmZiAtLWdpdCBh L2xpYi9lYWwvaW5jbHVkZS9nZW5lcmljL3J0ZV9yd2xvY2suaA0KPiBiL2xpYi9lYWwvaW5jbHVk ZS9nZW5lcmljL3J0ZV9yd2xvY2suaA0KPiBpbmRleCBkYTliYzNlOWMwZTIuLjU5ZWM1NDExMDQ0 NCAxMDA2NDQNCj4gLS0tIGEvbGliL2VhbC9pbmNsdWRlL2dlbmVyaWMvcnRlX3J3bG9jay5oDQo+ ICsrKyBiL2xpYi9lYWwvaW5jbHVkZS9nZW5lcmljL3J0ZV9yd2xvY2suaA0KPiBAQCAtMTUsMjMg KzE1LDQ2IEBADQo+ICAgKiBvbmUgd3JpdGVyLiBBbGwgcmVhZGVycyBhcmUgYmxvY2tlZCB1bnRp bCB0aGUgd3JpdGVyIGlzIGZpbmlzaGVkDQo+ICAgKiB3cml0aW5nLg0KPiAgICoNCj4gKyAqIFRo aXMgdmVyc2lvbiBkb2VzIG5vdCBnaXZlIHByZWZlcmVuY2UgdG8gcmVhZGVycyBvciB3cml0ZXJz DQo+ICsgKiBhbmQgZG9lcyBub3Qgc3RhcnZlIGVpdGhlciByZWFkZXJzIG9yIHdyaXRlcnMuDQo+ ICsgKg0KPiArICogU2VlIGFsc286DQo+ICsgKiAgaHR0cHM6Ly9sb2NrbGVzc2luYy5jb20vYXJ0 aWNsZXMvbG9ja3MvDQo+ICAgKi8NCj4gDQo+ICAjaWZkZWYgX19jcGx1c3BsdXMNCj4gIGV4dGVy biAiQyIgew0KPiAgI2VuZGlmDQo+IA0KPiArI2luY2x1ZGUgPHJ0ZV9icmFuY2hfcHJlZGljdGlv bi5oPg0KPiAgI2luY2x1ZGUgPHJ0ZV9jb21tb24uaD4NCj4gLSNpbmNsdWRlIDxydGVfYXRvbWlj Lmg+DQo+ICAjaW5jbHVkZSA8cnRlX3BhdXNlLmg+DQo+IA0KPiAgLyoqDQo+ICAgKiBUaGUgcnRl X3J3bG9ja190IHR5cGUuDQo+ICAgKg0KPiAtICogY250IGlzIC0xIHdoZW4gd3JpdGUgbG9jayBp cyBoZWxkLCBhbmQgPiAwIHdoZW4gcmVhZCBsb2NrcyBhcmUNCj4gaGVsZC4NCj4gKyAqIFJlYWRl cnMgaW5jcmVtZW50IHRoZSBjb3VudGVyIGJ5IFJURV9SV0xPQ0tfUkVBRCAoNCkNCj4gKyAqIFdy aXRlcnMgc2V0IHRoZSBSVEVfUldMT0NLX1dSSVRFIGJpdCB3aGVuIGxvY2sgaXMgaGVsZA0KPiAr ICogICAgIGFuZCBzZXQgdGhlIFJURV9SV0xPQ0tfV0FJVCBiaXQgd2hpbGUgd2FpdGluZy4NCj4g KyAqDQo+ICsgKiAzMSAgICAgICAgICAgICAgICAgMiAxIDANCj4gKyAqICstLS0tLS0tLS0tLS0t LS0tLS0tKy0rLSsNCj4gKyAqIHwgIHJlYWRlcnMgICAgICAgICAgfCB8IHwNCj4gKyAqICstLS0t LS0tLS0tLS0tLS0tLS0tKy0rLSsNCj4gKyAqICAgICAgICAgICAgICAgICAgICAgIF4gXg0KPiAr ICogICAgICAgICAgICAgICAgICAgICAgfCB8DQo+ICsgKiBXUklURTogbG9jayBoZWxkIC0tLS0v IHwNCj4gKyAqIFdBSVQ6IHdyaXRlciBwZW5kaW5nIC0tLw0KPiAgICovDQo+ICsNCj4gKyNkZWZp bmUgUlRFX1JXTE9DS19XQUlUCSAweDEJLyogV3JpdGVyIGlzIHdhaXRpbmcgKi8NCj4gKyNkZWZp bmUgUlRFX1JXTE9DS19XUklURSAweDIJLyogV3JpdGVyIGhhcyB0aGUgbG9jayAqLw0KPiArI2Rl ZmluZSBSVEVfUldMT0NLX01BU0sgIChSVEVfUldMT0NLX1dBSVQgfCBSVEVfUldMT0NLX1dSSVRF KQ0KPiArCQkJCS8qIFdyaXRlciBpcyB3YWl0aW5nIG9yIGhhcyBsb2NrICovDQo+ICsjZGVmaW5l IFJURV9SV0xPQ0tfUkVBRAkgMHg0CS8qIFJlYWRlciBpbmNyZW1lbnQgKi8NCj4gKw0KPiAgdHlw ZWRlZiBzdHJ1Y3Qgew0KPiAtCXZvbGF0aWxlIGludDMyX3QgY250OyAvKio8IC0xIHdoZW4gVyBs b2NrIGhlbGQsID4gMCB3aGVuIFIgbG9ja3MNCj4gaGVsZC4gKi8NCj4gKwlpbnQzMl90IGNudDsN Cj4gIH0gcnRlX3J3bG9ja190Ow0KPiANCj4gIC8qKg0KPiBAQCAtNjEsMTcgKzg0LDI0IEBAIHN0 YXRpYyBpbmxpbmUgdm9pZA0KPiAgcnRlX3J3bG9ja19yZWFkX2xvY2socnRlX3J3bG9ja190ICpy d2wpDQo+ICB7DQo+ICAJaW50MzJfdCB4Ow0KPiAtCWludCBzdWNjZXNzID0gMDsNCj4gDQo+IC0J d2hpbGUgKHN1Y2Nlc3MgPT0gMCkgew0KPiAtCQl4ID0gX19hdG9taWNfbG9hZF9uKCZyd2wtPmNu dCwgX19BVE9NSUNfUkVMQVhFRCk7DQo+IC0JCS8qIHdyaXRlIGxvY2sgaXMgaGVsZCAqLw0KPiAt CQlpZiAoeCA8IDApIHsNCj4gKwl3aGlsZSAoMSkgew0KPiArCQkvKiBXYWl0IHdoaWxlIHdyaXRl ciBpcyBwcmVzZW50IG9yIHBlbmRpbmcgKi8NCj4gKwkJd2hpbGUgKF9fYXRvbWljX2xvYWRfbigm cndsLT5jbnQsIF9fQVRPTUlDX1JFTEFYRUQpDQo+ICsJCSAgICAgICAmIFJURV9SV0xPQ0tfTUFT SykNCj4gIAkJCXJ0ZV9wYXVzZSgpOw0KPiAtCQkJY29udGludWU7DQo+IC0JCX0NCj4gLQkJc3Vj Y2VzcyA9IF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmcndsLT5jbnQsICZ4LCB4ICsgMSwN Cj4gMSwNCj4gLQkJCQkJX19BVE9NSUNfQUNRVUlSRSwgX19BVE9NSUNfUkVMQVhFRCk7DQo+ICsN Cj4gKwkJLyogVHJ5IHRvIGdldCByZWFkIGxvY2sgKi8NCj4gKwkJeCA9IF9fYXRvbWljX2FkZF9m ZXRjaCgmcndsLT5jbnQsIFJURV9SV0xPQ0tfUkVBRCwNCj4gKwkJCQkgICAgICAgX19BVE9NSUNf QUNRVUlSRSk7DQo+ICsNCj4gKwkJLyogSWYgbm8gd3JpdGVyLCB0aGVuIGFjcXVpcmUgd2FzIHN1 Y2Nlc3NmdWwgKi8NCj4gKwkJaWYgKGxpa2VseSghKHggJiBSVEVfUldMT0NLX01BU0spKSkNCj4g KwkJCXJldHVybjsNCj4gKw0KPiArCQkvKiBMb3N0IHJhY2Ugd2l0aCB3cml0ZXIsIGJhY2tvdXQg dGhlIGNoYW5nZS4gKi8NCj4gKwkJX19hdG9taWNfZmV0Y2hfc3ViKCZyd2wtPmNudCwgUlRFX1JX TE9DS19SRUFELA0KPiArCQkJCSAgIF9fQVRPTUlDX1JFTEFYRUQpOw0KPiAgCX0NCj4gIH0NCj4g DQo+IEBAIC05MywxNyArMTIzLDI0IEBAIHN0YXRpYyBpbmxpbmUgaW50DQo+ICBydGVfcndsb2Nr X3JlYWRfdHJ5bG9jayhydGVfcndsb2NrX3QgKnJ3bCkNCj4gIHsNCj4gIAlpbnQzMl90IHg7DQo+ IC0JaW50IHN1Y2Nlc3MgPSAwOw0KPiANCj4gLQl3aGlsZSAoc3VjY2VzcyA9PSAwKSB7DQo+IC0J CXggPSBfX2F0b21pY19sb2FkX24oJnJ3bC0+Y250LCBfX0FUT01JQ19SRUxBWEVEKTsNCj4gLQkJ Lyogd3JpdGUgbG9jayBpcyBoZWxkICovDQo+IC0JCWlmICh4IDwgMCkNCj4gLQkJCXJldHVybiAt RUJVU1k7DQo+IC0JCXN1Y2Nlc3MgPSBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJnJ3bC0+ Y250LCAmeCwgeCArIDEsDQo+IDEsDQo+IC0JCQkJCV9fQVRPTUlDX0FDUVVJUkUsIF9fQVRPTUlD X1JFTEFYRUQpOw0KPiAtCX0NCj4gKwl4ID0gX19hdG9taWNfbG9hZF9uKCZyd2wtPmNudCwgX19B VE9NSUNfUkVMQVhFRCk7DQo+ICsNCj4gKwkvKiBmYWlsIGlmIHdyaXRlIGxvY2sgaXMgaGVsZCBv ciB3cml0ZXIgaXMgcGVuZGluZyAqLw0KPiArCWlmICh4ICYgUlRFX1JXTE9DS19NQVNLKQ0KPiAr CQlyZXR1cm4gLUVCVVNZOw0KPiANCj4gKwkvKiBUcnkgdG8gZ2V0IHJlYWQgbG9jayAqLw0KPiAr CXggPSBfX2F0b21pY19hZGRfZmV0Y2goJnJ3bC0+Y250LCBSVEVfUldMT0NLX1JFQUQsDQo+ICsJ CQkgICAgICAgX19BVE9NSUNfQUNRVUlSRSk7DQo+ICsNCj4gKwkvKiBCYWNrIG91dCBpZiB3cml0 ZXIgcmFjZWQgaW4gKi8NCj4gKwlpZiAodW5saWtlbHkoeCAmIFJURV9SV0xPQ0tfTUFTSykpIHsN Cj4gKwkJX19hdG9taWNfZmV0Y2hfc3ViKCZyd2wtPmNudCwgUlRFX1JXTE9DS19SRUFELA0KPiAr CQkJCSAgIF9fQVRPTUlDX1JFTEVBU0UpOw0KPiArDQo+ICsJCXJldHVybiAtRUJVU1k7DQo+ICsJ fQ0KPiAgCXJldHVybiAwOw0KPiAgfQ0KPiANCj4gQEAgLTExNiw3ICsxNTMsNyBAQCBydGVfcnds b2NrX3JlYWRfdHJ5bG9jayhydGVfcndsb2NrX3QgKnJ3bCkNCj4gIHN0YXRpYyBpbmxpbmUgdm9p ZA0KPiAgcnRlX3J3bG9ja19yZWFkX3VubG9jayhydGVfcndsb2NrX3QgKnJ3bCkNCj4gIHsNCj4g LQlfX2F0b21pY19mZXRjaF9zdWIoJnJ3bC0+Y250LCAxLCBfX0FUT01JQ19SRUxFQVNFKTsNCj4g KwlfX2F0b21pY19mZXRjaF9zdWIoJnJ3bC0+Y250LCBSVEVfUldMT0NLX1JFQUQsIF9fQVRPTUlD X1JFTEVBU0UpOw0KPiAgfQ0KPiANCj4gIC8qKg0KPiBAQCAtMTM5LDExICsxNzYsMTIgQEAgcnRl X3J3bG9ja193cml0ZV90cnlsb2NrKHJ0ZV9yd2xvY2tfdCAqcndsKQ0KPiAgCWludDMyX3QgeDsN Cj4gDQo+ICAJeCA9IF9fYXRvbWljX2xvYWRfbigmcndsLT5jbnQsIF9fQVRPTUlDX1JFTEFYRUQp Ow0KPiAtCWlmICh4ICE9IDAgfHwgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKCZyd2wtPmNu dCwgJngsIC0xLCAxLA0KPiAtCQkJICAgICAgX19BVE9NSUNfQUNRVUlSRSwgX19BVE9NSUNfUkVM QVhFRCkgPT0gMCkNCj4gKwlpZiAoeCA8IFJURV9SV0xPQ0tfV1JJVEUgJiYNCg0KInggPCBSVEVf UldMT0NLX1dSSVRFIiB3aWxsIHBlcm1pdCB0aGlzIHdyaXRoZXIgdGhyZWFkIHRvIHJhY2UgYSB3 YWl0aW5nIHdyaXRlciB0aHJlYWQsIHdoaWxlIHRoZSB3YWl0aW5nIHdyaXRlciB0aHJlYWQgaXMg ZXhlY3V0aW5nIHJ0ZV9wYXVzZSgpLiBIYXZlIHlvdSBjb25zaWRlcmVkICIheCIgaW5zdGVhZCwg Z2l2aW5nIHByaW9yaXR5IHRvIHRoZSB3YWl0aW5nIHRocmVhZD8NCg0KSSBzdXBwb3NlIHlvdXIg c29sdXRpb24gaXMgYmV0dGVyLCBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGlzIHdyaXRlciB0aHJl YWQgaXMgYWN0aXZlbHkgcnVubmluZywgd2hpbGUgdGhlIHdhaXRpbmcgd3JpdGVyIHRocmVhZCBt YXkgaGF2ZSBiZWVuIHB1dCBvbiBob2xkIGJ5IHRoZSBPL1Mgc2NoZWR1bGVyLg0KDQo+ICsJICAg IF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmcndsLT5jbnQsICZ4LCB4ICsNCj4gUlRFX1JX TE9DS19XUklURSwNCg0KT25seSBhIG1hdHRlciBvZiB0YXN0ZSwgYnV0IEkgd291bGQgcHJlZmVy ICJ4IHwgUlRFX1JXTE9DS19XUklURSIgb3ZlciAieCArIFJURV9SV0xPQ0tfV1JJVEUiLiBZb3Ug Y2FuIGxlYXZlIGl0IGFzIGlzLg0KDQo+ICsJCQkJCTEsIF9fQVRPTUlDX0FDUVVJUkUsIF9fQVRP TUlDX1JFTEFYRUQpKQ0KPiArCQlyZXR1cm4gMDsNCj4gKwllbHNlDQo+ICAJCXJldHVybiAtRUJV U1k7DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gIH0NCj4gDQo+ICAvKioNCj4gQEAgLTE1NiwxOCAr MTk0LDI3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZA0KPiAgcnRlX3J3bG9ja193cml0ZV9sb2NrKHJ0 ZV9yd2xvY2tfdCAqcndsKQ0KPiAgew0KPiAgCWludDMyX3QgeDsNCj4gLQlpbnQgc3VjY2VzcyA9 IDA7DQo+IA0KPiAtCXdoaWxlIChzdWNjZXNzID09IDApIHsNCj4gKwl3aGlsZSAoMSkgew0KPiAg CQl4ID0gX19hdG9taWNfbG9hZF9uKCZyd2wtPmNudCwgX19BVE9NSUNfUkVMQVhFRCk7DQo+IC0J CS8qIGEgbG9jayBpcyBoZWxkICovDQo+IC0JCWlmICh4ICE9IDApIHsNCj4gLQkJCXJ0ZV9wYXVz ZSgpOw0KPiAtCQkJY29udGludWU7DQo+ICsNCj4gKwkJLyogTm8gcmVhZGVycyBvciB3cml0ZXJz PyAqLw0KPiArCQlpZiAobGlrZWx5KHggPCBSVEVfUldMT0NLX1dSSVRFKSkgew0KPiArCQkJLyog VHVybiBvZmYgUlRFX1JXTE9DS19XQUlULCB0dXJuIG9uIFJURV9SV0xPQ0tfV1JJVEUNCj4gKi8N Cj4gKwkJCWlmIChfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJnJ3bC0+Y250LCAmeCwNCj4g UlRFX1JXTE9DS19XUklURSwgMSwNCj4gKwkJCQkJCQlfX0FUT01JQ19BQ1FVSVJFLA0KPiBfX0FU T01JQ19SRUxBWEVEKSkNCj4gKwkJCQlyZXR1cm47DQoNClNlZSBjb21tZW50IGJlbG93OyB0aGlz IGlzIHRoZSBwb2ludCBJIHJlZmVyIHRvIGFzIHRoZSAibmV4dCByYWNlIi4NCg0KPiAgCQl9DQo+ IC0JCXN1Y2Nlc3MgPSBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJnJ3bC0+Y250LCAmeCwg LTEsIDEsDQo+IC0JCQkJCV9fQVRPTUlDX0FDUVVJUkUsIF9fQVRPTUlDX1JFTEFYRUQpOw0KPiAt CX0NCj4gKw0KPiArCQkvKiBUdXJuIG9uIHdyaXRlciB3YWl0IGJpdCAqLw0KPiArCQlpZiAoISh4 ICYgUlRFX1JXTE9DS19XQUlUKSkNCj4gKwkJCV9fYXRvbWljX2ZldGNoX29yKCZyd2wtPmNudCwg UlRFX1JXTE9DS19XQUlULA0KPiBfX0FUT01JQ19SRUxBWEVEKTsNCg0KSXMgdGhlcmUgYSByaXNr IG9mIHJhY2Ugd2l0aCB0d28gd3JpdGVyIHRocmVhZHMgYXQgdGhpcyBsb2NhdGlvbj8NCg0KSWYg YSByZWFkZXIgaXMgYWN0aXZlLCBhbmQgdHdvIHdyaXRlciB0aHJlYWRzIHJlYWNoIHRoaXMgcG9p bnQgc2ltdWx0YW5lb3VzbHksIHRoZXkgd2lsbCBib3RoIHNldCBSVEVfUldMT0NLX1dBSVQgaGVy ZS4gQW5kIHRoZW4sIHdoZW4gdGhlIHJlYWRlciB0aHJlYWQgaXMgZG9uZSwgb25lIG9mIHRoZSB3 cml0ZXIgdGhyZWFkIHdpbGwgd2luIHRoZSBuZXh0IHJhY2UgYW5kIHJlcGxhY2UgUlRFX1JXTE9D S19XQUlUIGJ5IFJURV9SV0xPQ0tfV1JJVEUuIFRoZSB3aW5uaW5nIHRocmVhZCB3aWxsIHRoZW4g ZG8gaXRzIGpvYiBhbmQgYWZ0ZXJ3YXJkcyBjbGVhciBSVEVfUldMT0NLX1dSSVRFLg0KVGhpcyBt ZWFucyB0aGF0IGJvdGggUlRFX1JXTE9DS19XQUlUIGFuZCBSVEVfUldMT0NLX1dSSVRFIGhhdmUg YmVlbiBjbGVhcmVkLCBidXQgUlRFX1JXTE9DS19XQUlUIHNob3VsZCByZW1haW4gc2V0IGZvciB0 aGUgd3JpdGVyIHRocmVhZCB0aGF0IGxvc3QgdGhlIHJhY2UuDQoNCkRpZCBJIG1pc3Mgc29tZXRo aW5nPw0KDQpJdCBkb2VzIHdvcmsgd2l0aCBvbmx5IG9uZSB3cml0ZXIgdGhyZWFkLCB0aG91Z2gu DQoNCj4gKw0KPiArCQkvKiBXYWl0IHVudGlsIG5vIHJlYWRlcnMgYmVmb3IgdHJ5aW5nIGFnYWlu ICovDQoNClR5cG86IGJlZm9yIC0+IGJlZm9yZS4NCg0KPiArCQl3aGlsZSAoX19hdG9taWNfbG9h ZF9uKCZyd2wtPmNudCwgX19BVE9NSUNfUkVMQVhFRCkgPg0KPiBSVEVfUldMT0NLX1dBSVQpDQo+ ICsJCQlydGVfcGF1c2UoKTsNCj4gKw0KPiArICAgIH0NCj4gIH0NCj4gDQo+ICAvKioNCj4gQEAg LTE3OSw3ICsyMjYsNyBAQCBydGVfcndsb2NrX3dyaXRlX2xvY2socnRlX3J3bG9ja190ICpyd2wp DQo+ICBzdGF0aWMgaW5saW5lIHZvaWQNCj4gIHJ0ZV9yd2xvY2tfd3JpdGVfdW5sb2NrKHJ0ZV9y d2xvY2tfdCAqcndsKQ0KPiAgew0KPiAtCV9fYXRvbWljX3N0b3JlX24oJnJ3bC0+Y250LCAwLCBf X0FUT01JQ19SRUxFQVNFKTsNCj4gKwlfX2F0b21pY19mZXRjaF9zdWIoJnJ3bC0+Y250LCBSVEVf UldMT0NLX1dSSVRFLA0KPiBfX0FUT01JQ19SRUxFQVNFKTsNCg0KWWVzLiBUaGlzIGlzIGNvcnJl Y3QsIHJlZ2FyZGxlc3MgaWYgYW5vdGhlciB3cml0ZXIgdGhyZWFkIGlzIHdhaXRpbmcgb3Igbm90 LiAoUmV2aWV3ZWQgZm9yIG9uZSB3cml0ZXIgdGhyZWFkIHVzaW5nIHJ0ZV9yd2xvY2tfd3JpdGVf bG9jaygpIGFuZCBhbm90aGVyIHVzaW5nIHJ0ZV9yd2xvY2tfd3JpdGVfdHJ5bG9jaygpLikNCg0K PiAgfQ0KPiANCj4gIC8qKg0KPiAtLQ0KPiAyLjM1LjENCj4gDQoNClRoZSBjb21tZW50cyBpbiB0 aGlzIHZlcnNpb24gYXJlIGdvb2QgdG9vLg0KDQo=