Files
libreoffice/cppu/source/threadpool/threadident.cxx

141 lines
3.9 KiB
C++
Raw Normal View History

2000-09-18 14:29:57 +00:00
/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 14:29:57 +00:00
*
* $RCSfile: threadident.cxx,v $
2000-09-18 14:29:57 +00:00
*
* $Revision: 1.10 $
2000-09-18 14:29:57 +00:00
*
* last change: $Author: rt $ $Date: 2005-09-08 08:47:51 $
2000-09-18 14:29:57 +00:00
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
2000-09-18 14:29:57 +00:00
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
2000-09-18 14:29:57 +00:00
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
2000-09-18 14:29:57 +00:00
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
2000-09-18 14:29:57 +00:00
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
2000-09-18 14:29:57 +00:00
*
************************************************************************/
#include <stdio.h>
#include <list>
#include <osl/mutex.hxx>
#include <osl/thread.h>
#include <osl/diagnose.h>
#include <rtl/process.h>
#include <rtl/byteseq.hxx>
#include <uno/threadpool.h>
2000-12-21 13:39:29 +00:00
#include "current.hxx"
2000-09-18 14:29:57 +00:00
using namespace ::std;
using namespace ::osl;
using namespace ::rtl;
2000-12-21 13:39:29 +00:00
using namespace ::cppu;
2000-09-18 14:29:57 +00:00
static inline void createLocalId( sal_Sequence **ppThreadId )
{
rtl_byte_sequence_constructNoDefault( ppThreadId , 4 + 16 );
*((sal_Int32*) ((*ppThreadId)->elements)) = osl_getThreadIdentifier(0);
rtl_getGlobalProcessId( (sal_uInt8 * ) &( (*ppThreadId)->elements[4]) );
}
extern "C" void SAL_CALL
2000-09-18 14:29:57 +00:00
uno_getIdOfCurrentThread( sal_Sequence **ppThreadId )
2001-03-09 11:10:57 +00:00
SAL_THROW_EXTERN_C()
2000-09-18 14:29:57 +00:00
{
2000-12-21 13:39:29 +00:00
IdContainer * p = getIdContainer();
if( ! p->bInit )
2000-09-18 14:29:57 +00:00
{
// first time, that the thread enters the bridge
createLocalId( ppThreadId );
// TODO
// note : this is a leak !
p->pLocalThreadId = *ppThreadId;
p->pCurrentId = *ppThreadId;
p->nRefCountOfCurrentId = 1;
rtl_byte_sequence_acquire( p->pLocalThreadId );
rtl_byte_sequence_acquire( p->pCurrentId );
2000-12-21 13:39:29 +00:00
p->bInit = sal_True;
2000-09-18 14:29:57 +00:00
}
else
{
p->nRefCountOfCurrentId ++;
if( *ppThreadId )
{
rtl_byte_sequence_release( *ppThreadId );
}
*ppThreadId = p->pCurrentId;
rtl_byte_sequence_acquire( *ppThreadId );
}
}
extern "C" void SAL_CALL uno_releaseIdFromCurrentThread()
2001-03-09 11:10:57 +00:00
SAL_THROW_EXTERN_C()
2000-09-18 14:29:57 +00:00
{
2000-12-21 13:39:29 +00:00
IdContainer *p = getIdContainer();
2000-09-18 14:29:57 +00:00
OSL_ASSERT( p );
OSL_ASSERT( p->nRefCountOfCurrentId );
p->nRefCountOfCurrentId --;
if( ! p->nRefCountOfCurrentId && (p->pLocalThreadId != p->pCurrentId) )
{
rtl_byte_sequence_assign( &(p->pCurrentId) , p->pLocalThreadId );
}
}
extern "C" sal_Bool SAL_CALL uno_bindIdToCurrentThread( sal_Sequence *pThreadId )
2001-03-09 11:10:57 +00:00
SAL_THROW_EXTERN_C()
2000-09-18 14:29:57 +00:00
{
2000-12-21 13:39:29 +00:00
IdContainer *p = getIdContainer();
if( ! p->bInit )
2000-09-18 14:29:57 +00:00
{
p->pLocalThreadId = 0;
createLocalId( &(p->pLocalThreadId) );
p->nRefCountOfCurrentId = 1;
p->pCurrentId = pThreadId;
rtl_byte_sequence_acquire( p->pCurrentId );
2000-12-21 13:39:29 +00:00
p->bInit = sal_True;
2000-09-18 14:29:57 +00:00
}
else
{
OSL_ASSERT( 0 == p->nRefCountOfCurrentId );
if( 0 == p->nRefCountOfCurrentId )
{
rtl_byte_sequence_assign(&( p->pCurrentId ), pThreadId );
p->nRefCountOfCurrentId ++;
}
else
{
return sal_False;
}
}
return sal_True;
}