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

📄 jk_mt.h

📁 精通tomcat书籍原代码,希望大家共同学习
💻 H
字号:
/*
 *  Copyright 1999-2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/***************************************************************************
 * Description: Multi thread portability code for JK                       *
 * Author:      Gal Shachor <shachor@il.ibm.com>                           *
 * Version:     $Revision: 300467 $                                           *
 ***************************************************************************/

#ifndef _JK_MT_H
#define _JK_MT_H

#include "jk_global.h"


#if defined(WIN32)
#define jk_gettid()    ((int)GetCurrentThreadId())
#elif defined(NETWARE) && !defined(__NOVELL_LIBC__)
#define getpid()       ((int)GetThreadGroupID())
#endif

/*
 * All WIN32 code is MT, UNIX code that uses pthreads is marked by the POSIX
 * _REENTRANT define.
 */
#if defined (WIN32) || defined(_REENTRANT) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
#ifdef JK_PREFORK 
#define _MT_CODE 0
#else
#define _MT_CODE 1
#endif
#else
#define _MT_CODE 0
#endif

/*
 * Marks execution under MT compilation
 */
#if _MT_CODE
#ifdef WIN32
#include <windows.h>

typedef CRITICAL_SECTION JK_CRIT_SEC;
#define JK_INIT_CS(x, rc) InitializeCriticalSection(x); rc = JK_TRUE
#define JK_DELETE_CS(x, rc) DeleteCriticalSection(x);   rc = JK_TRUE
#define JK_ENTER_CS(x, rc) EnterCriticalSection(x);     rc = JK_TRUE
#define JK_LEAVE_CS(x, rc) LeaveCriticalSection(x);     rc = JK_TRUE

#else /* !WIN32 */
#define _MT_CODE_PTHREAD
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>

typedef pthread_mutex_t JK_CRIT_SEC;
#define JK_INIT_CS(x, rc)\
            if(pthread_mutex_init(x, NULL)) rc = JK_FALSE; else rc = JK_TRUE

#define JK_DELETE_CS(x, rc)\
            if(pthread_mutex_destroy(x))    rc = JK_FALSE; else rc = JK_TRUE

#define JK_ENTER_CS(x, rc)\
            if(pthread_mutex_lock(x))       rc = JK_FALSE; else rc = JK_TRUE

#define JK_LEAVE_CS(x, rc)\
            if(pthread_mutex_unlock(x))     rc = JK_FALSE; else rc = JK_TRUE

int jk_gettid(void);
#endif /* WIN32 */

#else /* !_MT_CODE */

typedef void *JK_CRIT_SEC;
#define JK_INIT_CS(x, rc)   rc = JK_TRUE
#define JK_DELETE_CS(x, rc) rc = JK_TRUE
#define JK_ENTER_CS(x, rc)  rc = JK_TRUE
#define JK_LEAVE_CS(x, rc)  rc = JK_TRUE
#define jk_gettid()         0
#endif /* MT_CODE */

#if !defined(WIN32) && !defined(NETWARE)
#include <unistd.h>
#include <fcntl.h>

#if HAVE_FLOCK
#include <sys/file.h>

#define JK_ENTER_LOCK(x, rc)        \
    do {                            \
      while ((rc = flock((x), LOCK_EX) < 0) && (errno == EINTR)); \
      rc = rc == 0 ? JK_TRUE : JK_FALSE; \
    } while (0)

#define JK_LEAVE_LOCK(x, rc)        \
    do {                            \
      while ((rc = flock((x), LOCK_UN) < 0) && (errno == EINTR)); \
      rc = rc == 0 ? JK_TRUE : JK_FALSE; \
    } while (0)

#else

#define JK_ENTER_LOCK(x, rc)        \
    do {                            \
      struct flock _fl;             \
      _fl.l_type   = F_WRLCK;       \
      _fl.l_whence = SEEK_SET;      \
      _fl.l_start  = 0;             \
      _fl.l_len    = 1L;            \
      _fl.l_pid    = 0;             \
      while ((rc = fcntl((x), F_SETLKW, &_fl) < 0) && (errno == EINTR)); \
      rc = rc == 0 ? JK_TRUE : JK_FALSE; \
    } while (0)

#define JK_LEAVE_LOCK(x, rc)        \
    do {                            \
      struct flock _fl;             \
      _fl.l_type   = F_UNLCK;       \
      _fl.l_whence = SEEK_SET;      \
      _fl.l_start  = 0;             \
      _fl.l_len    = 1L;            \
      _fl.l_pid    = 0;             \
      while ((rc = fcntl((x), F_SETLKW, &_fl) < 0) && (errno == EINTR)); \
      rc = rc == 0 ? JK_TRUE : JK_FALSE; \
    } while (0)
#endif /* HAVE_FLOCK */

#else  /* WIN32 || NETWARE */
#define JK_ENTER_LOCK(x, rc) rc = JK_TRUE
#define JK_LEAVE_LOCK(x, rc) rc = JK_TRUE
#endif

#endif /* _JK_MT_H */

⌨️ 快捷键说明

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