📄 gc_protocol.h
字号:
#ifndef _GC_PROTOCOL_H
#define _GC_PROTOCOL_H
#include "threads.h" /*ibm.5838*/
#include "threads_md.h"
#include <stdlib.h>
#include <setjmp.h> /*ibm.6197*/
#include "interpreter.h"
#include "heapmanager.h"
#ifdef AIX
#define CMP_AND_SWP(where,old,new) (!_check_lock((atomic_p)where,(int)old,(int)new))
#else
#define CMP_AND_SWP(where,old,new) CSMAC(where,&old,new)
#endif
extern int volatile GCstatus;
extern int volatile GCstage;
extern JHandle * volatile swept;
extern volatile void *sweepConflictElement;
/*The synchronize state of GC algorithem */
#define GCSYNC1 1
#define GCSYNC2 2
#define GCASYNC 3
#define GCNEW 4
#define ONLYBLACK 1 /*ibm.5404*/
#define GRAYBLACK 2 /*ibm.5404*/
/* GC cycle stage */
#define GCCLEAR_OR_MARKING 10
#define GCTRACING 11
#define GCFINALIZE_TRACING 12
#define GCSWEEPING 13
#define GCRESTING 14
#define FROM_SIGNALHANDLER 1 /*ibm.5404 ibm.5353*/
#define FROM_ALLOC 2 /*ibm.5404 ibm.5353*/
#define FROM_COLLECTOR 3 /*ibm.5404 ibm.5353*/
#define HEADER_SIZE HANDLE_SIZE
#define MARK_OFFSET 0 /* mark address offset from handle */
#define OBJECTGRAIN 8
#define HANDLEGRAIN 8
#define BITSPERCHAR 8
#define LOG_OBJECTGRAIN 3
#define IsObjectGrained(p) (((unsigned int)(p)& (OBJECTGRAIN-1))==0)
#define RoundToObjectGrain(n) ((n+(OBJECTGRAIN - 1)) & ~(OBJECTGRAIN - 1))
#define hand2mark(p) ((char*)(p)+MARK_OFFSET)
#define obj2mark(p) ((char*)(p)-HANDLE_SIZE+MARK_OFFSET)
#define mark2hand(p) ((char*)(p)-MARK_OFFSET)
/*
* Locks for garbage collection:
* GC_LOCK: lock on the GC code. Ensures that only one thread is
* executing gc0().
*/
extern sys_mon_t *_gc_lock;
#define GC_LOCK_INIT() monitorRegister(_gc_lock,"gc lock")
#define GC_LOCK() sysMonitorEnter(_gc_lock)
#define GC_LOCKED() sysMonitorEntered(_gc_lock)
#define GC_UNLOCK() sysMonitorExit(_gc_lock)
#ifdef TRACING
extern int trace;
extern int tracem;
# define GC_TRACE(a) if(trace) jio_fprintf(stdout,a)
#else
# define GC_TRACE(a)
#endif
#ifdef DBG
#define GCCheckValidState(ee,GCstatus) \
{ \
sysAssert(ee->cantCooperate==FALSE); \
sysAssert((GCstatus==GCASYNC)|| \
(GCstatus==GCSYNC1)|| \
(GCstatus==GCSYNC2)); \
sysAssert((ee->status==GCstatus)|| \
((ee->status==GCSYNC2)&&(GCstatus==GCASYNC))|| \
((ee->status==GCASYNC)&&(GCstatus==GCSYNC1))|| \
((ee->status==GCSYNC1)&&(GCstatus==GCSYNC2))); \
}
#else
#define GCCheckValidState(ee,GCstatus)
#endif
/* ibm.5833 - Sticky Bits - Pass the status to markGray */
#define local_update_ee(ee,old_value, new_value, object) \
{ \
JHandle **old=(JHandle**)&(old_value); \
JHandle *new=(JHandle*)(new_value); \
GC_TRACE("Entering update\n"); \
GCCheckValidState(ee,GCstatus); \
ee->cantCooperate=TRUE; \
sysAssert(ValidHandle(object) && \
GetAllocated(MEMORY_TO_HEADER(object))); \
sysAssert(ValidHandle(*old) || *old == NULL); \
sysAssert(ValidHandle(new) || new == NULL); \
if(ee->update) \
{ \
if(ee->status!=GCASYNC) \
{ \
JHandle *dold=*old; \
if(dold) /*ibm.6565 ibm.5832 ibm.5833 */ \
GCmarkGray(&(ee->pMarkStack),dold,ee->status); \
if(new) /*ibm.6565 ibm.5832 ibm.5833 */ \
GCmarkGray(&(ee->pMarkStack),new,ee->status); \
} \
else if (GCstage==GCTRACING) \
{ \
JHandle *dold=*old; \
if(dold) /*ibm.6565 ibm.5832 ibm.5833 */ \
GCmarkGray(&(ee->pMarkStack), dold, ee->status); \
} \
else \
ee->update=FALSE; \
} \
if(ee->dirty) \
markDirtyBit_ee(object,ee); \
*old=new; \
ee->cantCooperate=FALSE; \
GC_TRACE("Leaving update\n"); \
}
#define local_update_ee_static(ee,old_value, new_value) \
{ \
JHandle **old=(JHandle**)&(old_value); \
JHandle *new=(JHandle*)(new_value); \
GC_TRACE("Entering update\n"); \
GCCheckValidState(ee,GCstatus); \
ee->cantCooperate=TRUE; \
if(ee->update) \
{ \
if(ee->status!=GCASYNC) \
{ \
JHandle *dold=*old; \
if(dold) /*ibm.6565 ibm.5832 ibm.5833 */ \
GCmarkGray(&(ee->pMarkStack),dold,ee->status); \
if(new) /*ibm.6565 ibm.5832 ibm.5833 */ \
GCmarkGray(&(ee->pMarkStack),new,ee->status); \
} \
else if (GCstage==GCTRACING) \
{ \
JHandle *dold=*old; \
if(dold) /*ibm..6565 ibm.5832 ibm.5833 */ \
GCmarkGray(&(ee->pMarkStack), dold, ee->status); \
} \
else \
ee->update=FALSE; \
} \
*old=new; \
ee->cantCooperate=FALSE; \
GC_TRACE("Leaving update\n"); \
}
/*ibm.5833*/
#define setStatus(ee) \
{ \
ee->status=GCstatus; \
if(ee->status==GCASYNC) \
ee->dirty=(bool_t)-1; \
else \
ee->dirty=(bool_t)0; \
ee->status=GCstatus; \
}
/*ibm.6559 ibm.6948 ibm.5833*/
#define update_global_root_delete(ee,root) \
{ \
ee->cantCooperate=TRUE; \
if(ee->update) \
{ \
if(ee->status!=GCASYNC || GCstage==GCTRACING) \
GCmarkGray(&(ee->pMarkStack), root, ee->status); \
else \
ee->update=FALSE; \
} \
ee->cantCooperate=FALSE; \
}
/*ibm.6948 ibm.5833*/
#define update_global_root_add(ee,root) \
{ \
ee->cantCooperate=TRUE; \
if(ee->update) \
{ \
if(ee->status!=GCASYNC) \
GCmarkGray(&(ee->pMarkStack), root,ee->status);/*ibm.5833, 5832*/ \
} \
ee->cantCooperate=FALSE; \
}
/*ibm.5404 ibm.5353 ibm.5833*/
#define local_cooperate(ee,pSysThread,caller) \
{ \
GC_TRACE("Entering cooperate\n"); \
GCCheckValidState(ee,GCstatus); \
if(ee->status!=GCstatus) \
{ \
if(ee->status==GCSYNC2) \
{ \
scanThread(pSysThread,NULL,caller); \
ee->allocatedInCycle=0; \
} \
else if (ee->status==GCASYNC) \
ee->update=(bool_t)-1; \
setStatus(ee) \
} \
GC_TRACE("Leaving cooperate\n"); \
}
/*ibm.5833*/
#define local_cooperate_ee(ee,caller) local_cooperate(ee,sysThreadSelf(),caller)
/*ibm.5833*/
#define local_update(old_value, new_value, object) \
{ \
ExecEnv *ee=EE(); \
local_update_ee(ee,old_value,new_value,object); \
}
#define local_fill(old_value, new_value) \
{ \
JHandle **old=(JHandle**)&(old_value); \
JHandle *new=(JHandle*)(new_value); \
GC_TRACE("Entering fill\n"); \
sysAssert(*old==NULL); \
*old=new; \
GC_TRACE("Leaving fill\n"); \
}
#ifdef DBG
#define isNULLarray(array,count) \
{ \
for(int i=0;i<count;i++) \
sysAssert(array[i]==NULL); \
}
#else
#define isNULLarray(array,count)
#endif
#define local_fillobjectarray(dest_value, \
source_value, \
count) \
{ \
JHandle **source=(JHandle**)(source_value); \
JHandle **dest=(JHandle**)(dest_value); \
GC_TRACE("Entering fillobjectarray\n"); \
isNULLarray(dest,count); \
memcpy(dest,source,sizeof(JHandle*)*count); \
GC_TRACE("Leaving fillobjectarray\n"); \
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -