1
0
Fork 0

clean up memory leaks

This commit is contained in:
John Bintz 2022-10-05 17:59:05 -04:00
parent 427ac1368f
commit 161136cd57
2 changed files with 44 additions and 25 deletions

BIN
main

Binary file not shown.

69
main.c
View File

@ -70,7 +70,7 @@ struct NewWindow aboutWindowLayout = {
40, 40,
ABOUT_WINDOW_WIDTH, ABOUT_WINDOW_HEIGHT,
0, 1,
IDCMP_REFRESHWINDOW | IDCMP_CLOSEWINDOW | BUTTONIDCMP,
IDCMP_CLOSEWINDOW,
WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE,
NULL,
NULL,
@ -133,6 +133,7 @@ struct Menu *menu;
struct Device *TimerBase;
struct timerequest *TimerIO;
struct timeval currentSystemTime;
struct MsgPort *timerPort;
// sound stuff
// get that bell
@ -155,6 +156,7 @@ ULONG timerStartTime = 0, timerDistance, timerBuild;
BOOL timerIsRunning = FALSE;
BOOL timerStarted = FALSE;
BOOL terminated = FALSE;
BOOL openAboutWindowNext = FALSE;
/**
* Initialize system stuff.
@ -163,8 +165,6 @@ BOOL terminated = FALSE;
// parameter.
// http://www.hipooniosamigasite.org/amigadocs/files/LOON-DOCS-DISKS/LOON5/LatticeC.pt3
int setup(void) {
struct MsgPort *timerPort;
// make sure the font exists on the computer
// http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_3._guide/node0308.html
if (NULL == (topaz80Font = OpenFont(&Topaz80))) {
@ -218,15 +218,12 @@ int setup(void) {
*/
void teardown(void) {
// http://amigadev.elowar.com/read/ADCD_2.1/Devices_Manual_guide/node0196.html
struct MsgPort *tempTimerPort;
if (TimerIO) {
CloseDevice((struct IORequest *)TimerIO);
tempTimerPort = TimerIO->tr_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();