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

140 lines
4.0 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2000-09-18 14:29:57 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2000-09-18 14:29:57 +00:00
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
2000-09-18 14:29:57 +00:00
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 14:29:57 +00:00
*
* This file is part of OpenOffice.org.
2000-09-18 14:29:57 +00:00
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
2000-09-18 14:29:57 +00:00
*
* OpenOffice.org 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
2000-09-18 14:29:57 +00:00
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
2000-09-18 14:29:57 +00:00
*
************************************************************************/
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 );
2011-12-01 21:24:01 +01:00
sal_uInt32 id = osl_getThreadIdentifier(0);
(*ppThreadId)->elements[0] = id & 0xFF;
(*ppThreadId)->elements[1] = (id >> 8) & 0xFF;
(*ppThreadId)->elements[2] = (id >> 16) & 0xFF;
(*ppThreadId)->elements[3] = (id >> 24) & 0xFF;
2000-09-18 14:29:57 +00:00
rtl_getGlobalProcessId( (sal_uInt8 * ) &( (*ppThreadId)->elements[4]) );
}
2011-12-18 04:56:57 +01:00
extern "C" CPPU_DLLPUBLIC 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 );
}
}
2011-12-18 04:56:57 +01:00
extern "C" CPPU_DLLPUBLIC 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 );
}
}
2011-12-18 04:56:57 +01:00
extern "C" CPPU_DLLPUBLIC 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;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */