diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2019-11-04 10:47:45 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2019-11-04 10:47:45 +0300 |
commit | 803f7ed4bb05d8f79114e0e5f148e70c0a9dd3c7 (patch) | |
tree | c19371c667a4eac66f6d8359a16829eed789c478 | |
parent | c85518128830826f5329d8ea470bd564db578f56 (diff) | |
download | bdwgc-803f7ed4bb05d8f79114e0e5f148e70c0a9dd3c7.tar.gz |
Move GC_throw_bad_alloc definition to new C++ file
Issue #268 (bdgwc).
* CMakeLists.txt [enable_cplusplus] (gccpp): Add gc_badalc.cc library
source file.
* Makefile.am [CPLUSPLUS] (libgccpp_la_SOURCES): Likewise.
* Makefile.am (EXTRA_DIST): Add gc_badalc.cpp.
* Makefile.direct (SRCS): Add gc_badalc.cc.
* Makefile.direct (gc_badalc.o): New target.
* NT_MAKEFILE (gc_badalc.obj): Likewise.
* WCC_MAKEFILE (gc_badalc.obj): Likewise.
* digimars.mak (gc_badalc.obj): Likewise.
* build/s60v3/libgc.mmp (SOURCE): Mention gc_badalc.cpp (commented out).
* Makefile.direct (c++): Add dependency on gc_badalc.o; pass gc_badalc.o
to ru tool.
* NT_MAKEFILE (gccpp.lib): Add dependency on gc_badalc.obj; pass
gc_badalc.obj to lib or link tool.
* WCC_MAKEFILE (gccpp.lib, gccpp.dll): Likewise.
* digimars.mak (OBJS): Add gc_badalc.obj.
* doc/README.Mac (Files to build the GC libraries): Add gc_badalc.cc.
* doc/gcinterface.md (C++ Interface): Mention gc_badalc.cc file.
* gc_badalc.cc: New file.
* gc_badalc.cpp: Likewise.
* gc_cpp.cc (GC_throw_bad_alloc): Move to gc_badalc.cc.
* gc_cpp.cc (GC_ALLOCATOR_THROW_OR_ABORT): Add comment; do not define
unless GC_NO_INLINE_STD_NEW, or not _MSC_VER and not __DMC__.
* tests/tests.am [CPLUSPLUS && AVOID_CPP_LIB] (test_cpp_LDADD): Add
gc_badalc.o.
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | Makefile.am | 4 | ||||
-rw-r--r-- | Makefile.direct | 20 | ||||
-rw-r--r-- | NT_MAKEFILE | 10 | ||||
-rw-r--r-- | WCC_MAKEFILE | 9 | ||||
-rw-r--r-- | build/s60v3/libgc.mmp | 1 | ||||
-rw-r--r-- | digimars.mak | 2 | ||||
-rw-r--r-- | doc/README.Mac | 1 | ||||
-rw-r--r-- | doc/gcinterface.md | 10 | ||||
-rw-r--r-- | gc_badalc.cc | 41 | ||||
-rw-r--r-- | gc_badalc.cpp | 2 | ||||
-rw-r--r-- | gc_cpp.cc | 9 | ||||
-rw-r--r-- | tests/tests.am | 2 |
13 files changed, 84 insertions, 29 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f8ded668..be083815 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,7 +310,7 @@ if (enable_threads) endif() if (enable_cplusplus) - add_library(gccpp gc_cpp.cc) + add_library(gccpp gc_badalc.cc gc_cpp.cc) target_link_libraries(gccpp PRIVATE gc) endif() diff --git a/Makefile.am b/Makefile.am index a927851b..14405162 100644 --- a/Makefile.am +++ b/Makefile.am @@ -135,7 +135,7 @@ if CPLUSPLUS lib_LTLIBRARIES += libgccpp.la pkginclude_HEADERS += include/gc_allocator.h include/gc_cpp.h include_HEADERS += include/extra/gc_cpp.h -libgccpp_la_SOURCES = gc_cpp.cc +libgccpp_la_SOURCES = gc_badalc.cc gc_cpp.cc libgccpp_la_LIBADD = ./libgc.la libgccpp_la_LDFLAGS = -version-info $(LIBGCCPP_VER_INFO) -no-undefined endif @@ -143,7 +143,7 @@ endif ## FIXME: If Visual C++ users use Makefile.am, this should go into ## pkginclude_HEADERS with proper AM_CONDITIONALization. Otherwise ## delete this comment. -EXTRA_DIST += gc_cpp.cpp +EXTRA_DIST += gc_badalc.cpp gc_cpp.cpp # Misc diff --git a/Makefile.direct b/Makefile.direct index 9c3c078a..db0c28a3 100644 --- a/Makefile.direct +++ b/Makefile.direct @@ -108,10 +108,10 @@ SRCS= $(CSRCS) \ include/gc_version.h include/private/gc_hdrs.h include/private/gc_priv.h \ include/private/gcconfig.h include/private/gc_pmark.h \ include/gc_inline.h include/gc_mark.h include/gc_disclaim.h \ - tools/threadlibs.c tools/if_mach.c tools/if_not_there.c gc_cpp.cc \ - include/gc_cpp.h include/private/gc_locks.h include/new_gc_alloc.h \ - include/gc_alloc_ptrs.h include/gc_allocator.h include/javaxfc.h \ - include/gc_backptr.h include/gc_gcj.h include/private/dbg_mlc.h \ + tools/threadlibs.c tools/if_mach.c tools/if_not_there.c gc_badalc.cc \ + gc_cpp.cc include/gc_cpp.h include/new_gc_alloc.h include/gc_alloc_ptrs.h \ + include/gc_allocator.h include/javaxfc.h include/gc_backptr.h \ + include/gc_gcj.h include/private/gc_locks.h include/private/dbg_mlc.h \ include/private/specific.h include/leak_detector.h \ include/gc_pthread_redirects.h include/private/gc_atomic_ops.h \ include/gc_config_macros.h include/private/pthread_support.h \ @@ -222,6 +222,10 @@ cords cord.a: $(CORD_OBJS) $(UTILS) ./if_not_there dont_ar_3 || $(RANLIB) cord.a || cat /dev/null echo > cords +gc_badalc.o: $(srcdir)/gc_badalc.cc $(srcdir)/include/gc_cpp.h \ + $(srcdir)/include/gc.h + $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_badalc.cc + gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/include/gc_cpp.h $(srcdir)/include/gc.h $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc @@ -240,13 +244,13 @@ c++-t: c++ test_cpp$(EXEEXT) c++-nt: c++ @echo "Use ./test_cpp 1 to test the leak library" -c++ gccpp.a: gc_cpp.o $(UTILS) +c++ gccpp.a: gc_badalc.o gc_cpp.o $(UTILS) rm -f dont_ar_4 ./if_mach SPARC SOLARIS touch dont_ar_4 - ./if_mach SPARC SOLARIS $(AR) rus gccpp.a gc_cpp.o + ./if_mach SPARC SOLARIS $(AR) rus gccpp.a gc_badalc.o gc_cpp.o ./if_mach M68K AMIGA touch dont_ar_4 - ./if_mach M68K AMIGA $(AR) -vrus gccpp.a gc_cpp.o - ./if_not_there dont_ar_4 || $(AR) ru gccpp.a gc_cpp.o + ./if_mach M68K AMIGA $(AR) -vrus gccpp.a gc_badalc.o gc_cpp.o + ./if_not_there dont_ar_4 || $(AR) ru gccpp.a gc_badalc.o gc_cpp.o ./if_not_there dont_ar_4 || $(RANLIB) gccpp.a || cat /dev/null echo > c++ diff --git a/NT_MAKEFILE b/NT_MAKEFILE index 76784f60..1ca2b620 100644 --- a/NT_MAKEFILE +++ b/NT_MAKEFILE @@ -121,8 +121,8 @@ gc.lib: $(OBJS) cord.lib: $(COBJS) lib /out:cord.lib /MACHINE:$(CPU) $(COBJS) -gccpp.lib: gc_cpp.obj - lib /out:gccpp.lib /MACHINE:$(CPU) gc_cpp.obj +gccpp.lib: gc_badalc.obj gc_cpp.obj + lib /out:gccpp.lib /MACHINE:$(CPU) gc_badalc.obj gc_cpp.obj !ELSE @@ -132,8 +132,8 @@ gc.lib: $(OBJS) cord.lib: $(COBJS) gc.lib $(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"cord.pdb" /out:cord.dll /implib:cord.lib /MACHINE:$(CPU) $(COBJS) -gccpp.lib: gc_cpp.obj gc.lib - $(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"gccpp.pdb" /out:gccpp.dll /implib:gccpp.lib /MACHINE:$(CPU) gc_cpp.obj +gccpp.lib: gc_badalc.obj gc_cpp.obj gc.lib + $(link) $(ldebug) gc.lib /subsystem:windows /dll /INCREMENTAL:NO /pdb:"gccpp.pdb" /out:gccpp.dll /implib:gccpp.lib /MACHINE:$(CPU) gc_badalc.obj gc_cpp.obj !ENDIF @@ -157,6 +157,8 @@ de.exe: cord\tests\de.obj cord\tests\de_win.obj cord\tests\de_win.rbj gc.lib cor cordtest.exe: cord\tests\cordtest.obj gc.lib cord.lib $(link) /subsystem:console /MACHINE:$(CPU) /INCREMENTAL:NO $(ldebug) $(lflags) -out:cordtest.exe cord\tests\cordtest.obj gc.lib cord.lib user32.lib +gc_badalc.obj: gc_badalc.cc include\gc_cpp.h include\gc.h + gc_cpp.obj: gc_cpp.cc include\gc_cpp.h include\gc.h test_cpp.cpp: tests\test_cpp.cc diff --git a/WCC_MAKEFILE b/WCC_MAKEFILE index 60b013ef..612bd57f 100644 --- a/WCC_MAKEFILE +++ b/WCC_MAKEFILE @@ -103,8 +103,9 @@ cord.lib: $(COBJS) @for %i in ($(COBJS)) do @%append $*.lb1 +'%i' *wlib -b -c -n -p=512 $@ @$*.lb1 -gccpp.lib: gc_cpp.obj +gccpp.lib: gc_badalc.obj gc_cpp.obj @%create $*.lb1 + @%append $*.lb1 +'gc_badalc.obj' @%append $*.lb1 +'gc_cpp.obj' *wlib -b -c -n -p=512 $@ @$*.lb1 @@ -151,7 +152,7 @@ cord.dll: $(COBJS) gc.lib .AUTODEPEND gccpp.lib: gccpp.dll *wlib -b -c -n -p=512 $@ +gccpp.dll -gccpp.dll: gc_cpp.obj gc.lib .AUTODEPEND +gccpp.dll: gc_badalc.obj gc_cpp.obj gc.lib .AUTODEPEND @%create $*.lnk !ifdef DOS4GW @%append $*.lnk sys os2v2_dll @@ -162,6 +163,7 @@ gccpp.dll: gc_cpp.obj gc.lib .AUTODEPEND !endif @%append $*.lnk op case @%append $*.lnk name $* + @%append $*.lnk file 'gc_badalc.obj' @%append $*.lnk file 'gc_cpp.obj' @%append $*.lnk library gc.lib @%append $*.lnk library wr7$(CALLING)dll.lib @@ -226,8 +228,11 @@ cordxtra.obj: cord\cordxtra.c .AUTODEPEND cordprnt.obj: cord\cordprnt.c .AUTODEPEND $(CC) $(CFLAGS) $(CORDFLAG) cord\cordprnt.c +gc_badalc.obj: gc_badalc.cc .AUTODEPEND + $(CXX) $(TEST_CXXFLAGS) $*.cc gc_cpp.obj: gc_cpp.cc .AUTODEPEND $(CXX) $(TEST_CXXFLAGS) $*.cc + test.obj: tests\test.c .AUTODEPEND $(CC) $(TEST_CFLAGS) /wcd=13 /wcd=201 /wcd=367 /wcd=368 tests\test.c cordtest.obj: cord\tests\cordtest.c .AUTODEPEND diff --git a/build/s60v3/libgc.mmp b/build/s60v3/libgc.mmp index a0dad4c8..ada5ad64 100644 --- a/build/s60v3/libgc.mmp +++ b/build/s60v3/libgc.mmp @@ -41,6 +41,7 @@ SOURCE dbg_mlc.c SOURCE dyn_load.c SOURCE finalize.c SOURCE fnlz_mlc.c +//SOURCE gc_badalc.cpp //SOURCE gc_cpp.cpp SOURCE gcj_mlc.c SOURCE headers.c diff --git a/digimars.mak b/digimars.mak index bf1b8b76..4c91dcec 100644 --- a/digimars.mak +++ b/digimars.mak @@ -22,6 +22,7 @@ OBJS= \ fnlz_mlc.obj\
dyn_load.obj\
finalize.obj\
+ gc_badalc.obj\
gc_cpp.obj\
gcj_mlc.obj\
headers.obj\
@@ -83,6 +84,7 @@ dbg_mlc.obj: dbg_mlc.c dyn_load.obj: dyn_load.c
finalize.obj: finalize.c
fnlz_mlc.obj: fnlz_mlc.c
+gc_badalc.obj: gc_badalc.cc gc_badalc.cpp
gc_cpp.obj: gc_cpp.cc gc_cpp.cpp
headers.obj: headers.c
mach_dep.obj: mach_dep.c
diff --git a/doc/README.Mac b/doc/README.Mac index b317a2a5..018218ee 100644 --- a/doc/README.Mac +++ b/doc/README.Mac @@ -214,6 +214,7 @@ Files to build the GC libraries: ptr_chck.c reclaim.c typd_mlc.c + gc_badalc.cc gc_cpp.cc == 2. Test that the library works with 'test.c' == diff --git a/doc/gcinterface.md b/doc/gcinterface.md index fc91d38f..cf648cc4 100644 --- a/doc/gcinterface.md +++ b/doc/gcinterface.md @@ -133,11 +133,11 @@ The C++ interface is implemented as a thin layer on the C interface. Unfortunately, this thin layer appears to be very sensitive to variations in C++ implementations, particularly since it tries to replace the global `::new` operator, something that appears to not be well-standardized. Your -platform may need minor adjustments in this layer (`gc_cpp.cc`, `gc_cpp.h`, -and possibly `gc_allocator.h`). Such changes do not require understanding -of collector internals, though they may require a good understanding of your -platform. (Patches enhancing portability are welcome. But it is easy to break -one platform by fixing another.) +platform may need minor adjustments in this layer (`gc_badalc.cc`, +`gc_cpp.cc`, `gc_cpp.h`, and possibly `gc_allocator.h`). Such changes do not +require understanding of collector internals, though they may require a good +understanding of your platform. (Patches enhancing portability are welcome. +But it is easy to break one platform by fixing another.) Usage of the collector from C++ is also complicated by the fact that there are many _standard_ ways to allocate memory in C++. The default `::new` operator, diff --git a/gc_badalc.cc b/gc_badalc.cc new file mode 100644 index 00000000..4f49cecd --- /dev/null +++ b/gc_badalc.cc @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2019 Ivan Maidanski + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ + +// This file provides the implementation of GC_throw_bad_alloc() which +// is invoked by GC operator "new" in case of an out-of-memory event. + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifndef GC_BUILD +# define GC_BUILD +#endif + +#define GC_DONT_INCL_WINDOWS_H +#include "gc.h" + +#include <new> // for bad_alloc, precedes include of gc_cpp.h + +#include "gc_cpp.h" // for GC_NEW_ABORTS_ON_OOM + +#if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS) +# define GC_ALLOCATOR_THROW_OR_ABORT() GC_abort_on_oom() +#else +# define GC_ALLOCATOR_THROW_OR_ABORT() throw std::bad_alloc() +#endif + +GC_API void GC_CALL GC_throw_bad_alloc() { + GC_ALLOCATOR_THROW_OR_ABORT(); +} diff --git a/gc_badalc.cpp b/gc_badalc.cpp new file mode 100644 index 00000000..7d4dc41a --- /dev/null +++ b/gc_badalc.cpp @@ -0,0 +1,2 @@ +// Visual C++ seems to prefer a .cpp extension to .cc one. +#include "gc_badalc.cc" @@ -34,18 +34,15 @@ built-in "new" and "delete". #include "gc_cpp.h" // for GC_OPERATOR_NEW_ARRAY, GC_NOEXCEPT +#if !(defined(_MSC_VER) || defined(__DMC__)) || defined(GC_NO_INLINE_STD_NEW) + #if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS) # define GC_ALLOCATOR_THROW_OR_ABORT() GC_abort_on_oom() #else +// Use bad_alloc() directly instead of GC_throw_bad_alloc() call. # define GC_ALLOCATOR_THROW_OR_ABORT() throw std::bad_alloc() #endif -GC_API void GC_CALL GC_throw_bad_alloc() { - GC_ALLOCATOR_THROW_OR_ABORT(); -} - -#if !(defined(_MSC_VER) || defined(__DMC__)) || defined(GC_NO_INLINE_STD_NEW) - # if !defined(GC_NEW_DELETE_THROW_NOT_NEEDED) \ && !defined(GC_NEW_DELETE_NEED_THROW) && GC_GNUC_PREREQ(4, 2) \ && (__cplusplus < 201103L || defined(__clang__)) diff --git a/tests/tests.am b/tests/tests.am index 93f4b27d..191c8528 100644 --- a/tests/tests.am +++ b/tests/tests.am @@ -107,7 +107,7 @@ TESTS += test_cpp$(EXEEXT) check_PROGRAMS += test_cpp test_cpp_SOURCES = tests/test_cpp.cc if AVOID_CPP_LIB -test_cpp_LDADD = gc_cpp.o $(test_ldadd) $(CXXLIBS) +test_cpp_LDADD = gc_badalc.o gc_cpp.o $(test_ldadd) $(CXXLIBS) else test_cpp_LDADD = libgccpp.la $(nodist_libgc_la_OBJECTS) \ $(EXTRA_TEST_LIBS) $(CXXLIBS) |