www.pudn.com > MP3CORD.rar > beosthread.cpp
/*____________________________________________________________________________ FreeAmp - The Free MP3 Player Portions Copyright (C) 1998-1999 EMusic.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $Id: beosthread.cpp,v 1.5 1999/12/10 04:25:35 elrod Exp $ ____________________________________________________________________________*/ #include "config.h" #include#include #include "beosthread.h" #include "mutex.h" #include #define DEBUG 0 #include void beosThread::Join() { status_t thread_return_value; PRINT(( "beosThread::Join\n" )); BAutolock autolock( m_lock ); if ( !autolock.IsLocked() ) { perror( "beosThread::Join:coulnd't lock the thread" ); } if ( wait_for_thread( m_threadHandle, &thread_return_value ) < B_NO_ERROR ) { PRINT(( "Thread::Join failed\n" )); } } beosThread:: beosThread(): Thread() { // m_priority = Normal; m_priority = B_NORMAL_PRIORITY; // FIXME!! m_threadHandle = (thread_id) NULL; m_threadId = 0; m_suspended = false; // m_suspendMutex = new Mutex(); } beosThread:: ~beosThread() { //pthread_cancel(m_threadHandle); Destroy(); #if 0 if ( m_suspendMutex ) { delete m_suspendMutex; m_suspendMutex = NULL; } #endif } int32 beosThread:: internalThreadFunction( void* arg ) { beosThread* thread = (beosThread*) arg; thread->InternalThreadFunction(); return B_NO_ERROR; } void * beosThread:: InternalThreadFunction() { if ( !m_function ) { return 0; } m_function( m_arg ); return (void *)0; } bool beosThread:: Create( thread_function function, void* arg ) { BAutolock autolock( m_lock ); if ( !autolock.IsLocked() ) { perror( "beosThread::Create:couldn't lock the thread" ); } bool result = true; m_function = function; m_arg = arg; m_threadHandle = spawn_thread( beosThread::internalThreadFunction, BRANDING, beos_priority( m_priority ), this ); if ( m_threadHandle < B_NO_ERROR ) { PRINT(( "Thread creation failed\n" )); result = false; } PRINT(( "Thread successfully created\n" )); if ( resume_thread( m_threadHandle ) < B_NO_ERROR ) { PRINT(( "couldn't start(resume) thread\n" )); result = false; } PRINT(( "Thread started successfully\n" )); return result; } void beosThread:: Destroy() { kill_thread( m_threadHandle ); } void beosThread:: Suspend() { PRINT(( "beosThread::Suspend\n" )); if ( Lock() ) { if ( !m_suspended ) { suspend_thread( m_threadHandle ); m_suspended = true; } Unlock(); } else { perror( "beosThread::Suspend:couldn't lock the thread" ); } PRINT(( "beosThread::Suspend done\n" )); } void beosThread:: Resume() { PRINT(( "beosThread::Resume\n" )); if ( Lock() ) { if ( m_suspended ) { resume_thread( m_threadHandle ); m_suspended = false; } Unlock(); } else { perror( "beosThread::Resume:couldn't lock the thread" ); } PRINT(( "beosThread::Resume done\n" )); } uint32 beosThread:: GetPriority( void ) const { return m_priority; } uint32 beosThread:: SetPriority( uint32 priority ) { uint32 old; m_priority = priority; old = (uint32)set_thread_priority( m_threadHandle, (int32)m_priority ); if ( old < 0 ) { PRINT(( "SetPriority failed\n" )); } else { PRINT(( "Priority set to %d\n", m_priority )); } return old; } void beosThread:: DumpThreadInfo( void ) const { //printf( "Thread ID = %d, %x\n", m_threadHandle, m_threadHandle ); }