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

Reply via email to