diff options
| author | David Jones | 2005-02-07 14:50:11 +0000 |
|---|---|---|
| committer | David Jones | 2005-02-07 14:50:11 +0000 |
| commit | 424ffbc8569a324e742c143ff9e1b88e47f9091b (patch) | |
| tree | 43f2363fdaf580f943f1f9f5c5e892214ada8c4c /mps/code | |
| parent | f5bbad02d7af33494fd776bbf49119eac26cfb17 (diff) | |
| download | emacs-424ffbc8569a324e742c143ff9e1b88e47f9091b.tar.gz emacs-424ffbc8569a324e742c143ff9e1b88e47f9091b.zip | |
Mps: mpslib via client callbacks. mpslib.c
Copied from Perforce
Change: 143314
ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/comm.gmk | 71 | ||||
| -rw-r--r-- | mps/code/libcbt.c | 69 | ||||
| -rw-r--r-- | mps/code/mpslibcb.c | 316 | ||||
| -rw-r--r-- | mps/code/mpslibcb.h | 58 | ||||
| -rw-r--r-- | mps/code/xcppgc.gmk | 2 |
5 files changed, 483 insertions, 33 deletions
diff --git a/mps/code/comm.gmk b/mps/code/comm.gmk index b9057e678dc..13e313fc16e 100644 --- a/mps/code/comm.gmk +++ b/mps/code/comm.gmk | |||
| @@ -268,7 +268,7 @@ all: mpmss sacss amcss amcsshe amsss amssshe segsmss awlut awluthe \ | |||
| 268 | mpsicv lockcov poolncv locv qs apss \ | 268 | mpsicv lockcov poolncv locv qs apss \ |
| 269 | finalcv finaltest arenacv bttest teletest \ | 269 | finalcv finaltest arenacv bttest teletest \ |
| 270 | abqtest cbstest btcv mv2test messtest steptest \ | 270 | abqtest cbstest btcv mv2test messtest steptest \ |
| 271 | eventcnv walkt0 \ | 271 | eventcnv walkt0 libcbt \ |
| 272 | mps.a | 272 | mps.a |
| 273 | 273 | ||
| 274 | swall: mmsw.a replaysw | 274 | swall: mmsw.a replaysw |
| @@ -293,6 +293,7 @@ mpmss sacss amcss amcssth amcsshe amsss amssshe segsmss awlut awlutth \ | |||
| 293 | awluthe mpsicv lockcov poolncv locv qs apss \ | 293 | awluthe mpsicv lockcov poolncv locv qs apss \ |
| 294 | finalcv finaltest arenacv bttest teletest \ | 294 | finalcv finaltest arenacv bttest teletest \ |
| 295 | expt825 \ | 295 | expt825 \ |
| 296 | libcbt \ | ||
| 296 | abqtest cbstest btcv mv2test \ | 297 | abqtest cbstest btcv mv2test \ |
| 297 | messtest steptest \ | 298 | messtest steptest \ |
| 298 | walkt0 \ | 299 | walkt0 \ |
| @@ -349,98 +350,103 @@ endif | |||
| 349 | ifdef VARIETY | 350 | ifdef VARIETY |
| 350 | 351 | ||
| 351 | $(PFM)/$(VARIETY)/finalcv: $(PFM)/$(VARIETY)/finalcv.o \ | 352 | $(PFM)/$(VARIETY)/finalcv: $(PFM)/$(VARIETY)/finalcv.o \ |
| 352 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 353 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 353 | 354 | ||
| 354 | $(PFM)/$(VARIETY)/finaltest: $(PFM)/$(VARIETY)/finaltest.o \ | 355 | $(PFM)/$(VARIETY)/finaltest: $(PFM)/$(VARIETY)/finaltest.o \ |
| 355 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 356 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 356 | 357 | ||
| 357 | $(PFM)/$(VARIETY)/expt825: $(PFM)/$(VARIETY)/expt825.o \ | 358 | $(PFM)/$(VARIETY)/expt825: $(PFM)/$(VARIETY)/expt825.o \ |
| 358 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 359 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 360 | |||
| 361 | $(PFM)/$(VARIETY)/libcbt: $(PFM)/$(VARIETY)/libcbt.o \ | ||
| 362 | $(PFM)/$(VARIETY)/mpslibcb.o \ | ||
| 363 | $(PFM)/$(VARIETY)/mpsioan.o \ | ||
| 364 | $(MPMOBJ) $(TESTLIBOBJ) | ||
| 359 | 365 | ||
| 360 | $(PFM)/$(VARIETY)/locv: $(PFM)/$(VARIETY)/locv.o \ | 366 | $(PFM)/$(VARIETY)/locv: $(PFM)/$(VARIETY)/locv.o \ |
| 361 | $(MPMOBJ) $(LOOBJ) $(TESTLIBOBJ) | 367 | $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(TESTLIBOBJ) |
| 362 | 368 | ||
| 363 | $(PFM)/$(VARIETY)/mpmss: $(PFM)/$(VARIETY)/mpmss.o \ | 369 | $(PFM)/$(VARIETY)/mpmss: $(PFM)/$(VARIETY)/mpmss.o \ |
| 364 | $(MPMOBJ) $(MVFFOBJ) $(TESTLIBOBJ) | 370 | $(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ) |
| 365 | 371 | ||
| 366 | $(PFM)/$(VARIETY)/apss: $(PFM)/$(VARIETY)/apss.o \ | 372 | $(PFM)/$(VARIETY)/apss: $(PFM)/$(VARIETY)/apss.o \ |
| 367 | $(MPMOBJ) $(MVFFOBJ) $(TESTLIBOBJ) | 373 | $(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ) |
| 368 | 374 | ||
| 369 | $(PFM)/$(VARIETY)/sacss: $(PFM)/$(VARIETY)/sacss.o \ | 375 | $(PFM)/$(VARIETY)/sacss: $(PFM)/$(VARIETY)/sacss.o \ |
| 370 | $(MPMOBJ) $(MVFFOBJ) $(TESTLIBOBJ) | 376 | $(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ) |
| 371 | 377 | ||
| 372 | $(PFM)/$(VARIETY)/bttest: $(PFM)/$(VARIETY)/bttest.o \ | 378 | $(PFM)/$(VARIETY)/bttest: $(PFM)/$(VARIETY)/bttest.o \ |
| 373 | $(MPMOBJ) $(TESTLIBOBJ) | 379 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 374 | 380 | ||
| 375 | $(PFM)/$(VARIETY)/teletest: $(PFM)/$(VARIETY)/teletest.o \ | 381 | $(PFM)/$(VARIETY)/teletest: $(PFM)/$(VARIETY)/teletest.o \ |
| 376 | $(MPMOBJ) $(TESTLIBOBJ) | 382 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 377 | 383 | ||
| 378 | $(PFM)/$(VARIETY)/lockcov: $(PFM)/$(VARIETY)/lockcov.o \ | 384 | $(PFM)/$(VARIETY)/lockcov: $(PFM)/$(VARIETY)/lockcov.o \ |
| 379 | $(MPMOBJ) $(TESTLIBOBJ) | 385 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 380 | 386 | ||
| 381 | $(PFM)/$(VARIETY)/mpsicv: $(PFM)/$(VARIETY)/mpsicv.o \ | 387 | $(PFM)/$(VARIETY)/mpsicv: $(PFM)/$(VARIETY)/mpsicv.o \ |
| 382 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 388 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 383 | 389 | ||
| 384 | $(PFM)/$(VARIETY)/amcss: $(PFM)/$(VARIETY)/amcss.o \ | 390 | $(PFM)/$(VARIETY)/amcss: $(PFM)/$(VARIETY)/amcss.o \ |
| 385 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 391 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 386 | 392 | ||
| 387 | $(PFM)/$(VARIETY)/amcssth: $(PFM)/$(VARIETY)/amcssth.o \ | 393 | $(PFM)/$(VARIETY)/amcssth: $(PFM)/$(VARIETY)/amcssth.o \ |
| 388 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 394 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 389 | 395 | ||
| 390 | $(PFM)/$(VARIETY)/amcsshe: $(PFM)/$(VARIETY)/amcsshe.o \ | 396 | $(PFM)/$(VARIETY)/amcsshe: $(PFM)/$(VARIETY)/amcsshe.o \ |
| 391 | $(FMTHETSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 397 | $(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 392 | 398 | ||
| 393 | $(PFM)/$(VARIETY)/amsss: $(PFM)/$(VARIETY)/amsss.o \ | 399 | $(PFM)/$(VARIETY)/amsss: $(PFM)/$(VARIETY)/amsss.o \ |
| 394 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMSOBJ) $(TESTLIBOBJ) | 400 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ) |
| 395 | 401 | ||
| 396 | $(PFM)/$(VARIETY)/amssshe: $(PFM)/$(VARIETY)/amssshe.o \ | 402 | $(PFM)/$(VARIETY)/amssshe: $(PFM)/$(VARIETY)/amssshe.o \ |
| 397 | $(FMTHETSTOBJ) $(MPMOBJ) $(AMSOBJ) $(TESTLIBOBJ) | 403 | $(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ) |
| 398 | 404 | ||
| 399 | $(PFM)/$(VARIETY)/segsmss: $(PFM)/$(VARIETY)/segsmss.o \ | 405 | $(PFM)/$(VARIETY)/segsmss: $(PFM)/$(VARIETY)/segsmss.o \ |
| 400 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMSOBJ) $(TESTLIBOBJ) | 406 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ) |
| 401 | 407 | ||
| 402 | $(PFM)/$(VARIETY)/awlut: $(PFM)/$(VARIETY)/awlut.o \ | 408 | $(PFM)/$(VARIETY)/awlut: $(PFM)/$(VARIETY)/awlut.o \ |
| 403 | $(FMTDYTSTOBJ) $(MPMOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) | 409 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) |
| 404 | 410 | ||
| 405 | $(PFM)/$(VARIETY)/awluthe: $(PFM)/$(VARIETY)/awluthe.o \ | 411 | $(PFM)/$(VARIETY)/awluthe: $(PFM)/$(VARIETY)/awluthe.o \ |
| 406 | $(FMTHETSTOBJ) $(MPMOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) | 412 | $(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) |
| 407 | 413 | ||
| 408 | $(PFM)/$(VARIETY)/awlutth: $(PFM)/$(VARIETY)/awlutth.o \ | 414 | $(PFM)/$(VARIETY)/awlutth: $(PFM)/$(VARIETY)/awlutth.o \ |
| 409 | $(FMTDYTSTOBJ) $(MPMOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) | 415 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ) |
| 410 | 416 | ||
| 411 | $(PFM)/$(VARIETY)/poolncv: $(PFM)/$(VARIETY)/poolncv.o \ | 417 | $(PFM)/$(VARIETY)/poolncv: $(PFM)/$(VARIETY)/poolncv.o \ |
| 412 | $(MPMOBJ) $(TESTLIBOBJ) $(POOLNOBJ) | 418 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(POOLNOBJ) |
| 413 | 419 | ||
| 414 | $(PFM)/$(VARIETY)/qs: $(PFM)/$(VARIETY)/qs.o \ | 420 | $(PFM)/$(VARIETY)/qs: $(PFM)/$(VARIETY)/qs.o \ |
| 415 | $(AMCOBJ) $(MPMOBJ) $(TESTLIBOBJ) | 421 | $(AMCOBJ) $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 416 | 422 | ||
| 417 | $(PFM)/$(VARIETY)/arenacv: $(PFM)/$(VARIETY)/arenacv.o \ | 423 | $(PFM)/$(VARIETY)/arenacv: $(PFM)/$(VARIETY)/arenacv.o \ |
| 418 | $(MPMOBJ) $(TESTLIBOBJ) | 424 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 419 | 425 | ||
| 420 | $(PFM)/$(VARIETY)/abqtest: $(PFM)/$(VARIETY)/abqtest.o \ | 426 | $(PFM)/$(VARIETY)/abqtest: $(PFM)/$(VARIETY)/abqtest.o \ |
| 421 | $(PFM)/$(VARIETY)/abq.o $(MPMOBJ) $(TESTLIBOBJ) | 427 | $(PFM)/$(VARIETY)/abq.o $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 422 | 428 | ||
| 423 | $(PFM)/$(VARIETY)/cbstest: $(PFM)/$(VARIETY)/cbstest.o \ | 429 | $(PFM)/$(VARIETY)/cbstest: $(PFM)/$(VARIETY)/cbstest.o \ |
| 424 | $(MPMOBJ) $(TESTLIBOBJ) | 430 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 425 | 431 | ||
| 426 | $(PFM)/$(VARIETY)/btcv: $(PFM)/$(VARIETY)/btcv.o \ | 432 | $(PFM)/$(VARIETY)/btcv: $(PFM)/$(VARIETY)/btcv.o \ |
| 427 | $(MPMOBJ) $(TESTLIBOBJ) | 433 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 428 | 434 | ||
| 429 | $(PFM)/$(VARIETY)/mv2test: $(PFM)/$(VARIETY)/mv2test.o \ | 435 | $(PFM)/$(VARIETY)/mv2test: $(PFM)/$(VARIETY)/mv2test.o \ |
| 430 | $(PFM)/$(VARIETY)/poolmv2.o $(PFM)/$(VARIETY)/abq.o \ | 436 | $(PFM)/$(VARIETY)/poolmv2.o $(PFM)/$(VARIETY)/abq.o \ |
| 431 | $(MPMOBJ) $(TESTLIBOBJ) | 437 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 432 | 438 | ||
| 433 | $(PFM)/$(VARIETY)/messtest: $(PFM)/$(VARIETY)/messtest.o \ | 439 | $(PFM)/$(VARIETY)/messtest: $(PFM)/$(VARIETY)/messtest.o \ |
| 434 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) | 440 | $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) |
| 435 | 441 | ||
| 436 | $(PFM)/$(VARIETY)/steptest: $(PFM)/$(VARIETY)/steptest.o \ | 442 | $(PFM)/$(VARIETY)/steptest: $(PFM)/$(VARIETY)/steptest.o \ |
| 437 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 443 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 438 | 444 | ||
| 439 | $(PFM)/$(VARIETY)/walkt0: $(PFM)/$(VARIETY)/walkt0.o \ | 445 | $(PFM)/$(VARIETY)/walkt0: $(PFM)/$(VARIETY)/walkt0.o \ |
| 440 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 446 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 441 | 447 | ||
| 442 | $(PFM)/$(VARIETY)/exposet0: $(PFM)/$(VARIETY)/exposet0.o \ | 448 | $(PFM)/$(VARIETY)/exposet0: $(PFM)/$(VARIETY)/exposet0.o \ |
| 443 | $(FMTDYTSTOBJ) $(MPMOBJ) $(AMCOBJ) $(TESTLIBOBJ) | 449 | $(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ) |
| 444 | 450 | ||
| 445 | $(PFM)/$(VARIETY)/eventcnv: $(PFM)/$(VARIETY)/eventcnv.o \ | 451 | $(PFM)/$(VARIETY)/eventcnv: $(PFM)/$(VARIETY)/eventcnv.o \ |
| 446 | $(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o | 452 | $(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o |
| @@ -448,7 +454,8 @@ $(PFM)/$(VARIETY)/eventcnv: $(PFM)/$(VARIETY)/eventcnv.o \ | |||
| 448 | $(PFM)/$(VARIETY)/replay: $(PFM)/$(VARIETY)/replay.o \ | 454 | $(PFM)/$(VARIETY)/replay: $(PFM)/$(VARIETY)/replay.o \ |
| 449 | $(PFM)/$(VARIETY)/eventrep.o \ | 455 | $(PFM)/$(VARIETY)/eventrep.o \ |
| 450 | $(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o \ | 456 | $(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o \ |
| 451 | $(MPMOBJ) $(AWLOBJ) $(AMSOBJ) $(POOLNOBJ) $(AMCOBJ) $(SNCOBJ) $(MVFFOBJ) | 457 | $(MPMOBJ) $(PLINTHOBJ) $(AWLOBJ) $(AMSOBJ) $(POOLNOBJ) \ |
| 458 | $(AMCOBJ) $(SNCOBJ) $(MVFFOBJ) | ||
| 452 | 459 | ||
| 453 | $(PFM)/$(VARIETY)/mps.a: $(MPMOBJ) $(AMCOBJ) $(SNCOBJ) $(MVFFOBJ) | 460 | $(PFM)/$(VARIETY)/mps.a: $(MPMOBJ) $(AMCOBJ) $(SNCOBJ) $(MVFFOBJ) |
| 454 | 461 | ||
diff --git a/mps/code/libcbt.c b/mps/code/libcbt.c new file mode 100644 index 00000000000..a865795f19c --- /dev/null +++ b/mps/code/libcbt.c | |||
| @@ -0,0 +1,69 @@ | |||
| 1 | /* libcbt: MPS LIBRARY CALLBACK TEST | ||
| 2 | * | ||
| 3 | * $Header$ | ||
| 4 | * Copyright (C) 2005 Ravenbrook Limited. See end of file for license. | ||
| 5 | * | ||
| 6 | * This is a simple test of the MPS Library Callback interface | ||
| 7 | * (mpslibcb.h). */ | ||
| 8 | |||
| 9 | #include "mps.h" | ||
| 10 | #include "mpsavm.h" | ||
| 11 | #include "mpslib.h" | ||
| 12 | #include "mpslibcb.h" | ||
| 13 | |||
| 14 | #include "testlib.h" | ||
| 15 | |||
| 16 | #include <stdio.h> | ||
| 17 | #include <stdlib.h> | ||
| 18 | |||
| 19 | void libcbt_assert_fail(const char *); | ||
| 20 | mps_clock_t libcbt_clock(void); | ||
| 21 | |||
| 22 | int main(void) | ||
| 23 | { | ||
| 24 | int res; | ||
| 25 | int defects = 0; | ||
| 26 | mps_arena_t arena; | ||
| 27 | |||
| 28 | res = mps_lib_callback_register("not a callback", (void(*)(void))0); | ||
| 29 | if(MPS_RES_OK == res) { | ||
| 30 | printf("mps_lib_callback_register claims to successfully register\n" | ||
| 31 | "an interface that does not exist.\n"); | ||
| 32 | ++ defects; | ||
| 33 | } | ||
| 34 | die(mps_lib_callback_register("mps_lib_assert_fail", | ||
| 35 | (void(*)(void))libcbt_assert_fail), | ||
| 36 | "register assert_fail"); | ||
| 37 | /* The following functions are registered in the order that you get by | ||
| 38 | * providing no functions and then providing functions as they are | ||
| 39 | * required by assertionn failures. | ||
| 40 | * Interestingly, for this very simple test, only mps_clock is | ||
| 41 | * required. */ | ||
| 42 | die(mps_lib_callback_register("mps_clock", | ||
| 43 | (mps_lib_function_t)libcbt_clock), | ||
| 44 | "register clock"); | ||
| 45 | die(mps_arena_create(&arena, mps_arena_class_vm(), 1000*1000), | ||
| 46 | "mps_arena_create"); | ||
| 47 | if(defects) { | ||
| 48 | printf("Conclusion: Defects detected.\n"); | ||
| 49 | } else { | ||
| 50 | printf("Conclusion: Failed to find any defects.\n"); | ||
| 51 | } | ||
| 52 | return 0; | ||
| 53 | } | ||
| 54 | |||
| 55 | void libcbt_assert_fail(const char *message) | ||
| 56 | { | ||
| 57 | fflush(stdout); | ||
| 58 | fprintf(stderr, "\nMPS ASSERTION FAILURE (TEST): %s\n", message); | ||
| 59 | fflush(stderr); | ||
| 60 | abort(); | ||
| 61 | } | ||
| 62 | |||
| 63 | mps_clock_t libcbt_clock(void) | ||
| 64 | { | ||
| 65 | static mps_clock_t c = 0; | ||
| 66 | |||
| 67 | ++ c; | ||
| 68 | return c; | ||
| 69 | } | ||
diff --git a/mps/code/mpslibcb.c b/mps/code/mpslibcb.c new file mode 100644 index 00000000000..ec1b154f372 --- /dev/null +++ b/mps/code/mpslibcb.c | |||
| @@ -0,0 +1,316 @@ | |||
| 1 | /* mpslibcb.c: RAVENBROOK MEMORY POOL SYSTEM LIBRARY INTERFACE (CALLBACK) | ||
| 2 | * | ||
| 3 | * $Header$ | ||
| 4 | * Copyright (c) 2005 Ravenbrook Limited. See end of file for license. | ||
| 5 | * | ||
| 6 | * .purpose: The purpose of this code is | ||
| 7 | * 1. permit the MPS Library Interface to be used conveniently when | ||
| 8 | * the MPS is packaged as a dynamic library (and in particular a | ||
| 9 | * Windows DLL). | ||
| 10 | * | ||
| 11 | * .readership: For MPS client application developers and MPS developers. | ||
| 12 | * .sources: <design/lib/> | ||
| 13 | * | ||
| 14 | * .freestanding: This is designed to be deployed in a freestanding | ||
| 15 | * environment, so we can't use strcmp from <string.h>, so we have to | ||
| 16 | * roll our own (in fact we only ever need equality so we define a | ||
| 17 | * simpler interface). | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include "mpslibcb.h" | ||
| 21 | #include "mpslib.h" | ||
| 22 | #include "mpm.h" | ||
| 23 | |||
| 24 | /* Forward declarations. */ | ||
| 25 | |||
| 26 | int mps_lib_callback_default_get_EOF(void); | ||
| 27 | mps_lib_FILE *mps_lib_callback_default_get_stderr(void); | ||
| 28 | mps_lib_FILE *mps_lib_callback_default_get_stdout(void); | ||
| 29 | int mps_lib_callback_default_fputc(int c_, mps_lib_FILE *f_); | ||
| 30 | int mps_lib_callback_default_fputs(const char *s_, mps_lib_FILE *f_); | ||
| 31 | void *mps_lib_callback_default_memset(void *p_, int c_, size_t n_); | ||
| 32 | void *mps_lib_callback_default_memcpy(void *p_, const void *q_, size_t n_); | ||
| 33 | int mps_lib_callback_default_memcmp(const void *p_, const void *q_, size_t n_); | ||
| 34 | mps_clock_t mps_lib_callback_default_clock(void); | ||
| 35 | mps_clock_t mps_lib_callback_default_clocks_per_sec(void); | ||
| 36 | unsigned long mps_lib_callback_default_telemetry_control(void); | ||
| 37 | int mps_lib_callback_streq(const char *, const char *); | ||
| 38 | |||
| 39 | #define EQ(p, q) (mps_lib_callback_streq((p), (q))) | ||
| 40 | |||
| 41 | struct mps_lib_callback_s | ||
| 42 | { | ||
| 43 | int (*lib_get_EOF)(void); | ||
| 44 | mps_lib_FILE * (*lib_get_stderr)(void); | ||
| 45 | mps_lib_FILE * (*lib_get_stdout)(void); | ||
| 46 | int (*lib_fputc)(int, mps_lib_FILE *); | ||
| 47 | int (*lib_fputs)(const char *, mps_lib_FILE *); | ||
| 48 | void (*lib_assert_fail)(const char *); | ||
| 49 | void * (*lib_memset)(void *, int, size_t); | ||
| 50 | void * (*lib_memcpy)(void *, const void *, size_t); | ||
| 51 | int (*lib_memcmp)(const void *, const void *, size_t); | ||
| 52 | mps_clock_t (*clock)(void); | ||
| 53 | mps_clock_t (*clocks_per_sec)(void); | ||
| 54 | unsigned long (*lib_telemetry_control)(void); | ||
| 55 | }; | ||
| 56 | |||
| 57 | /* The default functions are stubs that assert. Except for the | ||
| 58 | * assert_fail function (which is called when assertions fail) which | ||
| 59 | * will be NULL. This means: if you provide assert_fail and forget | ||
| 60 | * something else, you'll know about it. If you do not provide | ||
| 61 | * assert_fail then it will probably stop anyway. | ||
| 62 | * | ||
| 63 | * These functions really do need to fail even if checks are off | ||
| 64 | * (CHECK_NONE), so we reach under the hood of check.h and call ASSERT | ||
| 65 | * directly. */ | ||
| 66 | |||
| 67 | struct mps_lib_callback_s mps_lib_callback_global = { | ||
| 68 | mps_lib_callback_default_get_EOF, | ||
| 69 | mps_lib_callback_default_get_stderr, | ||
| 70 | mps_lib_callback_default_get_stdout, | ||
| 71 | mps_lib_callback_default_fputc, | ||
| 72 | mps_lib_callback_default_fputs, | ||
| 73 | NULL, /* assert_fail */ | ||
| 74 | mps_lib_callback_default_memset, | ||
| 75 | mps_lib_callback_default_memcpy, | ||
| 76 | mps_lib_callback_default_memcmp, | ||
| 77 | mps_lib_callback_default_clock, | ||
| 78 | mps_lib_callback_default_clocks_per_sec, | ||
| 79 | mps_lib_callback_default_telemetry_control | ||
| 80 | }; | ||
| 81 | |||
| 82 | int mps_lib_callback_register(const char *name, mps_lib_function_t f) | ||
| 83 | { | ||
| 84 | if(NULL == name) { | ||
| 85 | return ResFAIL; | ||
| 86 | } | ||
| 87 | if(0) { | ||
| 88 | /* just to make the "else if" neater. */ | ||
| 89 | } else if(EQ(name, "mps_lib_get_EOF")) { | ||
| 90 | mps_lib_callback_global.lib_get_EOF = (int(*)(void))f; | ||
| 91 | } else if(EQ(name, "mps_lib_get_stderr")) { | ||
| 92 | mps_lib_callback_global.lib_get_stderr = (mps_lib_FILE *(*)(void))f; | ||
| 93 | } else if(EQ(name, "mps_lib_get_stdout")) { | ||
| 94 | mps_lib_callback_global.lib_get_stdout = (mps_lib_FILE *(*)(void))f; | ||
| 95 | } else if(EQ(name, "mps_lib_fputc")) { | ||
| 96 | mps_lib_callback_global.lib_fputc = (int(*)(int, mps_lib_FILE *))f; | ||
| 97 | } else if(EQ(name, "mps_lib_fputs")) { | ||
| 98 | mps_lib_callback_global.lib_fputs = | ||
| 99 | (int(*)(const char *, mps_lib_FILE *))f; | ||
| 100 | } else if(EQ(name, "mps_lib_assert_fail")) { | ||
| 101 | mps_lib_callback_global.lib_assert_fail = (void(*)(const char *))f; | ||
| 102 | } else if(EQ(name, "mps_lib_memset")) { | ||
| 103 | mps_lib_callback_global.lib_memset = (void *(*)(void *, int, size_t))f; | ||
| 104 | } else if(EQ(name, "mps_lib_memcpy")) { | ||
| 105 | mps_lib_callback_global.lib_memcpy = | ||
| 106 | (void *(*)(void *, const void *, size_t))f; | ||
| 107 | } else if(EQ(name, "mps_lib_memcmp")) { | ||
| 108 | mps_lib_callback_global.lib_memcmp = | ||
| 109 | (int(*)(const void *, const void *, size_t))f; | ||
| 110 | } else if(EQ(name, "mps_clock")) { | ||
| 111 | mps_lib_callback_global.clock = (mps_clock_t(*)(void))f; | ||
| 112 | } else if(EQ(name, "mps_clocks_per_sec")) { | ||
| 113 | mps_lib_callback_global.clocks_per_sec = (mps_clock_t(*)(void))f; | ||
| 114 | } else if(EQ(name, "mps_lib_telemetry_control")) { | ||
| 115 | mps_lib_callback_global.lib_telemetry_control = | ||
| 116 | (unsigned long(*)(void))f; | ||
| 117 | } else { | ||
| 118 | return ResUNIMPL; | ||
| 119 | } | ||
| 120 | return ResOK; | ||
| 121 | } | ||
| 122 | |||
| 123 | /* Return non-zero if and only if string p equals string q. */ | ||
| 124 | int mps_lib_callback_streq(const char *p, const char *q) | ||
| 125 | { | ||
| 126 | do { | ||
| 127 | if(*p == '\0' && *q == '\0') { | ||
| 128 | return 1; | ||
| 129 | } | ||
| 130 | } while(*p++ == *q++); | ||
| 131 | return 0; | ||
| 132 | } | ||
| 133 | |||
| 134 | int mps_lib_callback_default_get_EOF(void) | ||
| 135 | { | ||
| 136 | ASSERT(0, "mps_lib_get_EOF needs to be provided"); | ||
| 137 | return 0; | ||
| 138 | } | ||
| 139 | |||
| 140 | mps_lib_FILE *mps_lib_callback_default_get_stderr(void) | ||
| 141 | { | ||
| 142 | ASSERT(0, "mps_lib_get_stderr needs to be provided"); | ||
| 143 | return NULL; | ||
| 144 | } | ||
| 145 | |||
| 146 | mps_lib_FILE *mps_lib_callback_default_get_stdout(void) | ||
| 147 | { | ||
| 148 | ASSERT(0, "mps_lib_get_stdout needs to be provided"); | ||
| 149 | return NULL; | ||
| 150 | } | ||
| 151 | |||
| 152 | int mps_lib_callback_default_fputc(int c_, mps_lib_FILE *f_) | ||
| 153 | { | ||
| 154 | UNUSED(c_); | ||
| 155 | UNUSED(f_); | ||
| 156 | ASSERT(0, "mps_lib_fputc needs to be provided"); | ||
| 157 | return 0; | ||
| 158 | } | ||
| 159 | |||
| 160 | int mps_lib_callback_default_fputs(const char *s_, mps_lib_FILE *f_) | ||
| 161 | { | ||
| 162 | UNUSED(s_); | ||
| 163 | UNUSED(f_); | ||
| 164 | ASSERT(0, "mps_lib_fputs needs to be provided"); | ||
| 165 | return 0; | ||
| 166 | } | ||
| 167 | |||
| 168 | /* No default implementation for mps_lib_assert_fail */ | ||
| 169 | |||
| 170 | void *mps_lib_callback_default_memset(void *p_, int c_, size_t n_) | ||
| 171 | { | ||
| 172 | UNUSED(p_); | ||
| 173 | UNUSED(c_); | ||
| 174 | UNUSED(n_); | ||
| 175 | ASSERT(0, "mps_lib_memset needs to be provided"); | ||
| 176 | return NULL; | ||
| 177 | } | ||
| 178 | |||
| 179 | void *mps_lib_callback_default_memcpy(void *p_, const void *q_, size_t n_) | ||
| 180 | { | ||
| 181 | UNUSED(p_); | ||
| 182 | UNUSED(q_); | ||
| 183 | UNUSED(n_); | ||
| 184 | ASSERT(0, "mps_lib_memcpy needs to be provided"); | ||
| 185 | return NULL; | ||
| 186 | } | ||
| 187 | |||
| 188 | int mps_lib_callback_default_memcmp(const void *p_, const void *q_, size_t n_) | ||
| 189 | { | ||
| 190 | UNUSED(p_); | ||
| 191 | UNUSED(q_); | ||
| 192 | UNUSED(n_); | ||
| 193 | ASSERT(0, "mps_lib_memcmp needs to be provided"); | ||
| 194 | return 0; | ||
| 195 | } | ||
| 196 | |||
| 197 | mps_clock_t mps_lib_callback_default_clock(void) | ||
| 198 | { | ||
| 199 | ASSERT(0, "mps_clock needs to be provided"); | ||
| 200 | return 0; | ||
| 201 | } | ||
| 202 | |||
| 203 | mps_clock_t mps_lib_callback_default_clocks_per_sec(void) | ||
| 204 | { | ||
| 205 | ASSERT(0, "mps_clocks_per_sec needs to be provided"); | ||
| 206 | return 0; | ||
| 207 | } | ||
| 208 | |||
| 209 | unsigned long mps_lib_callback_default_telemetry_control(void) | ||
| 210 | { | ||
| 211 | ASSERT(0, "mps_lib_telemetry_control needs to be provided"); | ||
| 212 | return 0; | ||
| 213 | } | ||
| 214 | |||
| 215 | int mps_lib_get_EOF(void) | ||
| 216 | { | ||
| 217 | return mps_lib_callback_global.lib_get_EOF(); | ||
| 218 | } | ||
| 219 | |||
| 220 | mps_lib_FILE *mps_lib_get_stderr(void) | ||
| 221 | { | ||
| 222 | return mps_lib_callback_global.lib_get_stderr(); | ||
| 223 | } | ||
| 224 | |||
| 225 | mps_lib_FILE *mps_lib_get_stdout(void) | ||
| 226 | { | ||
| 227 | return mps_lib_callback_global.lib_get_stdout(); | ||
| 228 | } | ||
| 229 | |||
| 230 | int mps_lib_fputc(int c, mps_lib_FILE *f) | ||
| 231 | { | ||
| 232 | return mps_lib_callback_global.lib_fputc(c, f); | ||
| 233 | } | ||
| 234 | |||
| 235 | int mps_lib_fputs(const char *s, mps_lib_FILE *f) | ||
| 236 | { | ||
| 237 | return mps_lib_callback_global.lib_fputs(s, f); | ||
| 238 | } | ||
| 239 | |||
| 240 | void mps_lib_assert_fail(const char *m) | ||
| 241 | { | ||
| 242 | mps_lib_callback_global.lib_assert_fail(m); | ||
| 243 | } | ||
| 244 | |||
| 245 | void *(mps_lib_memset)(void *p, int c, size_t n) | ||
| 246 | { | ||
| 247 | return mps_lib_callback_global.lib_memset(p, c, n); | ||
| 248 | } | ||
| 249 | |||
| 250 | void *(mps_lib_memcpy)(void *p, const void *q, size_t n) | ||
| 251 | { | ||
| 252 | return mps_lib_callback_global.lib_memcpy(p, q, n); | ||
| 253 | } | ||
| 254 | |||
| 255 | int (mps_lib_memcmp)(const void *p, const void *q, size_t n) | ||
| 256 | { | ||
| 257 | return mps_lib_callback_global.lib_memcmp(p, q, n); | ||
| 258 | } | ||
| 259 | |||
| 260 | mps_clock_t mps_clock(void) | ||
| 261 | { | ||
| 262 | return mps_lib_callback_global.clock(); | ||
| 263 | } | ||
| 264 | |||
| 265 | mps_clock_t mps_clocks_per_sec(void) | ||
| 266 | { | ||
| 267 | return mps_lib_callback_global.clocks_per_sec(); | ||
| 268 | } | ||
| 269 | |||
| 270 | unsigned long mps_lib_telemetry_control(void) | ||
| 271 | { | ||
| 272 | return mps_lib_callback_global.lib_telemetry_control(); | ||
| 273 | } | ||
| 274 | |||
| 275 | |||
| 276 | |||
| 277 | /* C. COPYRIGHT AND LICENSE | ||
| 278 | * | ||
| 279 | * Copyright (C) 2005 Ravenbrook Limited <http://www.ravenbrook.com/>. | ||
| 280 | * All rights reserved. This is an open source license. Contact | ||
| 281 | * Ravenbrook for commercial licensing options. | ||
| 282 | * | ||
| 283 | * Redistribution and use in source and binary forms, with or without | ||
| 284 | * modification, are permitted provided that the following conditions are | ||
| 285 | * met: | ||
| 286 | * | ||
| 287 | * 1. Redistributions of source code must retain the above copyright | ||
| 288 | * notice, this list of conditions and the following disclaimer. | ||
| 289 | * | ||
| 290 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 291 | * notice, this list of conditions and the following disclaimer in the | ||
| 292 | * documentation and/or other materials provided with the distribution. | ||
| 293 | * | ||
| 294 | * 3. Redistributions in any form must be accompanied by information on how | ||
| 295 | * to obtain complete source code for this software and any accompanying | ||
| 296 | * software that uses this software. The source code must either be | ||
| 297 | * included in the distribution or be available for no more than the cost | ||
| 298 | * of distribution plus a nominal fee, and must be freely redistributable | ||
| 299 | * under reasonable conditions. For an executable file, complete source | ||
| 300 | * code means the source code for all modules it contains. It does not | ||
| 301 | * include source code for modules or files that typically accompany the | ||
| 302 | * major components of the operating system on which the executable file | ||
| 303 | * runs. | ||
| 304 | * | ||
| 305 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | ||
| 306 | * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||
| 307 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR | ||
| 308 | * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 309 | * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 310 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 311 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
| 312 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
| 313 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 314 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
| 315 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 316 | */ | ||
diff --git a/mps/code/mpslibcb.h b/mps/code/mpslibcb.h new file mode 100644 index 00000000000..140448e2482 --- /dev/null +++ b/mps/code/mpslibcb.h | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | /* mpslibcb.h: RAVENBROOK MEMORY POOL SYSTEM LIBRARY CALLBACK INTERFACE | ||
| 2 | * | ||
| 3 | * $Header$ | ||
| 4 | * Copyright (c) 2005 Ravenbrook Limited. See end of file for license. | ||
| 5 | * | ||
| 6 | * .readership: MPS client application developers, MPS developers. | ||
| 7 | * | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef mpslibcb_h | ||
| 11 | #define mpslibcb_h | ||
| 12 | |||
| 13 | typedef void (*mps_lib_function_t)(void); | ||
| 14 | int mps_lib_callback_register(const char *, mps_lib_function_t); | ||
| 15 | |||
| 16 | #endif /* mpslibcb_h */ | ||
| 17 | |||
| 18 | |||
| 19 | /* C. COPYRIGHT AND LICENSE | ||
| 20 | * | ||
| 21 | * Copyright (C) 2005 Ravenbrook Limited <http://www.ravenbrook.com/>. | ||
| 22 | * All rights reserved. This is an open source license. Contact | ||
| 23 | * Ravenbrook for commercial licensing options. | ||
| 24 | * | ||
| 25 | * Redistribution and use in source and binary forms, with or without | ||
| 26 | * modification, are permitted provided that the following conditions are | ||
| 27 | * met: | ||
| 28 | * | ||
| 29 | * 1. Redistributions of source code must retain the above copyright | ||
| 30 | * notice, this list of conditions and the following disclaimer. | ||
| 31 | * | ||
| 32 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 33 | * notice, this list of conditions and the following disclaimer in the | ||
| 34 | * documentation and/or other materials provided with the distribution. | ||
| 35 | * | ||
| 36 | * 3. Redistributions in any form must be accompanied by information on how | ||
| 37 | * to obtain complete source code for this software and any accompanying | ||
| 38 | * software that uses this software. The source code must either be | ||
| 39 | * included in the distribution or be available for no more than the cost | ||
| 40 | * of distribution plus a nominal fee, and must be freely redistributable | ||
| 41 | * under reasonable conditions. For an executable file, complete source | ||
| 42 | * code means the source code for all modules it contains. It does not | ||
| 43 | * include source code for modules or files that typically accompany the | ||
| 44 | * major components of the operating system on which the executable file | ||
| 45 | * runs. | ||
| 46 | * | ||
| 47 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | ||
| 48 | * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||
| 49 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR | ||
| 50 | * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 51 | * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 52 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 53 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
| 54 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
| 55 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 56 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
| 57 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 58 | */ | ||
diff --git a/mps/code/xcppgc.gmk b/mps/code/xcppgc.gmk index a160a700224..f26f10fc064 100644 --- a/mps/code/xcppgc.gmk +++ b/mps/code/xcppgc.gmk | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | PFM = xcppgc | 6 | PFM = xcppgc |
| 7 | 7 | ||
| 8 | MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmxc.c \ | 8 | MPMPF = lockan.c than.c vmxc.c \ |
| 9 | protan.c prmcan.c span.c ssan.c | 9 | protan.c prmcan.c span.c ssan.c |
| 10 | SWPF = than.c vmxc.c protsw.c prmcan.c ssan.c | 10 | SWPF = than.c vmxc.c protsw.c prmcan.c ssan.c |
| 11 | 11 | ||