From 161136cd579a8dff689933bd99fe5ec374d33ac5 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Wed, 5 Oct 2022 17:59:05 -0400 Subject: [PATCH] clean up memory leaks --- main | Bin 8976 -> 9000 bytes main.c | 69 ++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/main b/main index a11839ace799be79e8b033a8fc5e89643cce2d3f..0ce566d76fd3e835ef27321e741b4f664ff9aa35 100755 GIT binary patch delta 3459 zcmZu!e{56N6+YMR+DRNkoXCWvIPiG5X&l_xMHx%GG<|Vs>w3XS+mr&%5|-k7_r#7 z#iydCLAEOJ=9Z+qX9_zsa_uG`d3M!6Hsxc3-%p(Hh<#kq z5;c>q*vC~hX^L|-NZgm=y^oSVrA+f4iPiR;GE+3sDNVNA;7uuIMh)<|!Bst$&ETLa zsa#a7isqCF!zKO3_9?lgDGDsF8!j!S%t=j{)D(rchAIu#0=&Oa+&_bR58QoNj~qIE%Uxa&*ekjz6837-j{Ns#L}@bqAP6VH?nyVUb%9>=9S^x7iNC?XR&u(P!Vlc8d{vhj`lIX8Xj9y^alu`}U5?(om4x z4xL=j=;X$}Ln7v=WABTUql3A`hmKkqvK5;mH$t1#0Bb-FG@Lh+HCliLd;uQ1crfYm z1z4y)z*{~VHoAkDg91T{q}Z`Yit7og;0Tf@d`7NCNGTPSWE%GqwC3ej$Gp44nr+g-IL){cjv6k+gkvQ-B zQyd9`XETExyp@H*De*|znxK?^QpjLs^B|$hw@H8iNpqvFu0RK6abh{-c8i2c^p(ln z&X(1&Q{r6NlWfd-euAf0v^mS!sE9f@uo1D_S)19WmK0ZM>p^R%3&<>z8lixvZQK7LW%s_n6?SqfueWrb1QTC{#F zO_|Qw)c7?N=Qp#VbZ&cBIrza|wEIXb6DODd>FbajHRt+(nDhKE3@GX~Ayt zsCz(e9N>D{Ob$FbNQ||{)7ID~E|tHq=2CoZk^4V*2-Q_^G)%p z>pNR(8vAKwq4v^>Rdsry`cQ=rRUUvb0gQWj?UpnG5=S)0d`6?(EB@+QpD}^`Wan($ zT(0T39$cBAMKopQi=uC%Y4YnV1PXu}67;nhM&W>-O3?k|AdHIxg(6$(7LJo>TxdnI zoNN)RS$iL@r_5489m}z1)rQ+cMHoHH{wY2gQ7ym&K6Vp@S8u!d*74z+Z-LWX;QVFy zv*FKjy!E*0@8GdCePr%*z<{>+W>vu{w9<`J-jk-P%HCGYP3w8U-_8O>&Th;zp#bWet_9;qNh0OLHx z1DnxQ^F__Gmgb*AgNuv!DtTclYT?;DyH(I#$OA2prodw1s92Xtq7Akt-%v};x0foq zkyQKmJ4Qfyh5L}~8di17u3=PL`lZ1Y3HtZ>-Y#t`TsR+}#*ViQr);SPN2$zV)@Gan zzGqPjjzY%6=(czkxJS{&uE^5^DW}zt5Qu+Vy>PT*JL~9;*F*z6mE_TPl1`x9tG*b^ zHc@X5GpwT7lYR8S$rZ$ZjZuQ5Qc|}v@>hcz>OAG4@-IXPb zy&`(6w&Kftx@yC!6z-9RaQqRzFF~cBcFy(_!nw`5;G}_Rjt>~_mrUf)fEZl$0y}x(lU2X4SN12Jf$sv~ z%S{yb;Kn#A4y>tTgW|-Rms!8auh~^OSP0sKtEd~?!}%fchIga*r`Pw8WCW7;#3UrI z)IBW8LUK$r)@>BO`iA5LBqzmTNLH=&)~@WhPmOSO`TItpaZ22(+n71E?2fkc$OPOR z1)Y+a9mE|i_G{GT&Tc?R_$hfjn4A%<)$nkDu&!(ZwScNYF7P}cXF*0bqKdHh&Pei^6$ delta 3442 zcmZuz4Qx}_6+YMR#&L|3n8=}KILYJTrg3oNw2D~TMeWN^!Sx&`&Y^!SA=!6r z2Qg{3&b#-Xd+xpGeCOxh6Pw32k3H0WfQU5^Q3;W9o2c|a^w!8yFdC$1zXzAX!^F3s zr<@uhwGE6m!%_dy*2(3?P!I17C6x1r`$O6IshrY3(5Hr#ey0r~JESW!S{pH9iIdAu z#%z-uRp4D;ndR{-SfP>UB?^*nj~{cNhT4_M@tiW#KBrt#_a{!?3mT3lJ=CL2fv$pk zMa}VeaRrz29XW1Tq_vH+wUuX6PHVs*x)b^(9pO7g16yC-cV+)B+o3~OUAZW>vkmNm zc#S=iH6j$$)kX@M{%~43tLhpMfTBl3I^U_u-l&@9M#L3OE2q>!3Wf%W^S;DHWiV!^ zJc)@aZjr&&2=QQ=_dZOav~q>VC009f%2ZKBw^TWA25(9$Q)-y^n_SfsW7)(+#gY^* z3RcB($|chy?Z)y?<&vftu$(bHT3Wd-C81JN4Az>eR9Fl1ou=d+E6!y!sGB&sbik;R z9IU-)y0G?wT!;27=60)f@#*YH;*|mMSI3%c`~_NF5xqsu_Bk34r}-E}&jY7#rL*V| zxW~Xf2<{i)&V&0Z#zziMVk-wYH^CX`IIim8+FB3fMti;?j+q6_#5#_598Z$RZq$2w z)Na*fwnm4kAyS^C@-R^LWqW(fdQESiV^3K$ln*m(+!Z5JLhAwiK7j7yUW>)24NAPC zR&KRV!T&Fiw_mCaIDKZVrWX)cdP=Tn9Ha`h+;qufJa6>(0EY$BT~HAUW-z`9Or^@* zc}wmsg7vNG&a)%}r!k&?aJ+K(*ad|3KtX}ZsSg$@2qo&p6 zX1i#W+THmLX;yhqBJ%~1@ipq9Ze>x7^U$hzBuZ-x7mVK~{?32Mekzvu^K7@+RkDGl z#b`muN zKsTVB1T3$!zo2uuKYFYAaW%{u5IpK>JLT8HEF28;hO_%qo?w_Y*N1uYxlyw>f<7o5 zp=g?oN7KADNfmdb1s%ubsAykWS=7?XthD~!%k{7_yL=5oo=}=Ka1~!{jc+q=j!(xu zQk@+||9ReyR7h_?@Qf0dy2A1m-L^S(~etkUr{C!h=1yei;K(8ff(Lk`x zX}VfaeSd)ZpXxHm~l^F=XRd{+9<69}VK|CVYfvyhvE6<93; zP_C3V!E4taIJ$`9s*gpjYi*f7Nu@gxfPSI7sy75e9jpbVNCh>3n)46@^ALpd5VVM4 zS4|nM;3YnAtt;VjBtAq>ChDxX;i{>IR_>WlngqZd_rI^01c1v@_UH3X!m|UOj=!xE9n;Q30V1(31 z^M?@K9P*6qM{#;{pH_4U}_!kVKYxR35U{Ui%sz(`eJqP8$y@+V}Gurb> zx_4*$-71Z1Bkk%OKC7-$%z*gE|%0&RfgKoAIN`q zh1yxT$k~Q|bCMR$B`N#89-pRsP0E)@Pr)T6AIrMZaU98Y6(AHYwJU{7jeF!(heTb- z7xWJ$SGpUOsu({@3-Rf${5`b-M#)g2z!U+!3>QdQJCTJ49;hwe;_+QF=u0;xX}%V( z3^&>Ego^H-8FXN^NKvks9GjmMVXHaW;Vk*?}yePW_&L-inDleF(Q zhbOO&zS__^r&wF&lsC?NS5?MByuM<4MH2g?jBv5>w$NFT87s3Ev+d8%#OTH}I|mCluxB zB)R?(pB^N{z;=X^+;2@R$1T&l%|_r^VyyaEcI3?G)xR%UZKT}cA7lGVO=S4+lKicB zdtD9NCvxkaW5#%3&+2^zFW;NO`NN=$7zu2AIAi+mKcRLXp2Vrcpp1;pNJZyeYQ(Ag z#7lv-;#NQte+mS#gEfmit|`uHi|f$pF)Cyv(soOKCa z_qmv#wYS?s9Hx~@+Q$XpdCbe@XWXBD#rX`as4CJm$B>4 ztr_node.io_Message.mn_ReplyPort; - - if (tempTimerPort) { - DeletePort(tempTimerPort); - } + DeleteExtIO((struct IORequest *)TimerIO); + } + if (timerPort) { + DeletePort(timerPort); } // all right, then. keep your secrets. if (visualInfo) FreeVisualInfo(visualInfo); @@ -527,6 +524,14 @@ int openAboutWindow(void) { ULONG windowSignal; BOOL closeAbout = FALSE; + + // Something is causing a small memory leak when I do this and I don't know + // what it is. CodeWatcher reports a bunch of 40 byte blocks, most likely + // Intuition messages. + // + // nope, false positive, checked with avail before and after running and + // the used/free counts are exactly the same: + // https://eab.abime.net/showthread.php?t=104360 aboutWindow = OpenWindow(&aboutWindowLayout); if (!aboutWindow) { @@ -584,16 +589,21 @@ int openAboutWindow(void) { while (!closeAbout) { Wait(windowSignal); - while (!closeAbout && (iMessage = GT_GetIMsg(aboutWindow->UserPort))) { - switch (iMessage->Class) { - case IDCMP_CLOSEWINDOW: - closeAbout = TRUE; - break; - case IDCMP_REFRESHWINDOW: - GT_BeginRefresh(window); - GT_EndRefresh(window, TRUE); - break; + while (iMessage = GT_GetIMsg(aboutWindow->UserPort)) { + if (!closeAbout) { + switch (iMessage->Class) { + case IDCMP_CLOSEWINDOW: + closeAbout = TRUE; + break; + case IDCMP_REFRESHWINDOW: + GT_BeginRefresh(window); + GT_EndRefresh(window, TRUE); + break; + } } + + // ensure messages are garbage collected + GT_ReplyIMsg(iMessage); } } @@ -648,10 +658,7 @@ void handleIntuitionMessage(struct IntuiMessage *iMessage) { terminated = TRUE; break; case MENU_ABOUT_ID: - // yes, this blocks, deal with it - // it also returns non-zero if something goes wrong. - // in that case, kill the program - if (openAboutWindow()) terminated = TRUE; + openAboutWindowNext = TRUE; break; } break; @@ -833,14 +840,26 @@ int main() { if (foundSignals & windowSignal) { // drain the window event queue - while ((!terminated) && (iMessage = GT_GetIMsg(window->UserPort))) { - handleIntuitionMessage(iMessage); + while (iMessage = GT_GetIMsg(window->UserPort)) { + if (!terminated) { + handleIntuitionMessage(iMessage); + } + + // if we don't reply, the event won't be garbage collected. + // we still have to drain any other messages that show up + GT_ReplyIMsg(iMessage); } } if ((foundSignals & timerSignal) && timerIsRunning) { handleTimerMessage(); } + + if (openAboutWindowNext) { + if (openAboutWindow()) terminated = TRUE; + + openAboutWindowNext = FALSE; + } } clearUI();