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

📄 monitor_md.h

📁 《移动Agent技术》一书的所有章节源代码。
💻 H
字号:
/*
 * @(#)monitor_md.h     1.16 97/02/17
 *
 * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
 *
 * This software is the confidential and proprietary information of Sun
 * Microsystems, Inc. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Sun.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 * THIS SOFTWARE OR ITS DERIVATIVES.
 *
 * CopyrightVersion 1.1_beta
 *
 */

/*
 * Win32 implementation of Java monitors
 */

#ifndef _WIN32_MONITOR_MD_H_
#define _WIN32_MONITOR_MD_H_

#include <windows.h>

#ifdef IBM_LOCK_INSTRUM                                                 /*ibm.6406*/
#include "oobj.h"
#endif                                                                  /*ibm.6406*/

#include "threads_md.h"
#include "mutex_md.h"
#include "condvar_md.h"

#define SYS_MID_NULL ((sys_mon_t *) 0)

#ifdef IBM_OS2                                                          /*ibm*/
struct sys_mon {
#else                                                                   /*ibm*/
typedef struct sys_mon {
#endif                                                                  /*ibm*/
    mutex_t             mutex;          /* Mutex for monitor */
    condvar_t           condvar;        /* Condition variable for monitor */
    sys_thread_t        *monitor_owner; /* Current owner of this monitor */
    long                entry_count;    /* Recursion depth */

#ifdef IBM_LOCK_INSTRUM                                                 /*ibm.6406*/
#ifdef DEBUG
    unsigned long       owner;
#endif
    long                entry_tot;      /* rfb: number of holds */
    int64_t             request_time;   /* rfb: time of request */
    int64_t             entry_time;     /* rfb: time of acquire */
    int64_t             exit_time;      /* rfb: time of release */
    long                block_tot;      /* rfb: number of blocking acquires */
    int64_t             cum_time;       /* rfb: time held */
    int64_t             cumblock_time;  /* rfb: time to acquire: block   */
    int64_t             cumnoblock_time;/* rfb: time to acquire: noblock */
    long                waits;          /* rfb: number of waits */
    int64_t             wait_cycles;    /* rfb: time to wait */
    ClassClass *        classB;         /* rfb: pointer to class */
#endif                                                                  /*ibm.6406*/

#ifdef IBM_OS2                                                          /*ibm*/
};
#else                                                                   /*ibm*/
} sys_mon_t;
#endif                                                                  /*ibm*/

#ifndef IBM_OS2                                                         /*ibm*/
#ifdef JMS_TRL                                                          /*ibm.5344*/
/*
 * Light-weight non-recursive locks.
 */
#ifdef DEBUG
/*
 * The DEBUG version supports sysLocked().
 */
typedef struct {
    mutex_t mutex;
    unsigned long owner;
} sys_lock_t;

#ifdef IBM_LOCK_INSTRUM                                                 /*ibm.6406*/

#define sysLockInit(lock)                                                   \
    if (1) {                                                                \
        mutexInit(&(lock).mutex);                                           \
        benheaplock.monitor_owner=SYS_THREAD_NULL;                          \
        benheaplock.entry_count = 0;                                        \
        (lock).owner = 0;                                                   \
    } else
#define sysLock(lock)                                                       \
    if (1) {                                                                \
        int64_t delay;                                                      \
        int free;                                                           \
        if ((benheaplock.monitor_owner == sysThreadSelf())) {               \
            mutexLock(&(lock).mutex);                                       \
            sysAssert((lock).owner == 0);                                   \
            (lock).owner = GetCurrentThreadId();                            \
        } else {                                                            \
            getCycles(&(benheaplock.request_time));                         \
            free = (benheaplock.monitor_owner == SYS_THREAD_NULL);          \
            mutexLock(&(lock).mutex);                                       \
            sysAssert((lock).owner == 0);                                   \
            (lock).owner = GetCurrentThreadId();                            \
            benheaplock.monitor_owner = sysThreadSelf();                    \
            getCycles(&(benheaplock.entry_time));                           \
            delay = ll_sub(benheaplock.entry_time,benheaplock.request_time);\
                                                                            \
            if (free) benheaplock.cumnoblock_time =                         \
                ll_add(benheaplock.cumnoblock_time, delay);                 \
            else {                                                          \
                benheaplock.block_tot++;                                    \
                benheaplock.cumblock_time =                                 \
                    ll_add(benheaplock.cumnoblock_time, delay);             \
            }                                                               \
        }                                                                   \
        benheaplock.entry_count++;                                          \
    } else

#define sysLocked(lock)   ( (lock).owner == GetCurrentThreadId() )

