summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2019-11-04 10:47:45 +0300
committerIvan Maidanski <ivmai@mail.ru>2019-11-04 10:47:45 +0300
commit803f7ed4bb05d8f79114e0e5f148e70c0a9dd3c7 (patch)
treec19371c667a4eac66f6d8359a16829eed789c478
parentc85518128830826f5329d8ea470bd564db578f56 (diff)
downloadbdwgc-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.txt2
-rw-r--r--Makefile.am4
-rw-r--r--Makefile.direct20
-rw-r--r--NT_MAKEFILE10
-rw-r--r--WCC_MAKEFILE9
-rw-r--r--build/s60v3/libgc.mmp1
-rw-r--r--digimars.mak2
-rw-r--r--doc/README.Mac1
-rw-r--r--doc/gcinterface.md10
-rw-r--r--gc_badalc.cc41
-rw-r--r--gc_badalc.cpp2
-rw-r--r--gc_cpp.cc9
-rw-r--r--tests/tests.am2
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"
diff --git a/gc_cpp.cc b/gc_cpp.cc
index 300b24e8..cbcaf4cd 100644
--- a/gc_cpp.cc
+++ b/gc_cpp.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)