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..