⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gc_priv.h

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 H
📖 第 1 页 / 共 5 页
字号:
/*  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved. * Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P. * * * 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. */ # ifndef GC_PRIVATE_H# define GC_PRIVATE_H# include <stdlib.h># if !(defined( sony_news ) )#   include <stddef.h># endif#ifdef DGUX#   include <sys/types.h>#   include <sys/time.h>#   include <sys/resource.h>#endif /* DGUX */#ifdef BSD_TIME#   include <sys/types.h>#   include <sys/time.h>#   include <sys/resource.h>#endif /* BSD_TIME */#ifdef PARALLEL_MARK#   define AO_REQUIRE_CAS#endif#ifndef _GC_H#   include "../gc.h"#endif#ifndef GC_TINY_FL_H#   include "../gc_tiny_fl.h"#endif#ifndef GC_MARK_H#   include "../gc_mark.h"#endiftypedef GC_word word;typedef GC_signed_word signed_word;typedef unsigned int unsigned32;typedef int GC_bool;# define TRUE 1# define FALSE 0typedef char * ptr_t;	/* A generic pointer to which we can add	*/			/* byte displacements and which can be used	*/			/* for address comparisons.			*/# ifndef GCCONFIG_H#   include "gcconfig.h"# endif# ifndef HEADERS_H#   include "gc_hdrs.h"# endif#if __GNUC__ >= 3# define EXPECT(expr, outcome) __builtin_expect(expr,outcome)  /* Equivalent to (expr), but predict that usually (expr)==outcome. */# define INLINE inline#else# define EXPECT(expr, outcome) (expr)# define INLINE#endif /* __GNUC__ */# ifndef GC_LOCKS_H#   include "gc_locks.h"# endif# ifdef STACK_GROWS_DOWN#   define COOLER_THAN >#   define HOTTER_THAN <#   define MAKE_COOLER(x,y) if ((x)+(y) > (x)) {(x) += (y);} \			    else {(x) = (ptr_t)ONES;}#   define MAKE_HOTTER(x,y) (x) -= (y)# else#   define COOLER_THAN <#   define HOTTER_THAN >#   define MAKE_COOLER(x,y) if ((x)-(y) < (x)) {(x) -= (y);} else {(x) = 0;}#   define MAKE_HOTTER(x,y) (x) += (y)# endif#if defined(AMIGA) && defined(__SASC)#   define GC_FAR __far#else#   define GC_FAR#endif/*********************************//*                               *//* Definitions for conservative  *//* collector                     *//*                               *//*********************************//*********************************//*                               *//* Easily changeable parameters  *//*                               *//*********************************//* #define STUBBORN_ALLOC */		    /* Enable stubborm allocation, and thus a limited	*/		    /* form of incremental collection w/o dirty bits.	*//* #define ALL_INTERIOR_POINTERS */		    /* Forces all pointers into the interior of an 	*/		    /* object to be considered valid.  Also causes the	*/		    /* sizes of all objects to be inflated by at least 	*/		    /* one byte.  This should suffice to guarantee	*/		    /* that in the presence of a compiler that does	*/		    /* not perform garbage-collector-unsafe		*/		    /* optimizations, all portable, strictly ANSI	*/		    /* conforming C programs should be safely usable	*/		    /* with malloc replaced by GC_malloc and free	*/		    /* calls removed.  There are several disadvantages: */		    /* 1. There are probably no interesting, portable,	*/		    /*    strictly ANSI	conforming C programs.		*/		    /* 2. This option makes it hard for the collector	*/		    /*    to allocate space that is not ``pointed to''  */		    /*    by integers, etc.  Under SunOS 4.X with a 	*/		    /*    statically linked libc, we empiricaly		*/		    /*    observed that it would be difficult to 	*/		    /*	  allocate individual objects larger than 100K.	*/		    /* 	  Even if only smaller objects are allocated,	*/		    /*    more swap space is likely to be needed.       */		    /*    Fortunately, much of this will never be	*/		    /*    touched.					*/		    /* If you can easily avoid using this option, do.	*/		    /* If not, try to keep individual objects small.	*/		    /* This is now really controlled at startup,	*/		    /* through GC_all_interior_pointers.		*/		    #define GC_INVOKE_FINALIZERS() GC_notify_or_invoke_finalizers()#if !defined(DONT_ADD_BYTE_AT_END)# define EXTRA_BYTES GC_all_interior_pointers# define MAX_EXTRA_BYTES 1#else# define EXTRA_BYTES 0# define MAX_EXTRA_BYTES 0#endif# ifndef LARGE_CONFIG#   define MINHINCR 16	 /* Minimum heap increment, in blocks of HBLKSIZE  */			 /* Must be multiple of largest page size.	   */#   define MAXHINCR 2048 /* Maximum heap increment, in blocks              */# else#   define MINHINCR 64#   define MAXHINCR 4096# endif# define TIME_LIMIT 50	   /* We try to keep pause times from exceeding	 */			   /* this by much. In milliseconds.		 */# define BL_LIMIT GC_black_list_spacing			   /* If we need a block of N bytes, and we have */			   /* a block of N + BL_LIMIT bytes available, 	 */			   /* and N > BL_LIMIT,				 */			   /* but all possible positions in it are 	 */			   /* blacklisted, we just use it anyway (and	 */			   /* print a warning, if warnings are enabled). */			   /* This risks subsequently leaking the block	 */			   /* due to a false reference.  But not using	 */			   /* the block risks unreasonable immediate	 */			   /* heap growth.				 *//*********************************//*                               *//* Stack saving for debugging	 *//*                               *//*********************************/#ifdef NEED_CALLINFO    struct callinfo {	word ci_pc;  	/* Caller, not callee, pc	*/#	if NARGS > 0	    word ci_arg[NARGS];	/* bit-wise complement to avoid retention */#	endif#	if (NFRAMES * (NARGS + 1)) % 2 == 1	    /* Likely alignment problem. */	    word ci_dummy;#	endif    };#endif#ifdef SAVE_CALL_CHAIN/* Fill in the pc and argument information for up to NFRAMES of my	*//* callers.  Ignore my frame and my callers frame.			*/void GC_save_callers(struct callinfo info[NFRAMES]);  void GC_print_callers(struct callinfo info[NFRAMES]);#endif/*********************************//*                               *//* OS interface routines	 *//*                               *//*********************************/#ifdef BSD_TIME#   undef CLOCK_TYPE#   undef GET_TIME#   undef MS_TIME_DIFF#   define CLOCK_TYPE struct timeval#   define GET_TIME(x) { struct rusage rusage; \			 getrusage (RUSAGE_SELF,  &rusage); \			 x = rusage.ru_utime; }#   define MS_TIME_DIFF(a,b) ((double) (a.tv_sec - b.tv_sec) * 1000.0 \                               + (double) (a.tv_usec - b.tv_usec) / 1000.0)#else /* !BSD_TIME */# if defined(MSWIN32) || defined(MSWINCE)#   include <windows.h>#   include <winbase.h>#   define CLOCK_TYPE DWORD#   define GET_TIME(x) x = GetTickCount()#   define MS_TIME_DIFF(a,b) ((long)((a)-(b)))# else /* !MSWIN32, !MSWINCE, !BSD_TIME */#   include <time.h>#   if !defined(__STDC__) && defined(SPARC) && defined(SUNOS4)      clock_t clock();	/* Not in time.h, where it belongs	*/#   endif#   if defined(FREEBSD) && !defined(CLOCKS_PER_SEC)#     include <machine/limits.h>#     define CLOCKS_PER_SEC CLK_TCK#   endif#   if !defined(CLOCKS_PER_SEC)#     define CLOCKS_PER_SEC 1000000/* * This is technically a bug in the implementation.  ANSI requires that * CLOCKS_PER_SEC be defined.  But at least under SunOS4.1.1, it isn't. * Also note that the combination of ANSI C and POSIX is incredibly gross * here. The type clock_t is used by both clock() and times().  But on * some machines these use different notions of a clock tick,  CLOCKS_PER_SEC * seems to apply only to clock.  Hence we use it here.  On many machines, * including SunOS, clock actually uses units of microseconds (which are * not really clock ticks). */#   endif#   define CLOCK_TYPE clock_t#   define GET_TIME(x) x = clock()#   define MS_TIME_DIFF(a,b) ((unsigned long) \		(1000.0*(double)((a)-(b))/(double)CLOCKS_PER_SEC))# endif /* !MSWIN32 */#endif /* !BSD_TIME *//* We use bzero and bcopy internally.  They may not be available.	*/# if defined(SPARC) && defined(SUNOS4)#   define BCOPY_EXISTS# endif# if defined(M68K) && defined(AMIGA)#   define BCOPY_EXISTS# endif# if defined(M68K) && defined(NEXT)#   define BCOPY_EXISTS# endif# if defined(VAX)#   define BCOPY_EXISTS# endif# if defined(AMIGA)#   include <string.h>#   define BCOPY_EXISTS# endif# if defined(DARWIN)#   include <string.h>#   define BCOPY_EXISTS# endif# ifndef BCOPY_EXISTS#   include <string.h>#   define BCOPY(x,y,n) memcpy(y, x, (size_t)(n))#   define BZERO(x,n)  memset(x, 0, (size_t)(n))# else#   define BCOPY(x,y,n) bcopy((void *)(x),(void *)(y),(size_t)(n))#   define BZERO(x,n) bzero((void *)(x),(size_t)(n))# endif/* * Stop and restart mutator threads. */# ifdef PCR#     include "th/PCR_ThCtl.h"#     define STOP_WORLD() \ 	PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_stopNormal, \ 				   PCR_allSigsBlocked, \ 				   PCR_waitForever)#     define START_WORLD() \	PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_null, \ 				   PCR_allSigsBlocked, \ 				   PCR_waitForever);# else#   if defined(GC_SOLARIS_THREADS) || defined(GC_WIN32_THREADS) \	|| defined(GC_PTHREADS)      void GC_stop_world();      void GC_start_world();#     define STOP_WORLD() GC_stop_world()#     define START_WORLD() GC_start_world()#   else#     define STOP_WORLD()#     define START_WORLD()#   endif# endif/* Abandon ship */# ifdef PCR#   define ABORT(s) PCR_Base_Panic(s)# else#   ifdef SMALL_CONFIG#	define ABORT(msg) abort()#   else	GC_API void GC_abort(const char * msg);#       define ABORT(msg) GC_abort(msg)#   endif# endif/* Exit abnormally, but without making a mess (e.g. out of memory) */# ifdef PCR#   define EXIT() PCR_Base_Exit(1,PCR_waitForever)# else#   define EXIT() (void)exit(1)# endif/* Print warning message, e.g. almost out of memory.	*/# define WARN(msg,arg) (*GC_current_warn_proc)("GC Warning: " msg, (GC_word)(arg))extern GC_warn_proc GC_current_warn_proc;/* Get environment entry */#if !defined(NO_GETENV)#   if defined(EMPTY_GETENV_RESULTS)	/* Workaround for a reputed Wine bug.	*/	static inline char * fixed_getenv(const char *name)	{	  char * tmp = getenv(name);	  if (tmp == 0 || strlen(tmp) == 0)	    return 0;	  return tmp;	}#       define GETENV(name) fixed_getenv(name)#   else#       define GETENV(name) getenv(name)#   endif#else#   define GETENV(name) 0#endif#if defined(DARWIN)#	if defined(POWERPC)#		if CPP_WORDSZ == 32

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -