I found that CALLBACK_PROLOGUE and CALLBACK_EPILOGUE
makes most programs less, not more, stable. The simple
program below crashes when it calls FrmCloseAllForms.
It does not crash if I comment CALLBACK_PROLOGUE and
CALLBACK_EPILOGUE.
Can somebody explain why?
===
#include <Pilot.h>
#include "Callback.h"
#include "test0.h"
int n1=-1, n2=-1, n3=-1, n4=-1;
Boolean MainFormHandleEvent(EventPtr event) {
CALLBACK_PROLOGUE
switch (event->eType) {
case frmOpenEvent: // after the form is opened, draw it
FrmDrawForm(FrmGetActiveForm());
return 1;
default: break;
}
return 0;
CALLBACK_EPILOGUE
}
Boolean AppHandleEvent(EventPtr event) {
Int id;
FormPtr frm;
switch (event->eType) {
case frmLoadEvent:
id = event ->data.frmLoad.formID;
frm = FrmInitForm (id);
FrmSetActiveForm (frm);
if (id == MainFormId)
FrmSetEventHandler (frm, MainFormHandleEvent);
return 1;
default: break;
}
return 0;
}
DWord PilotMain(Word cmd, Ptr bla1, Word bla2) {
EventType event;
Word error;
if (cmd) return 0;
FrmGotoForm(MainFormId);
do {
EvtGetEvent(&event, evtWaitForever);
if (SysHandleEvent(&event)) continue;
if (MenuHandleEvent(0, &event, &error)) continue;
if (AppHandleEvent(&event)) continue;
FrmDispatchEvent(&event);
} while (event.eType != appStopEvent);
FrmCloseAllForms();
return 0;
}
===
The text of Callback.h is as follows:
ifndef _GCC_H
#define _GCC_H
register void *reg_a4 asm("%a4");
#define CALLBACK_PROLOGUE \
void *save_a4 = reg_a4; asm("move.l %%a5,%%a4; sub.l #edata,%%a4" : :);
#define CALLBACK_EPILOGUE \
reg_a4 = save_a4;
#endif
_________________________________________________________
DO YOU YAHOO!?
Get your free @yahoo.com address at http://mail.yahoo.com