/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 * 
 *************************************************************/



#include <vos/diagnose.hxx>
#include <vos/object.hxx>
#include <vos/mutex.hxx>

using namespace vos;

/////////////////////////////////////////////////////////////////////////////
//
//  class Mutex
//

VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OMutex, vos), VOS_NAMESPACE(OMutex, vos), VOS_NAMESPACE(OObject, vos), 0);

IMutex& OMutex::getGlobalMutex()
{
	static OMutex theGlobalMutex;
		
	return theGlobalMutex;
}

OMutex::OMutex() 
{
	m_Impl= osl_createMutex();
}

OMutex::~OMutex() 
{
	osl_destroyMutex(m_Impl);
}
	
void OMutex::acquire()
{
	osl_acquireMutex(m_Impl);
}

sal_Bool OMutex::tryToAcquire() 
{
	return osl_tryToAcquireMutex(m_Impl);
}
	
void OMutex::release()
{
	osl_releaseMutex(m_Impl);
}

