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

📄 gc_protocol.h

📁 《移动Agent技术》一书的所有章节源代码。
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -