From b4c3f9678a1546165db79e2afe8909bde4f5c503 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 10 Sep 2014 02:35:55 -0700 Subject: [PATCH] Use poll() to avoid an infinite blocking read() that causes ANRs during cleanup --- jni/evdev_reader/evdev_reader.c | 26 ++++++++++++++++++++++++-- libs/arm64-v8a/libevdev_reader.so | Bin 5368 -> 5368 bytes libs/armeabi-v7a/libevdev_reader.so | Bin 13476 -> 13476 bytes libs/mips/libevdev_reader.so | Bin 5488 -> 5492 bytes libs/x86/libevdev_reader.so | Bin 5176 -> 5176 bytes libs/x86_64/libevdev_reader.so | Bin 5632 -> 5632 bytes 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/jni/evdev_reader/evdev_reader.c b/jni/evdev_reader/evdev_reader.c index 16586d43..c003911c 100644 --- a/jni/evdev_reader/evdev_reader.c +++ b/jni/evdev_reader/evdev_reader.c @@ -6,6 +6,7 @@ #include #include #include +#include JNIEXPORT jint JNICALL Java_com_limelight_binding_input_evdev_EvdevReader_open(JNIEnv *env, jobject this, jstring absolutePath) { @@ -60,12 +61,33 @@ Java_com_limelight_binding_input_evdev_EvdevReader_hasKey(JNIEnv *env, jobject t JNIEXPORT jint JNICALL Java_com_limelight_binding_input_evdev_EvdevReader_read(JNIEnv *env, jobject this, jint fd, jbyteArray buffer) { jint ret; - jbyte *data = (*env)->GetByteArrayElements(env, buffer, NULL); + jbyte *data; + int pollres; + struct pollfd pollinfo; + + data = (*env)->GetByteArrayElements(env, buffer, NULL); if (data == NULL) { return -1; } - ret = read(fd, data, sizeof(struct input_event)); + do + { + // Unwait every 250 ms to return to caller if the fd is closed + pollinfo.fd = fd; + pollinfo.events = POLLIN; + pollinfo.revents = 0; + pollres = poll(&pollinfo, 1, 250); + } + while (pollres == 0); + + if (pollres > 0 && (pollinfo.revents & POLLIN)) { + // We'll have data available now + ret = read(fd, data, sizeof(struct input_event)); + } + else { + // There must have been a failure + ret = -1; + } (*env)->ReleaseByteArrayElements(env, buffer, data, 0); diff --git a/libs/arm64-v8a/libevdev_reader.so b/libs/arm64-v8a/libevdev_reader.so index 669f25f9882d11346aecfee27dfa5988764865b8..4f9ea00be9c6fda77062a05176de450893d14dd2 100755 GIT binary patch delta 1570 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 delta 2613 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 M%)zKLIac^K0L^}#H2?qr delta 1353 zcmdm?u|s1*itPy=1_lsjWnf@n5MW?nWME*pz{kLFK@NgV7#SEqm<=k=#K6FChmV2b zjvNESorw#@IYW3D7{GYqL32T5od%2y3l6EU~VF3=9k+ z3=9nH3=9k)Hb}Psh=5`q1_lN`C>um^K<#2?U|-Q9}o?8%H&(DZPLLnS{WD^8V^sBWMJq`QF+nZtiiy*(8;3mV$$SpHd*B)RB;y- zj&2tfh2t(NEFfot)EP}a%_hsG1X1_nh4kc4Y-)_3CQGs#F+QB^!!EHd$_kmjbX?C|NsBLe#5{33UQEUgI|38^Z$S2VJ3)cUUa*tXn+iN`7^nS%ZsV= z+vHPRT8s}Sf8~;A{4iORTb@ba&tx-hIWg`(|Nn!nWME*BVPIgGz`(%3^Jj7vw;Yqr zpUGX^a!fIQCa>a_W2~8cl3Sbgz@PvBnmjD0%Z%*XR zW}IBWJJ-+woTou9WdH>#!wq=`22h5wU|?VnXJBAxV1?uiP_6*sjLCob^aDef7#O%1 z7#J!*d5eL8;S39;(6DEM&^}Naqz+V=#4thfPbw1wgA}N6k%I&+C{ai&9(jCJxoez8pgA&iU;lS2jNIYGvOaK+?WL3vJ)r64?K@=`&0)(ln# zhK$K41(i8LP6lC%$zKKKIS;ThFo1BwWLY73E|7OY_&@VxHz7Gz2QCH%hsl{j%B9SW2NDM9+W^(K z0jh7qWJX4HAr`18f}U)}7^jHKk_3=x3=9kjlXo)4GcK4c$)wMCVX`Naz99oA#Cin? z#c+v%fkB9Yok0OA?hh3gV1$SlOkT<4&iG;SM<#L30xpQ;s>y=Ps*|rV3CX^Ns#4&F z$go2w1~n!I2BC?K!i+kT6Pd*sjlrb-=84R|7&!~_b8;ApQWH}qGqRXWKFk{H!@$5G z$iToL3Jp0Ss39ORD3gJQfq{V^#$jM!09ho=z`y{qSA>Cq0Teu-2;iI8C_cG?&0yjL zmdP8~cm!dg&H>fiF!>^zJmZ4NAKAot56D9VL1r;c{>vslS%;m6_X3hA%Vb@4@yRjl zJiHH(M7bx&vWrjdVdvrffF#O4xtCp>QE+0TaQ%PNUE&N3|5f*hGcZh;Fk!-fRS-V| zWZTOJ|NsC0uewQ`fguBwQeIvF^H+iRpg4PZ0L)(m;xjWaFudFV=FbB0SwQ>+VE!Z! zpB2QP0Oogr_@LDDvf=-Kz5oAJn?M2}kG(AT|Np;7uWh9`1H;Rf|NsAkT;b6xnkmk} zVEE1Oz{`Zmz8q?dk&{a}6c{}wPvy{Il%9NuLz(IOzsb)ze1s*%7#KV{A9-{$dvv;} za2OtVF@3Tdrw3!)3ZhOK6_3vM zX~$huSQr^V6dMD>i{8Kg|2O|&D7mp0f07kXxQHVDdz6eZ~co z4|1yqx-c*>h%hoReE9qS|0X3`(a#>9Wl~`O_I0e@spk)E9*L3r5#YUMQ$9 z2=fh$UNHHgpg!jVs2?9pmJ~7<)Bxpi1_lNgePD8;kiOsts3?q{FnOVnz91|HVDyv8 z4~6svGe9xVz`y{b=S)@<*5^X1XQG77IAO);g2^+5%{kXVtEM%RZwi}pA}T6L5p&K3 X(CAz+Ia0)Ya)5{cW5ni#BJqp>-{Za@ delta 1745 zcmZqBY0#N4Bl7|e0~o+)1_3aafsuiMfsKKIVFfRQzd{z3PGExYVKhu1NEoDV2UOn< zsJTo{{!noNMu@n=I_<@)V zAm8$VSr7tbgAfA)12+Q$gD?XF11OC6CnqvWPhP-gFnNP8ha@LNApy6Ak&y8`?8Bq_F?DYy@4dkGP#yrd~yvt5AO>kQSQlW*~KTXVdts; zfh3CT-v6dd5)2IgRaqn$7$!`ZFyX%{h@Szn?&X93|NsA2{Uy%8kO4{?FE4=kpFn(2 zEWJDc=Dz~*nHd-uUTy&MAA$HRApQa{{}zaE#tIUc02a6e5&$Kbmks~_|M%#%Jt@w> z@N&xk|NlX@di09!6lY*C{APIIWx?dR9BPc2laFvHFh)#%%Av!kJz0oTnTh@XWOGg* z;X*M629M519^K3yoh~XIh6i3OpFEAzgE4RNeNGkOkD|!38HNX5s81H-@~D6J7h(~} zG6;4I_2@k3*?HD6#If^=;ib@EkIvs7y(ua`Ji6KcPdLEJz~Iq(z@zhMiJ431^IZ}Q zAajqs*!K7Tf6vY%h9|-Hzw+sP=h1op{{&DLa_M{k($5hc>lou0dw2)P+pph3ECWSh z=k=GJlU2BF8CxbNajSV+{QdtQlx`pjAnD75fq}u`@BjbEaRo|uJ`4;D8h`))R|hF} zG7Jn1Qy3T+5+*b9$TLoutjMF! z_+WA%k9xfgC@nKGFc|#%|34jMo)e!yFOvtKL=UqYpF$gpBcDbys|TL}lLHr@h9jSX zBcFs5pMVn|ha)I8L);m{$iR^B@Be?0w?IaKunGeMLk=SYL&op_{~JI8d;)HK5?=h= z{{8=d<@f*pbN>DR z|K#`o|6Bh3|1a|A|Nk@p{{MIR^Z);ofB*ld{Q3X?&%giwxBU74U*`Y+|0aL`|M&U- z|NoZ1|Nqzg|NmcQaw4z&E;srTt1&Cl^U=WAW9FuSI z$}=9A{F67neg!B+GcYhf3krq`s3uUt1}RqnC13^yaG?p}+e76+83n}mLF0#@@nfKT zSXq$@DCe7r)#lfdodz z2a^*8^#x&WhtU<27YgbN!dwia=S+SmsLy!->W>4HC56ldIiNiqMw@