home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 July & August / PCWorld_2002-07-08_cd.bin / Software / Vyzkuste / batterypanel / source / callback.h next >
C/C++ Source or Header  |  2000-03-22  |  2KB  |  60 lines

  1. /* $Id */
  2.  
  3. #ifndef __CALLBACK_H__
  4. #define __CALLBACK_H__
  5.  
  6.  
  7. #ifdef __GNUC__
  8. #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 95)
  9.  
  10. /* 
  11.  
  12. This is a workaround for a bug in the current version of gcc (2.7.2.2):
  13.  
  14. gcc assumes that no one will touch %a4 after it is set up in crt0.o.
  15. This isn't true if a function is called as a callback by something
  16. that wasn't compiled by gcc (like FrmCloseAllForms()).  It may also
  17. not be true if it is used as a callback by something in a different
  18. shared library.
  19.  
  20. In any function in your code that is called _directly from the OS_
  21. (like custom draw routines, event handlers, etc.), insert CALLBACK_PROLOGUE
  22. at the beginning (right after the local var declarations), and
  23. CALLBACK_EPILOGUE at the end (right before the "return").  NOTE: make sure
  24. that it is _impossible_ for your routine to return without executing
  25. the CALLBACK_EPILOGUE.  Also, make sure to #include "callback.h", of course.
  26.  
  27. There is a compiler flag that attempts to do this, but last I checked,
  28. the code it generates was wrong; it forgot to restore the original %a4 value.
  29.  
  30.    - Ian
  31.  
  32. */
  33.  
  34. register void *reg_a4 asm("%a4");
  35.  
  36. #define CALLBACK_PROLOGUE \
  37.     void *save_a4 = reg_a4; asm("move.l %%a5,%%a4; sub.l #edata,%%a4" : :);
  38.  
  39. #define CALLBACK_EPILOGUE reg_a4 = save_a4;
  40.  
  41. #else
  42.  
  43. /* We don't need the macros for newer versions of gcc */
  44.  
  45. #define CALLBACK_PROLOGUE /* dummy macro */
  46. #define CALLBACK_EPILOGUE /* dummy macro */
  47.  
  48. #endif
  49.  
  50. #else
  51.  
  52. /* We don't need the macros for code warrior */
  53.  
  54. #define CALLBACK_PROLOGUE /* dummy macro */
  55. #define CALLBACK_EPILOGUE /* dummy macro */
  56.  
  57. #endif
  58.  
  59. #endif
  60.