From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,T_SCC_BODY_TEXT_LINE,URIBL_CSS autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 7242 invoked from network); 29 Jun 2022 13:15:17 -0000 Received: from tb-ob1.topicbox.com (64.147.108.173) by inbox.vuxu.org with ESMTPUTF8; 29 Jun 2022 13:15:17 -0000 Received: from tb-mx0.topicbox.com (tb-mx0.nyi.icgroup.com [10.90.30.73]) by tb-ob1.topicbox.com (Postfix) with ESMTP id 7F29336B5D for ; Wed, 29 Jun 2022 09:15:14 -0400 (EDT) (envelope-from bounce.mM0bb660408ef52d611ffd55ab.r522be890-2105-11eb-b15e-8d699134e1fa@9fans.bounce.topicbox.com) Received: by tb-mx0.topicbox.com (Postfix, from userid 1132) id 7C0E92A8D9ED; Wed, 29 Jun 2022 09:15:14 -0400 (EDT) ARC-Authentication-Results: i=2; topicbox.com; arc=pass; dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-internal-arc=fail (as.1.topicbox.com=pass, ams.1.topicbox.com=fail (body has been altered)) (Message modified while forwarding at Topicbox) ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d= topicbox.com; h=date:from:to:subject:in-reply-to:message-id :references:mime-version:content-type:list-help:list-id :list-post:list-subscribe:reply-to:content-transfer-encoding :list-unsubscribe; s=sysmsg-1; t=1656508514; bh=Hp77j5T/dQBxWIJX G9hnVJdxfIYZ8cJ2/cY2WVUXic4=; b=YTXyUHQcuaVmSfMJ7h7naRl0N3XAfwSx fZaQ6XuZDYTvrqh5hS+akIHny+O7riqvybgBilv2j+3lhZCu5uTBsxiAKlPAFTLN seqHg5HXswNlJ3SkIPcNqm9M5Tc0hPBmwThEkyfA64l66JTcjevv5/1GFyEFpDDg wcS+tBMcPuQ= ARC-Seal: i=2; a=rsa-sha256; cv=pass; d=topicbox.com; s=sysmsg-1; t= 1656508514; b=kmB9Jxoiep1zN7QMdc+FO9+pd0SORuau7VNHFvXCOfMFbZ89Ck 8M32jqzxg7gFz2AJBEdBQE9mbWEsArV8llyaW326mGXA3jhUgq8Y9OSF63V7zM9H 7xnUGhL2h9T/G6Z4X/wwNxXvSfi2I1aLH8kYn+x4Lzl/eECnzYbVVkzh4= Authentication-Results: topicbox.com; arc=pass; dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-internal-arc=fail (as.1.topicbox.com=pass, ams.1.topicbox.com=fail (body has been altered)) (Message modified while forwarding at Topicbox) X-Received-Authentication-Results: tb-mx1.topicbox.com; arc=none (no signatures found); bimi=skipped (DMARC Policy is not at enforcement); dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; iprev=pass smtp.remote-ip=205.166.94.24 (mx.sdf.org); spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-aligned-from=pass (Address match); x-me-sender=none; x-ptr=pass smtp.helo=mx.sdf.org policy.ptr=mx.sdf.org; x-return-mx=pass header.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-return-mx=pass smtp.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-tls=pass smtp.version=TLSv1.2 smtp.cipher=ECDHE-RSA-AES256-GCM-SHA384 smtp.bits=256/256; x-vs=clean score=0 state=0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; d=9fans.net; h=date:from :to:subject:in-reply-to:message-id:references:mime-version :content-type:list-help:list-id:list-post:list-subscribe :reply-to:content-transfer-encoding:list-unsubscribe; s=dkim-1; t=1656508514; x=1656594914; bh=1Rl4pQUn9oaz6DuhEYUtfQfdCKEad4xa Fiub28Kp7vQ=; b=Ra0MqFeRx+BlMPWmUo3N15nRAfuTW8AK9oHRp1tlSpJGZafE GqoEPUbK4sAWJukQgh4i1rWqW+l7ChSIdMrABTxCY4kW7v7pyHO6TdvUw+95aATp aPxmQV9DkiFl68YSgACAydGKcQau3YmMPED+QrYlz1R36U0I0Y/YIfoL3xk= Received: from tb-mx1.topicbox.com (localhost.local [127.0.0.1]) by tb-mx1.topicbox.com (Postfix) with ESMTP id 0D8CB15D0E4E for <9fans@9fans.net>; Wed, 29 Jun 2022 09:14:43 -0400 (EDT) (envelope-from adr@SDF.ORG) Received: from tb-mx1.topicbox.com (localhost [127.0.0.1]) by tb-mx1.topicbox.com (Authentication Milter) with ESMTP id 2D06D3BE84A; Wed, 29 Jun 2022 09:14:43 -0400 ARC-Seal: i=1; a=rsa-sha256; cv=none; d=topicbox.com; s=arcseal; t= 1656508483; b=UTsi/UcjwXfDxgzXtpEh72q1Yk9h/lEBs9ac/cBdMHX8GL2fUd 6cobDg0Xxt0VSR+Fneo5F+SY3XyqErCWN9C383j8lXSw5DZb95cyJ/FvUO11RBQb pX/Dh/ml5AeKLxUfLvtyTNwxPqY6F2Dzo+7nzJep/e+s9K5iOsP01X2xJLm9bx2v N23pYsRN0DSMH2Bfj6lXBCiHNWQpwztRJMeRLh0UmSOXqnClFNhmTa5Tr5IQCrAL 06P127LbIdUSsyWZFTLV8CoentfE9rtBa5KbXCJ2F0FUet4+GPN2FJIQdToJoQUS P8h0du08BGxq206JS9sCsBQXQArpiTDITzpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= topicbox.com; h=date:from:to:subject:in-reply-to:message-id :references:mime-version:content-type; s=arcseal; t=1656508483; bh=AiEbgDXjDNDXDGwwYcHPCKDH8AY2kR407Aoxqj8QBWI=; b=h3WuOOGfeDcQ 0fJZ+zoEVte4AeDOnPzKNIvXxXzAD/L4pUWYCF85Rwl/uELaweiiBZZfr3khN7D8 8xgcLbUQgNCnD+RGop3lkFqMB0gFRYcZH7348PVJHot+qpH35yfANB65xiKRMaZa dVgrwTEpy3jwtzcc0HMdlTrzAiPjbZ/9XM/21TVaf5Qpz8kMrM0mcBvcOWuXLcrA h/9nZA1384S+SLpG+IXIVH+3OLffi595jXmoNBjSeZnWcacRVsQTX+GTTys7cdBg OGmLU5Vb7OvDNpphEvZY7HrLm2hlpVc+fBjjm4r4YlXaslBpqegyUAHUUy460KCW 6QNaSKqwMA== ARC-Authentication-Results: i=1; tb-mx1.topicbox.com; arc=none (no signatures found); bimi=skipped (DMARC Policy is not at enforcement); dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; iprev=pass smtp.remote-ip=205.166.94.24 (mx.sdf.org); spf=pass smtp.mailfrom=adr@SDF.ORG smtp.helo=mx.sdf.org; x-aligned-from=pass (Address match); x-me-sender=none; x-ptr=pass smtp.helo=mx.sdf.org policy.ptr=mx.sdf.org; x-return-mx=pass header.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-return-mx=pass smtp.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-tls=pass smtp.version=TLSv1.2 smtp.cipher=ECDHE-RSA-AES256-GCM-SHA384 smtp.bits=256/256; x-vs=clean score=0 state=0 X-ME-VSCause: gggruggvucftvghtrhhoucdtuddrgedvfedrudegledgieduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggvpdfu rfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucenucfjughrpeffhffvuf gjkfhfgggtsehmtderhidttddvnecuhfhrohhmpegrughruceorggurhesufffhfdrqfft ifeqnecuggftrfgrthhtvghrnhepjeelvdehheejtdfgjeeuvdefvdevheejgedvvdekie ejtddutdekvefggfetheefnecukfhppedvtdehrdduieeirdelgedrvdegpddvtdehrddu ieeirdelgedrudeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvth epvddthedrudeiiedrleegrddvgedphhgvlhhopehmgidrshgufhdrohhrghdpmhgrihhl fhhrohhmpeeorggurhesufffhfdrqfftifeq X-ME-VSScore: 0 X-ME-VSCategory: clean Received-SPF: pass (sdf.org: 205.166.94.24 is authorized to use 'adr@SDF.ORG' in 'mfrom' identity (mechanism 'ip4:205.166.94.0/24' matched)) receiver=tb-mx1.topicbox.com; identity=mailfrom; envelope-from="adr@SDF.ORG"; helo=mx.sdf.org; client-ip=205.166.94.24 Received: from mx.sdf.org (mx.sdf.org [205.166.94.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by tb-mx1.topicbox.com (Postfix) with ESMTPS for <9fans@9fans.net>; Wed, 29 Jun 2022 09:14:41 -0400 (EDT) (envelope-from adr@SDF.ORG) Received: from sdf.org (IDENT:adr@sdf.org [205.166.94.16]) by mx.sdf.org (8.15.2/8.14.5) with ESMTPS id 25TDEeRk029982 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits) verified NO) for <9fans@9fans.net>; Wed, 29 Jun 2022 13:14:40 GMT Received: from localhost (adr@localhost) by sdf.org (8.15.2/8.12.8/Submit) with ESMTP id 25TDEd47023030 for <9fans@9fans.net>; Wed, 29 Jun 2022 13:14:39 GMT Date: Wed, 29 Jun 2022 13:14:39 +0000 (UTC) From: adr To: 9fans <9fans@9fans.net> Subject: Re: [9fans] syscall silently kill processes In-Reply-To: <8d31d18e-d3ca-f8e0-7fb-b231955c77d7@SDF.ORG> Message-ID: <52572223-75a6-f96f-7cac-f4f89eadfbf@SDF.ORG> References: <2b857fe-c6df-a6b8-40ec-566c85b7377d@SDF.ORG> <770c427561d318ba28f7f4fb820577398f49fef8.camel@gmail.com> <7d9742ec-51f0-34d1-714-6f308975da34@SDF.ORG> <9307b24-ba87-e7b0-342e-71bf83835ed@SDF.ORG> <87cff69b-4b82-8466-a34f-13c7eda24fc9@SDF.ORG> <8d31d18e-d3ca-f8e0-7fb-b231955c77d7@SDF.ORG> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-1130781967-1656508479=:1984" Topicbox-Policy-Reasoning: allow: sender is a member Topicbox-Message-UUID: 733be4e2-f7ad-11ec-b293-9430bf2b2ca1 Archived-At: =?UTF-8?B?PGh0dHBzOi8vOWZhbnMudG9waWNib3guY29tL2dyb3Vwcy85?= =?UTF-8?B?ZmFucy9UZmE2ODIzMDQ4YWQ5MGEyMS1NMGJiNjYwNDA4ZWY1MmQ2MTFmZmQ1?= =?UTF-8?B?NWFiPg==?= List-Help: List-Id: "9fans" <9fans.9fans.net> List-Post: List-Software: Topicbox v0 List-Subscribe: Precedence: list Reply-To: 9fans <9fans@9fans.net> Content-Transfer-Encoding: 7bit List-Unsubscribe: , Topicbox-Delivery-ID: 2:9fans:437d30aa-c441-11e9-8a57-d036212d11b0:522be890-2105-11eb-b15e-8d699134e1fa:M0bb660408ef52d611ffd55ab:1:3het24_5p5OVAT-e-tFH3gFH0NK5qA1hU6s4w2U5z84 --0-1130781967-1656508479=:1984 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Content-ID: <16565085050.A7d181.224349@tb-mx0> On Tue, 28 Jun 2022, adr wrote: > It's just to play with it, note that onnote should be just passed > once. I'll post another patch if things work ok. Here it is. I'm doing sysfatal when malloc fails to be coherent with the rest of libthread, but I don't think that's a good approach. When those functions fail to make an allocation they should return an error so the program could take an action depending on the error. For example, if there is no sufficient memory at a time, the program could wait until there are enough resources to spawn a new thread. adr --- /tmp/main.c +++ /sys/src/libthread/main.c @@ -28,6 +28,10 @@ _qlockinit(_threadrendezvous); _sysfatal =3D _threadsysfatal; __assert =3D _threadassert; + onnote =3D mallocz(PPCHUNK*sizeof(uintptr), 1); + if(!onnote) + sysfatal("Malloc of size %d failed: %r", PPCHUNK*sizeof(uin= tptr)); + onnotesize =3D PPCHUNK; notify(_threadnote); if(mainstacksize =3D=3D 0) mainstacksize =3D 8*1024; --- /tmp/note.c +++ /sys/src/libthread/note.c @@ -5,7 +5,6 @@ int _threadnopasser; -#define NFN 33 #define ERRLEN 48 typedef struct Note Note; struct Note @@ -17,62 +16,157 @@ static Note notes[128]; static Note *enotes =3D notes+nelem(notes); -static int (*onnote[NFN])(void*, char*); -static int onnotepid[NFN]; +Onnote **onnote; +int onnotesize; +static int (*onnoteall[NFN])(void*, char*); static Lock onnotelock; int threadnotify(int (*f)(void*, char*), int in) { - int i, topid; - int (*from)(void*, char*), (*to)(void*, char*); + int i, j, n; - if(in){ - from =3D nil; - to =3D f; - topid =3D _threadgetproc()->pid; - }else{ - from =3D f; - to =3D nil; - topid =3D 0; - } lock(&onnotelock); - for(i=3D0; i -1) + onnoteall[n] =3D f; + unlock(&onnotelock); + return n>-1; + } + + /* remove note for all processes */ + if(in =3D=3D -1){ + for(i=3D0; ipid=3D=3D_threadg= etproc()->pid){ + for(j=3D0; jfn[j] =3D=3D f){ + onnote[i]->fn[j] =3D 0; + break; + } + } + unlock(&onnotelock); + return jpid=3D=3D_threadgetproc()->pid){ + n =3D -1; + for(j=3D0; jfn[j] =3D=3D f){ + unlock(&onnotelock); + return 1; + } + if(onnote[i]->fn[j]=3D=3Dnil && n=3D=3D-1) + n =3D j; + } + if(n > -1) + onnote[i]->fn[n] =3D f; + unlock(&onnotelock); + return n>-1; + } + /* there is a free slot */ + if(!onnote[i] && n=3D=3D-1) + n =3D i; + } + /* there is no free slot */ + if(n =3D=3D -1){ + onnotesize +=3D PPCHUNK; + onnote =3D realloc(onnote, onnotesize*sizeof(uintptr)); + if(!onnote){ + unlock(&onnotelock); + sysfatal("Malloc of size %d failed: %r", onnotesize= *sizeof(uintptr)); + } + memset(onnote+i+1, 0, PPCHUNK-1);=20 + n =3D i; + } + onnote[n]=3Dmallocz(sizeof(Onnote), 1); + if(!onnote[n]){ + unlock(&onnotelock); + sysfatal("Malloc of size %d failed: %r", sizeof(Onnote)); + } + onnote[n]->pid =3D _threadgetproc()->pid; + onnote[n]->fn[0] =3D f; + unlock(&onnotelock); + return 1; +} + +void +threadcancelnotes(int pid) +{ + int i; + + lock(&onnotelock); + for(i=3D0; ipid=3D=3Dpid){ + free(onnote[i]); + onnote[i] =3D nil; break; } unlock(&onnotelock); - return ipending) return; p->pending =3D 0; + all =3D j =3D 0; for(n=3Dnotes; nproc =3D=3D p){ - strcpy(s, n->s); - n->proc =3D nil; - unlock(&n->inuse); - - for(i=3D0; ipid || (fn =3D onnote= [i])=3D=3Dnil) - continue; - if((*fn)(v, s)) - break; + for(i=3D0; is)){ + all =3D 1; + break; + } + if(!all){ + for(i=3D0; ipid=3D= =3Dp->pid){ + for(j=3D0; jf= n[j]) + if((*f)(v, = n->s)) + bre= ak; + break; + } } - if(i=3D=3DNFN){ - _threaddebug(DBGNOTE, "Unhandled note %s, p= roc %p", n->s, p); + if(!all && (i=3D=3Donnotesize || j=3D=3DNFN)){ + _threaddebug(DBGNOTE, "Unhandled note %s, p= roc %p\n", n->s, p); if(v !=3D nil) noted(NDFLT); else if(strncmp(n->s, "sys:", 4)=3D=3D0) @@ -79,6 +173,8 @@ abort(); threadexitsall(n->s); } + n->proc =3D nil; + unlock(&n->inuse); } } } @@ -94,7 +190,7 @@ noted(NDFLT); if(_threadexitsallstatus){ - _threaddebug(DBGNOTE, "Threadexitsallstatus =3D '%s'", _thr= eadexitsallstatus); + _threaddebug(DBGNOTE, "Threadexitsallstatus =3D '%s'\n", _t= hreadexitsallstatus); _exits(_threadexitsallstatus); } --- /tmp/sched.c +++ /sys/src/libthread/sched.c @@ -157,6 +157,7 @@ t =3D runthread(p); if(t =3D=3D nil){ _threaddebug(DBGSCHED, "all threads gone; exiting"); + threadcancelnotes(p->pid); unlinkproc(p); _schedexit(p); /* frees proc */ } --- /tmp/thread.h +++ /sys/include/thread.h @@ -97,6 +97,7 @@ void threadkillgrp(int); /* kill threads in group */ void threadmain(int argc, char *argv[]); int threadnotify(int (*f)(void*, char*), int in); +void threadcancelnotes(int pid); int threadid(void); int threadpid(int); int threadsetgrp(int); /* set thread group, return old */ --- /tmp/threadimpl.h +++ /sys/src/libthread/threadimpl.h @@ -192,3 +192,15 @@ #define _threaddebug(flag, ...) if((_threaddebuglevel&(flag))=3D=3D= 0){}else _threadprint(__VA_ARGS__) #define ioproc_arg(io, type) (va_arg((io)->arg, type)) + +#define PPCHUNK 100 +#define NFN 33 +typedef struct Onnote Onnote; +struct Onnote +{ + int pid; + int (*fn[NFN])(void*, char*); +}; +extern Onnote **onnote; +extern int onnotesize; +void _threadnote(void*, char*); ------------------------------------------ 9fans: 9fans Permalink: https://9fans.topicbox.com/groups/9fans/Tfa6823048ad90a21-M0bb66= 0408ef52d611ffd55ab Delivery options: https://9fans.topicbox.com/groups/9fans/subscription --0-1130781967-1656508479=:1984 Content-Type: text/x-diff; name=thread.patch Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=thread.patch LS0tIC90bXAvbWFpbi5jDQorKysgL3N5cy9zcmMvbGlidGhyZWFkL21haW4u Yw0KQEAgLTI4LDYgKzI4LDEwIEBADQogCV9xbG9ja2luaXQoX3RocmVhZHJl bmRlenZvdXMpOw0KIAlfc3lzZmF0YWwgPSBfdGhyZWFkc3lzZmF0YWw7DQog CV9fYXNzZXJ0ID0gX3RocmVhZGFzc2VydDsNCisJb25ub3RlID0gbWFsbG9j eihQUENIVU5LKnNpemVvZih1aW50cHRyKSwgMSk7DQorCWlmKCFvbm5vdGUp DQorCQlzeXNmYXRhbCgiTWFsbG9jIG9mIHNpemUgJWQgZmFpbGVkOiAlciIs IFBQQ0hVTksqc2l6ZW9mKHVpbnRwdHIpKTsNCisJb25ub3Rlc2l6ZSA9IFBQ Q0hVTks7DQogCW5vdGlmeShfdGhyZWFkbm90ZSk7DQogCWlmKG1haW5zdGFj a3NpemUgPT0gMCkNCiAJCW1haW5zdGFja3NpemUgPSA4KjEwMjQ7DQotLS0g L3RtcC9ub3RlLmMNCisrKyAvc3lzL3NyYy9saWJ0aHJlYWQvbm90ZS5jDQpA QCAtNSw3ICs1LDYgQEANCiANCiBpbnQJX3RocmVhZG5vcGFzc2VyOw0KIA0K LSNkZWZpbmUJTkZOCQkzMw0KICNkZWZpbmUJRVJSTEVOCTQ4DQogdHlwZWRl ZiBzdHJ1Y3QgTm90ZSBOb3RlOw0KIHN0cnVjdCBOb3RlDQpAQCAtMTcsNjIg KzE2LDE1NyBAQA0KIA0KIHN0YXRpYyBOb3RlCW5vdGVzWzEyOF07DQogc3Rh dGljIE5vdGUJKmVub3RlcyA9IG5vdGVzK25lbGVtKG5vdGVzKTsNCi1zdGF0 aWMgaW50CQkoKm9ubm90ZVtORk5dKSh2b2lkKiwgY2hhciopOw0KLXN0YXRp YyBpbnQJCW9ubm90ZXBpZFtORk5dOw0KK09ubm90ZSAqKm9ubm90ZTsNCitp bnQgb25ub3Rlc2l6ZTsNCitzdGF0aWMgaW50ICgqb25ub3RlYWxsW05GTl0p KHZvaWQqLCBjaGFyKik7DQogc3RhdGljIExvY2sJb25ub3RlbG9jazsNCiAN CiBpbnQNCiB0aHJlYWRub3RpZnkoaW50ICgqZikodm9pZCosIGNoYXIqKSwg aW50IGluKQ0KIHsNCi0JaW50IGksIHRvcGlkOw0KLQlpbnQgKCpmcm9tKSh2 b2lkKiwgY2hhciopLCAoKnRvKSh2b2lkKiwgY2hhciopOw0KKwlpbnQgaSwg aiwgbjsNCiANCi0JaWYoaW4pew0KLQkJZnJvbSA9IG5pbDsNCi0JCXRvID0g ZjsNCi0JCXRvcGlkID0gX3RocmVhZGdldHByb2MoKS0+cGlkOw0KLQl9ZWxz ZXsNCi0JCWZyb20gPSBmOw0KLQkJdG8gPSBuaWw7DQotCQl0b3BpZCA9IDA7 DQotCX0NCiAJbG9jaygmb25ub3RlbG9jayk7DQotCWZvcihpPTA7IGk8TkZO OyBpKyspDQotCQlpZihvbm5vdGVbaV09PWZyb20pew0KLQkJCW9ubm90ZVtp XSA9IHRvOw0KLQkJCW9ubm90ZXBpZFtpXSA9IHRvcGlkOw0KKw0KKwkvKiBh ZGQgbm90ZSBmb3IgYWxsIHByb2Nlc3NlcyAqLw0KKwlpZihpbiA8IC0xKXsN CisJCW4gPSAtMTsNCisJCWZvcihpPTA7IGk8TkZOOyBpKyspew0KKwkJCWlm KG9ubm90ZWFsbFtpXSA9PSBmKXsNCisJCQkJdW5sb2NrKCZvbm5vdGVsb2Nr KTsNCisJCQkJcmV0dXJuIDE7DQorCQkJfQ0KKwkJCWlmKG9ubm90ZWFsbFtp XT09bmlsICYmIG49PS0xKQ0KKwkJCQluID0gaTsNCisJCX0NCisJCWlmKG4g PiAtMSkNCisJCQlvbm5vdGVhbGxbbl0gPSBmOw0KKwkJdW5sb2NrKCZvbm5v dGVsb2NrKTsNCisJCXJldHVybiBuPi0xOw0KKwl9DQorDQorCS8qIHJlbW92 ZSBub3RlIGZvciBhbGwgcHJvY2Vzc2VzICovDQorCWlmKGluID09IC0xKXsN CisJCWZvcihpPTA7IGk8TkZOOyBpKyspDQorCQkJaWYob25ub3RlYWxsW2ld ID09IGYpew0KKwkJCQlvbm5vdGVhbGxbaV0gPSBuaWw7DQorCQkJCWJyZWFr Ow0KKwkJCX0NCisJCXVubG9jaygmb25ub3RlbG9jayk7DQorCQlyZXR1cm4g aTxORk47DQorCX0NCisNCisJLyogcmVtb3ZlIG5vdGUgZm9yIGN1cnJlbnQg cHJvY2VzcyAqLw0KKwlpZighaW4pew0KKwkJZm9yKGk9MDsgaTxvbm5vdGVz aXplOyBpKyspew0KKwkJCWlmKG9ubm90ZVtpXSE9bmlsICYmIG9ubm90ZVtp XS0+cGlkPT1fdGhyZWFkZ2V0cHJvYygpLT5waWQpew0KKwkJCQlmb3Ioaj0w OyBqPE5GTjsgaisrKXsNCisJCQkJCWlmKG9ubm90ZVtpXS0+Zm5bal0gPT0g Zil7DQorCQkJCQkJb25ub3RlW2ldLT5mbltqXSA9IDA7DQorCQkJCQkJYnJl YWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJdW5sb2NrKCZvbm5vdGVsb2Nr KTsNCisJCQkJcmV0dXJuIGo8TkZOOw0KKwkJCX0NCisJCX0NCisJCXVubG9j aygmb25ub3RlbG9jayk7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwkvKiBh ZGQgbm90ZSBmb3IgY3VycmVudCBwcm9jZXNzICovDQorCW4gPSAtMTsNCisJ Zm9yKGk9MDsgaTxvbm5vdGVzaXplOyBpKyspew0KKwkJLyogcHJvY2VzcyBo YXMgYWxyZWFkeSBhIHNsb3QgKi8NCisJCWlmKG9ubm90ZVtpXSAmJiBvbm5v dGVbaV0tPnBpZD09X3RocmVhZGdldHByb2MoKS0+cGlkKXsNCisJCQluID0g LTE7DQorCQkJZm9yKGo9MDsgajxORk47IGorKyl7DQorCQkJCWlmKG9ubm90 ZVtpXS0+Zm5bal0gPT0gZil7DQorCQkJCQl1bmxvY2soJm9ubm90ZWxvY2sp Ow0KKwkJCQkJcmV0dXJuIDE7DQorCQkJCX0NCisJCQkJaWYob25ub3RlW2ld LT5mbltqXT09bmlsICYmIG49PS0xKQ0KKwkJCQkJbiA9IGo7DQorCQkJfQ0K KwkJCWlmKG4gPiAtMSkNCisJCQkJb25ub3RlW2ldLT5mbltuXSA9IGY7DQor CQkJdW5sb2NrKCZvbm5vdGVsb2NrKTsNCisJCQlyZXR1cm4gbj4tMTsNCisJ CX0NCisJCS8qIHRoZXJlIGlzIGEgZnJlZSBzbG90ICovDQorCQlpZighb25u b3RlW2ldICYmIG49PS0xKQ0KKwkJCW4gPSBpOw0KKwl9DQorCS8qIHRoZXJl IGlzIG5vIGZyZWUgc2xvdCAqLw0KKwlpZihuID09IC0xKXsNCisJCW9ubm90 ZXNpemUgKz0gUFBDSFVOSzsNCisJCW9ubm90ZSA9IHJlYWxsb2Mob25ub3Rl LCBvbm5vdGVzaXplKnNpemVvZih1aW50cHRyKSk7DQorCQlpZighb25ub3Rl KXsNCisJCQl1bmxvY2soJm9ubm90ZWxvY2spOw0KKwkJCXN5c2ZhdGFsKCJN YWxsb2Mgb2Ygc2l6ZSAlZCBmYWlsZWQ6ICVyIiwgb25ub3Rlc2l6ZSpzaXpl b2YodWludHB0cikpOw0KKwkJfQ0KKwkJbWVtc2V0KG9ubm90ZStpKzEsIDAs IFBQQ0hVTkstMSk7IA0KKwkJbiA9IGk7DQorCX0NCisJb25ub3RlW25dPW1h bGxvY3ooc2l6ZW9mKE9ubm90ZSksIDEpOw0KKwlpZighb25ub3RlW25dKXsN CisJCXVubG9jaygmb25ub3RlbG9jayk7DQorCQlzeXNmYXRhbCgiTWFsbG9j IG9mIHNpemUgJWQgZmFpbGVkOiAlciIsIHNpemVvZihPbm5vdGUpKTsNCisJ fQ0KKwlvbm5vdGVbbl0tPnBpZCA9IF90aHJlYWRnZXRwcm9jKCktPnBpZDsN CisJb25ub3RlW25dLT5mblswXSA9IGY7DQorCXVubG9jaygmb25ub3RlbG9j ayk7DQorCXJldHVybiAxOw0KK30NCisNCit2b2lkDQordGhyZWFkY2FuY2Vs bm90ZXMoaW50IHBpZCkNCit7DQorCWludCBpOw0KKw0KKwlsb2NrKCZvbm5v dGVsb2NrKTsNCisJZm9yKGk9MDsgaTxvbm5vdGVzaXplOyBpKyspDQorCQlp Zihvbm5vdGVbaV0gJiYgb25ub3RlW2ldLT5waWQ9PXBpZCl7DQorCQkJZnJl ZShvbm5vdGVbaV0pOw0KKwkJCW9ubm90ZVtpXSA9IG5pbDsNCiAJCQlicmVh azsNCiAJCX0NCiAJdW5sb2NrKCZvbm5vdGVsb2NrKTsNCi0JcmV0dXJuIGk8 TkZOOw0KKwlyZXR1cm47DQogfQ0KIA0KIHN0YXRpYyB2b2lkDQogZGVsYXll ZG5vdGVzKFByb2MgKnAsIHZvaWQgKnYpDQogew0KLQlpbnQgaTsNCisJaW50 IGksIGosIGFsbDsNCiAJTm90ZSAqbjsNCi0JY2hhciBzW0VSUk1BWF07DQot CWludCAoKmZuKSh2b2lkKiwgY2hhciopOw0KKwlpbnQgKCpmKSh2b2lkKiwg Y2hhciopOw0KIA0KIAlpZighcC0+cGVuZGluZykNCiAJCXJldHVybjsNCiAN CiAJcC0+cGVuZGluZyA9IDA7DQorCWFsbCA9IGogPSAwOw0KIAlmb3Iobj1u b3Rlczsgbjxlbm90ZXM7IG4rKyl7DQogCQlpZihuLT5wcm9jID09IHApew0K LQkJCXN0cmNweShzLCBuLT5zKTsNCi0JCQluLT5wcm9jID0gbmlsOw0KLQkJ CXVubG9jaygmbi0+aW51c2UpOw0KLQ0KLQkJCWZvcihpPTA7IGk8TkZOOyBp Kyspew0KLQkJCQlpZihvbm5vdGVwaWRbaV0hPXAtPnBpZCB8fCAoZm4gPSBv bm5vdGVbaV0pPT1uaWwpDQotCQkJCQljb250aW51ZTsNCi0JCQkJaWYoKCpm bikodiwgcykpDQotCQkJCQlicmVhazsNCisJCQlmb3IoaT0wOyBpPE5GTjsg aSsrKQ0KKwkJCQlpZihmPW9ubm90ZWFsbFtpXSkNCisJCQkJCWlmKCgqZiko diwgbi0+cykpew0KKwkJCQkJCWFsbCA9IDE7DQorCQkJCQkJYnJlYWs7DQor CQkJCQl9DQorCQkJaWYoIWFsbCl7DQorCQkJCWZvcihpPTA7IGk8b25ub3Rl c2l6ZTsgaSsrKQ0KKwkJCQkJaWYob25ub3RlW2ldICYmIG9ubm90ZVtpXS0+ cGlkPT1wLT5waWQpew0KKwkJCQkJCWZvcihqPTA7IGo8TkZOOyBqKyspDQor CQkJCQkJCWlmKGY9b25ub3RlW2ldLT5mbltqXSkNCisJCQkJCQkJCWlmKCgq Zikodiwgbi0+cykpDQorCQkJCQkJCQkJYnJlYWs7DQorCQkJCQkJYnJlYWs7 DQorCQkJCQl9DQogCQkJfQ0KLQkJCWlmKGk9PU5GTil7DQotCQkJCV90aHJl YWRkZWJ1ZyhEQkdOT1RFLCAiVW5oYW5kbGVkIG5vdGUgJXMsIHByb2MgJXAi LCBuLT5zLCBwKTsNCisJCQlpZighYWxsICYmIChpPT1vbm5vdGVzaXplIHx8 IGo9PU5GTikpew0KKwkJCQlfdGhyZWFkZGVidWcoREJHTk9URSwgIlVuaGFu ZGxlZCBub3RlICVzLCBwcm9jICVwXG4iLCBuLT5zLCBwKTsNCiAJCQkJaWYo diAhPSBuaWwpDQogCQkJCQlub3RlZChOREZMVCk7DQogCQkJCWVsc2UgaWYo c3RybmNtcChuLT5zLCAic3lzOiIsIDQpPT0wKQ0KQEAgLTc5LDYgKzE3Myw4 IEBADQogCQkJCQlhYm9ydCgpOw0KIAkJCQl0aHJlYWRleGl0c2FsbChuLT5z KTsNCiAJCQl9DQorCQkJbi0+cHJvYyA9IG5pbDsNCisJCQl1bmxvY2soJm4t PmludXNlKTsNCiAJCX0NCiAJfQ0KIH0NCkBAIC05NCw3ICsxOTAsNyBAQA0K IAkJbm90ZWQoTkRGTFQpOw0KIA0KIAlpZihfdGhyZWFkZXhpdHNhbGxzdGF0 dXMpew0KLQkJX3RocmVhZGRlYnVnKERCR05PVEUsICJUaHJlYWRleGl0c2Fs bHN0YXR1cyA9ICclcyciLCBfdGhyZWFkZXhpdHNhbGxzdGF0dXMpOw0KKwkJ X3RocmVhZGRlYnVnKERCR05PVEUsICJUaHJlYWRleGl0c2FsbHN0YXR1cyA9 ICclcydcbiIsIF90aHJlYWRleGl0c2FsbHN0YXR1cyk7DQogCQlfZXhpdHMo X3RocmVhZGV4aXRzYWxsc3RhdHVzKTsNCiAJfQ0KDQotLS0gL3RtcC9zY2hl ZC5jDQorKysgL3N5cy9zcmMvbGlidGhyZWFkL3NjaGVkLmMNCkBAIC0xNTcs NiArMTU3LDcgQEANCiAJCXQgPSBydW50aHJlYWQocCk7DQogCQlpZih0ID09 IG5pbCl7DQogCQkJX3RocmVhZGRlYnVnKERCR1NDSEVELCAiYWxsIHRocmVh ZHMgZ29uZTsgZXhpdGluZyIpOw0KKwkJCXRocmVhZGNhbmNlbG5vdGVzKHAt PnBpZCk7DQogCQkJdW5saW5rcHJvYyhwKTsNCiAJCQlfc2NoZWRleGl0KHAp OwkvKiBmcmVlcyBwcm9jICovDQogCQl9DQotLS0gL3RtcC90aHJlYWQuaA0K KysrIC9zeXMvaW5jbHVkZS90aHJlYWQuaA0KQEAgLTk3LDYgKzk3LDcgQEAN CiB2b2lkCXRocmVhZGtpbGxncnAoaW50KTsJLyoga2lsbCB0aHJlYWRzIGlu IGdyb3VwICovDQogdm9pZAl0aHJlYWRtYWluKGludCBhcmdjLCBjaGFyICph cmd2W10pOw0KIGludAl0aHJlYWRub3RpZnkoaW50ICgqZikodm9pZCosIGNo YXIqKSwgaW50IGluKTsNCit2b2lkIHRocmVhZGNhbmNlbG5vdGVzKGludCBw aWQpOw0KIGludAl0aHJlYWRpZCh2b2lkKTsNCiBpbnQJdGhyZWFkcGlkKGlu dCk7DQogaW50CXRocmVhZHNldGdycChpbnQpOwkJLyogc2V0IHRocmVhZCBn cm91cCwgcmV0dXJuIG9sZCAqLw0KLS0tIC90bXAvdGhyZWFkaW1wbC5oDQor KysgL3N5cy9zcmMvbGlidGhyZWFkL3RocmVhZGltcGwuaA0KQEAgLTE5Miwz ICsxOTIsMTUgQEANCiAjZGVmaW5lCV90aHJlYWRkZWJ1ZyhmbGFnLCAuLi4p CWlmKChfdGhyZWFkZGVidWdsZXZlbCYoZmxhZykpPT0wKXt9ZWxzZSBfdGhy ZWFkcHJpbnQoX19WQV9BUkdTX18pDQogDQogI2RlZmluZSBpb3Byb2NfYXJn KGlvLCB0eXBlKQkodmFfYXJnKChpbyktPmFyZywgdHlwZSkpDQorDQorI2Rl ZmluZQlQUENIVU5LIDEwMA0KKyNkZWZpbmUJTkZOIDMzDQordHlwZWRlZiBz dHJ1Y3QgT25ub3RlIE9ubm90ZTsNCitzdHJ1Y3QgT25ub3RlDQorew0KKwlp bnQgcGlkOw0KKwlpbnQgKCpmbltORk5dKSh2b2lkKiwgY2hhciopOw0KK307 DQorZXh0ZXJuIE9ubm90ZSAqKm9ubm90ZTsNCitleHRlcm4gaW50IG9ubm90 ZXNpemU7DQordm9pZCBfdGhyZWFkbm90ZSh2b2lkKiwgY2hhciopOw0K --0-1130781967-1656508479=:1984--