#define sysUnlock(lock)                                                     \
    if (1) {                                                                \
        if ((--benheaplock.entry_count == 0)) {                             \
            benheaplock.monitor_owner = 0;                                  \
            getCycles(&(benheaplock.exit_time));                            \
            benheaplock.cum_time = ll_add(benheaplock.cum_time,             \
                ll_sub(benheaplock.exit_time,benheaplock.entry_time));      \
            benheaplock.entry_tot++;                                        \
        }                                                                   \
        sysAssert(sysLocked(lock));                                         \
        (lock).owner = 0;                                                   \
        mutexUnlock(&(lock).mutex);                                         \
    } else
#else                                                                   /*ibm.6406*/

#define sysLockInit(lock) if (1) { mutexInit(&(lock).mutex);    \
                                   (lock).owner = 0;            \
                          } else
#define sysLock(lock)     if (1) { mutexLock(&(lock).mutex);             \
                                   sysAssert((lock).owner == 0);         \
                                   (lock).owner = GetCurrentThreadId();  \
                          } else
#define sysLocked(lock)   ( (lock).owner == GetCurrentThreadId() )
#define sysUnlock(lock)   if (1) {   sysAssert(sysLocked(lock));   \
                                     (lock).owner = 0;             \
                                     mutexUnlock(&(lock).mutex);   \
                          } else
#endif /* IBM_LOCK_INSTRUM */                                           /*ibm.6406*/
#else
/*
 * The optimized version
 */
typedef struct {
    mutex_t mutex;
} sys_lock_t;

#ifdef IBM_LOCK_INSTRUM                                                 /*ibm.6406*/

#define sysLockInit(lock)                                                   \
    if (1) {                                                                \
        mutexInit(&(lock).mutex);                                           \
        benheaplock.monitor_owner=SYS_THREAD_NULL;                          \
        benheaplock.entry_count = 0;                                        \
    } else
#define sysLock(lock)                                                       \
    if (1) {                                                                \
        int64_t delay;                                                      \
        int free;                                                           \
        if ((benheaplock.monitor_owner == sysThreadSelf())) {               \
            mutexLock(&(lock).mutex);                                       \
        } else {                                                            \
            getCycles(&(benheaplock.request_time));                         \
            free = (benheaplock.monitor_owner == SYS_THREAD_NULL);          \
            mutexLock(&(lock).mutex);                                       \
            benheaplock.monitor_owner = sysThreadSelf();                    \
            getCycles(&(benheaplock.entry_time));                           \
            delay = ll_sub(benheaplock.entry_time,benheaplock.request_time);\
                                                                            \
            if (free) benheaplock.cumnoblock_time =                         \
                ll_add(benheaplock.cumnoblock_time, delay);                 \
            else {                                                          \
                benheaplock.block_tot++;                                    \
                benheaplock.cumblock_time =                                 \
                    ll_add(benheaplock.cumnoblock_time, delay);             \
            }                                                               \
        }                                                                   \
        benheaplock.entry_count++;                                          \
    } else

#define sysLocked(lock)     (panic("sysLocked(" #lock ") not supported"),0)

#define sysUnlock(lock)                                                     \
    if (1) {                                                                \
        if ((--benheaplock.entry_count == 0)) {                             \
            benheaplock.monitor_owner = 0;                                  \
            getCycles(&(benheaplock.exit_time));                            \
            benheaplock.cum_time = ll_add(benheaplock.cum_time,             \
                ll_sub(benheaplock.exit_time,benheaplock.entry_time));      \
            benheaplock.entry_tot++;                                        \
        }                                                                   \
        mutexUnlock(&(lock).mutex);                                         \
    } else
#else                                                                   /*ibm.6406*/

#define sysLockInit(lock)   if (1){ mutexInit(&(lock).mutex); } else
#define sysLock(lock)       if (1) { mutexLock(&(lock).mutex);  } else
#define sysLocked(lock)     (panic("sysLocked(" #lock ") not supported"),0)
#define sysUnlock(lock)     if (1) { mutexUnlock(&(lock).mutex); } else

#endif /* IBM_LOCK_INSTRUM */                                           /*ibm.6406*/
#endif /* DEBUG */
#endif /* JMS_TRL */                                                    /*ibm.5344*/
#endif                                                                  /*ibm*/

#ifdef MON_FLAT                                                         /*ibm.5421*/
typedef struct {
  int UseFastMon;
  void *p_monitorEnterQuicker;
  void *p_monitorExitQuicker;
  void *p_sysMonitorEnterFromAsm;
  void *p_sysMonitorExitFromAsm;
  void *p_monitorIntegerEnter;
  void *p_monitorIntegerExit;
} MonFlatLinkVector;

extern MonFlatLinkVector p_MonFlatLinkVector;
#endif                                                                  /*ibm.5421*/

#endif  /* !_WIN32_MONITOR_MD_H_ */

⌨️ 快捷键说明

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