aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorDavid Jones2005-02-07 14:50:11 +0000
committerDavid Jones2005-02-07 14:50:11 +0000
commit424ffbc8569a324e742c143ff9e1b88e47f9091b (patch)
tree43f2363fdaf580f943f1f9f5c5e892214ada8c4c /mps/code
parentf5bbad02d7af33494fd776bbf49119eac26cfb17 (diff)
downloademacs-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.gmk71
-rw-r--r--mps/code/libcbt.c69
-rw-r--r--mps/code/mpslibcb.c316
-rw-r--r--mps/code/mpslibcb.h58
-rw-r--r--mps/code/xcppgc.gmk2
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
274swall: mmsw.a replaysw 274swall: 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
349ifdef VARIETY 350ifdef 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
19void libcbt_assert_fail(const char *);
20mps_clock_t libcbt_clock(void);
21
22int 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
55void 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
63mps_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
26int mps_lib_callback_default_get_EOF(void);
27mps_lib_FILE *mps_lib_callback_default_get_stderr(void);
28mps_lib_FILE *mps_lib_callback_default_get_stdout(void);
29int mps_lib_callback_default_fputc(int c_, mps_lib_FILE *f_);
30int mps_lib_callback_default_fputs(const char *s_, mps_lib_FILE *f_);
31void *mps_lib_callback_default_memset(void *p_, int c_, size_t n_);
32void *mps_lib_callback_default_memcpy(void *p_, const void *q_, size_t n_);
33int mps_lib_callback_default_memcmp(const void *p_, const void *q_, size_t n_);
34mps_clock_t mps_lib_callback_default_clock(void);
35mps_clock_t mps_lib_callback_default_clocks_per_sec(void);
36unsigned long mps_lib_callback_default_telemetry_control(void);
37int mps_lib_callback_streq(const char *, const char *);
38
39#define EQ(p, q) (mps_lib_callback_streq((p), (q)))
40
41struct 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
67struct 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
82int 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. */
124int 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
134int mps_lib_callback_default_get_EOF(void)
135{
136 ASSERT(0, "mps_lib_get_EOF needs to be provided");
137 return 0;
138}
139
140mps_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
146mps_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
152int 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
160int 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
170void *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
179void *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
188int 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
197mps_clock_t mps_lib_callback_default_clock(void)
198{
199 ASSERT(0, "mps_clock needs to be provided");
200 return 0;
201}
202
203mps_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
209unsigned 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
215int mps_lib_get_EOF(void)
216{
217 return mps_lib_callback_global.lib_get_EOF();
218}
219
220mps_lib_FILE *mps_lib_get_stderr(void)
221{
222 return mps_lib_callback_global.lib_get_stderr();
223}
224
225mps_lib_FILE *mps_lib_get_stdout(void)
226{
227 return mps_lib_callback_global.lib_get_stdout();
228}
229
230int mps_lib_fputc(int c, mps_lib_FILE *f)
231{
232 return mps_lib_callback_global.lib_fputc(c, f);
233}
234
235int mps_lib_fputs(const char *s, mps_lib_FILE *f)
236{
237 return mps_lib_callback_global.lib_fputs(s, f);
238}
239
240void mps_lib_assert_fail(const char *m)
241{
242 mps_lib_callback_global.lib_assert_fail(m);
243}
244
245void *(mps_lib_memset)(void *p, int c, size_t n)
246{
247 return mps_lib_callback_global.lib_memset(p, c, n);
248}
249
250void *(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
255int (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
260mps_clock_t mps_clock(void)
261{
262 return mps_lib_callback_global.clock();
263}
264
265mps_clock_t mps_clocks_per_sec(void)
266{
267 return mps_lib_callback_global.clocks_per_sec();
268}
269
270unsigned 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
13typedef void (*mps_lib_function_t)(void);
14int 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
6PFM = xcppgc 6PFM = xcppgc
7 7
8MPMPF = mpsliban.c mpsioan.c lockan.c than.c vmxc.c \ 8MPMPF = lockan.c than.c vmxc.c \
9 protan.c prmcan.c span.c ssan.c 9 protan.c prmcan.c span.c ssan.c
10SWPF = than.c vmxc.c protsw.c prmcan.c ssan.c 10SWPF = than.c vmxc.c protsw.c prmcan.c ssan.c
11 11