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

📄 jnithreaddata.cpp

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 CPP
字号:
/** * @copyright * ==================================================================== * Copyright (c) 2003 CollabNet.  All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution.  The terms * are also available at http://subversion.tigris.org/license-1.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * * This software consists of voluntary contributions made by many * individuals.  For exact contribution history, see the revision * history and logs, available at http://subversion.tigris.org/. * ==================================================================== * @endcopyright * * @file JNIThreadData.cpp * @brief Implementation of the class JNIThreadData */#include "JNIThreadData.h"#include <apr_strings.h>#include <apr_tables.h>#include <apr_general.h>#include <apr_lib.h>#include <apr_thread_proc.h>#include "JNIUtil.h"apr_threadkey_t *JNIThreadData::g_key;/** * create and initialize a new object */JNIThreadData::JNIThreadData(){    m_env = NULL;    m_exceptionThrown = false;    m_requestPool = NULL;	m_previous = NULL;}/** * destroy an object */JNIThreadData::~JNIThreadData(){}/** * initialize the thread local storage * @return success or failure */bool JNIThreadData::initThreadData(){    // if already initialized -> nothing to do    if(g_key != NULL)    {        return false;    }    // request a key for the thread local storage from the global pool and    // register a callback function called, when the thread is deleted    apr_status_t apr_err = apr_threadkey_private_create  ( &g_key, del,         JNIUtil::getPool());    if(apr_err)    {        JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_create");        return false;    }    return true;}/** * Get the thread local storage for this thread * @return thread local storage */JNIThreadData * JNIThreadData::getThreadData(){    // we should never be called before initThreadData    if(g_key == NULL)    {        return NULL;    }    // retrieve the thread local storage from apr    JNIThreadData *data = NULL;    apr_status_t apr_err = apr_threadkey_private_get         (reinterpret_cast<void**>(&data), g_key);    if(apr_err)    {        JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_get");        return NULL;    }    // not already allocated    if(data == NULL)    {        // allocate and store to apr        data = new JNIThreadData;        apr_err = apr_threadkey_private_set (data, g_key);        if(apr_err)        {            JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_set");            return NULL;        }    }    return data;}/** * Allocate a new ThreadData for the current call from java and push it on the * stack */void JNIThreadData::pushNewThreadData(){    JNIThreadData *data = NULL;    apr_status_t apr_err = apr_threadkey_private_get         (reinterpret_cast<void**>(&data), g_key);    if(apr_err)    {        JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_get");        return;    }	JNIThreadData *newData = new JNIThreadData();	newData->m_previous =data;    apr_err = apr_threadkey_private_set (newData, g_key);    if(apr_err)    {        JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_set");        return;    }}/** * Pop the current ThreadData from the stack, because the call is completed */void JNIThreadData::popThreadData(){    JNIThreadData *data = NULL;    apr_status_t apr_err = apr_threadkey_private_get         (reinterpret_cast<void**>(&data), g_key);    if(apr_err)    {        JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_get");        return;    }	if(data == NULL)	{		return;	}	JNIThreadData *oldData = data->m_previous;	delete data;    apr_err = apr_threadkey_private_set (oldData, g_key);    if(apr_err)    {        JNIUtil::handleAPRError(apr_err, "apr_threadkey_private_set");        return;    }}/** * callback called by apr, when the thread dies. Deletes the thread local  * storage */void JNIThreadData::del(void *p){    delete reinterpret_cast<JNIThreadData*>(p);}

⌨️ 快捷键说明

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