Artifact bde8adbdc898c9005fbc393062957436bead9420:


0000: 4d 69 67 72 61 74 69 6f 6e 20 47 75 69 64 65 0a  Migration Guide.
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
0020: 0a 57 68 65 6e 20 73 77 69 74 63 68 69 6e 67 20  .When switching 
0030: 66 72 6f 6d 20 76 61 63 61 6c 6c 2b 74 72 61 6d  from vacall+tram
0040: 70 6f 6c 69 6e 65 20 74 6f 20 63 61 6c 6c 62 61  poline to callba
0050: 63 6b 2c 20 79 6f 75 20 6e 65 65 64 20 74 6f 20  ck, you need to 
0060: 6d 61 6b 65 20 74 68 65 0a 66 6f 6c 6c 6f 77 69  make the.followi
0070: 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 79 6f  ng changes to yo
0080: 75 72 20 63 6f 64 65 3a 0a 0a 20 20 20 20 20 20  ur code:..      
0090: 20 76 61 63 61 6c 6c 2b 74 72 61 6d 70 6f 6c 69   vacall+trampoli
00a0: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
00b0: 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
00c0: 6b 0a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  k.       -------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20  ----------      
00e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
00f0: 20 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 20 20 20 20 20   --------..     
0100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0110: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 6e 63 6c           -- Incl
0120: 75 64 65 20 66 69 6c 65 73 20 2d 2d 0a 0a 23 69  ude files --..#i
0130: 6e 63 6c 75 64 65 20 22 76 61 63 61 6c 6c 2f 76  nclude "vacall/v
0140: 61 63 61 6c 6c 2e 68 22 20 20 20 20 20 20 20 20  acall.h"        
0150: 20 20 20 20 20 20 23 69 6e 63 6c 75 64 65 20 22        #include "
0160: 63 61 6c 6c 62 61 63 6b 2f 63 61 6c 6c 62 61 63  callback/callbac
0170: 6b 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74  k.h".#include "t
0180: 72 61 6d 70 6f 6c 69 6e 65 2f 74 72 61 6d 70 6f  rampoline/trampo
0190: 6c 69 6e 65 2e 68 22 0a 0a 20 20 20 20 20 20 20  line.h"..       
01a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01b0: 20 20 20 2d 2d 20 56 61 72 69 61 62 6c 65 20 64     -- Variable d
01c0: 65 63 6c 61 72 61 74 69 6f 6e 73 20 2d 2d 0a 0a  eclarations --..
01d0: 73 74 61 74 69 63 20 76 6f 69 64 2a 20 74 72 61  static void* tra
01e0: 6d 70 76 61 72 3b 0a 0a 20 20 20 20 20 20 20 20  mpvar;..        
01f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0200: 20 20 20 2d 2d 20 43 61 6c 6c 62 61 63 6b 20 64     -- Callback d
0210: 65 63 6c 61 72 61 74 69 6f 6e 20 2d 2d 0a 20 20  eclaration --.  
0220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 73                .s
0240: 74 61 74 69 63 20 76 6f 69 64 20 20 20 20 20 20  tatic void      
0250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0260: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 76 6f         static vo
0270: 69 64 0a 6d 79 63 61 6c 6c 62 61 63 6b 20 28 76  id.mycallback (v
0280: 61 5f 61 6c 69 73 74 20 61 72 67 73 29 20 20 20  a_alist args)   
0290: 20 20 20 20 20 20 20 20 20 20 20 6d 79 63 61 6c             mycal
02a0: 6c 62 61 63 6b 20 28 76 6f 69 64 2a 20 64 61 74  lback (void* dat
02b0: 61 2c 20 76 61 5f 61 6c 69 73 74 20 61 72 67 73  a, va_alist args
02c0: 29 0a 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ).{             
02d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02e0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 76 6f            {.  vo
02f0: 69 64 2a 20 64 61 74 61 20 3d 20 74 72 61 6d 70  id* data = tramp
0300: 76 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  var;            
0310: 20 20 20 20 20 20 2e 2e 2e 0a 20 20 2e 2e 2e 0a        ....  ....
0320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
0340: 2d 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  - Initialization
0350: 20 2d 2d 0a 0a 76 61 63 61 6c 6c 5f 66 75 6e 63   --..vacall_func
0360: 74 69 6f 6e 20 3d 20 26 6d 79 63 61 6c 6c 62 61  tion = &mycallba
0370: 63 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ck;..           
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
0390: 2d 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 63  - Allocating a c
03a0: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 0a 76 6f 69 64  allback --..void
03b0: 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 20 3d 20 20  * trampoline =  
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 20 20 20 20 76 6f 69 64 2a 20 74 72 61 6d 70 6f      void* trampo
03e0: 6c 69 6e 65 20 3d 0a 20 20 61 6c 6c 6f 63 5f 74  line =.  alloc_t
03f0: 72 61 6d 70 6f 6c 69 6e 65 28 20 20 20 20 20 20  rampoline(      
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 61 6c 6c 6f 63 5f 63 61 6c 6c 62 61 63 6b 28   alloc_callback(
0420: 26 6d 79 63 61 6c 6c 62 61 63 6b 2c 64 61 74 61  &mycallback,data
0430: 29 3b 0a 20 20 20 20 28 5f 5f 54 52 5f 66 75 6e  );.    (__TR_fun
0440: 63 74 69 6f 6e 29 26 76 61 63 61 6c 6c 2c 0a 20  ction)&vacall,. 
0450: 20 20 20 26 74 72 61 6d 70 76 61 72 2c 0a 20 20     &trampvar,.  
0460: 20 20 64 61 74 61 29 3b 0a 0a 20 20 20 20 20 20    data);..      
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 20 2d 2d 20 54 65 73 74 69 6e 67 20 66      -- Testing f
0490: 6f 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 2d 2d  or a callback --
04a0: 0a 0a 69 66 20 20 20 20 20 20 20 20 20 20 20 20  ..if            
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 20 20 20 20 69 66 0a 28 69 73            if.(is
04d0: 5f 74 72 61 6d 70 6f 6c 69 6e 65 28 61 64 64 72  _trampoline(addr
04e0: 65 73 73 29 20 20 20 20 20 20 20 20 20 20 20 20  ess)            
04f0: 20 20 20 20 20 28 69 73 5f 63 61 6c 6c 62 61 63       (is_callbac
0500: 6b 28 61 64 64 72 65 73 73 29 0a 20 26 26 20 28  k(address). && (
0510: 74 72 61 6d 70 6f 6c 69 6e 65 5f 61 64 64 72 65  trampoline_addre
0520: 73 73 28 61 64 64 72 65 73 73 29 20 20 20 20 20  ss(address)     
0530: 20 20 20 20 26 26 20 28 63 61 6c 6c 62 61 63 6b      && (callback
0540: 5f 61 64 64 72 65 73 73 28 61 64 64 72 65 73 73  _address(address
0550: 29 0a 20 20 20 20 20 3d 3d 20 28 5f 5f 54 52 5f  ).     == (__TR_
0560: 66 75 6e 63 74 69 6f 6e 29 26 76 61 63 61 6c 6c  function)&vacall
0570: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  )              =
0580: 3d 20 26 6d 79 63 61 6c 6c 62 61 63 6b 29 0a 20  = &mycallback). 
0590: 26 26 20 28 74 72 61 6d 70 6f 6c 69 6e 65 5f 76  && (trampoline_v
05a0: 61 72 69 61 62 6c 65 28 61 64 64 72 65 73 73 29  ariable(address)
05b0: 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 3d 3d         ).     ==
05c0: 20 26 74 72 61 6d 70 76 61 72 29 0a 29 0a 0a 76   &trampvar).)..v
05d0: 6f 69 64 2a 20 64 61 74 61 20 3d 20 74 72 61 6d  oid* data = tram
05e0: 70 6f 6c 69 6e 65 5f 64 61 74 61 28 61 64 64 72  poline_data(addr
05f0: 65 73 73 29 3b 20 20 76 6f 69 64 2a 20 64 61 74  ess);  void* dat
0600: 61 20 3d 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  a = callback_dat
0610: 61 28 61 64 64 72 65 73 73 29 3b 0a 0a 20 20 20  a(address);..   
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0630: 20 20 20 20 20 20 2d 2d 20 44 65 61 6c 6c 6f 63        -- Dealloc
0640: 61 74 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  ating a callback
0650: 20 2d 2d 0a 0a 66 72 65 65 5f 74 72 61 6d 70 6f   --..free_trampo
0660: 6c 69 6e 65 28 61 64 64 72 65 73 73 29 3b 20 20  line(address);  
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 65               fre
0680: 65 5f 63 61 6c 6c 62 61 63 6b 28 61 64 64 72 65  e_callback(addre
0690: 73 73 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ss);..          
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06b0: 20 20 20 20 20 20 2d 2d 20 4c 69 62 72 61 72 69        -- Librari
06c0: 65 73 20 2d 2d 0a 0a 6c 69 62 76 61 63 61 6c 6c  es --..libvacall
06d0: 2e 61 20 6c 69 62 74 72 61 6d 70 6f 6c 69 6e 65  .a libtrampoline
06e0: 2e 61 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .a             l
06f0: 69 62 63 61 6c 6c 62 61 63 6b 2e 61 0a 0a        ibcallback.a..