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

📄 pthread.c

📁 psos下采用linux的线程库时改写的那部分代码.
💻 C
字号:
/*************************************************
  Copyright (C), 2006-2010, Aurine
  File name: pthread.c
  Author:	张卓谋
  Version:	1.0 
  Date:	  2005.6.02
  Description:  
  

*************************************************/

#include "pthread.h"
#include <psos.h>
#include <stdio.h>
#include "semaphore.h"

//#define	DEBUG_OUTPUT 1 

#ifdef DEBUG_OUTPUT
#define TH_PRINT	printf
#define TH_FPRINT	fprintf
#else
#define TH_PRINT	
#define TH_FPRINT	fprintf
#endif 

static int mutex_count = 0 ;

static void _thread_start(void *(*start) (void *), void * param)
{

	TH_FPRINT (stderr, "[_thread_start]: thread[0x%x] end\n", pthread_self()) ;
}

//----------------------------------------------------------------------------------------------------------
// 创建线程
//----------------------------------------------------------------------------------------------------------
int pthread_create (pthread_t * tid, const pthread_attr_t * attr,
		void *(*start) (void *), void *arg)
{
	
	
	if (NULL != attr && attr->valid)
	{
		if (attr->stacksize >= 4000)
			usr_stacksize = attr->stacksize ;
	}
	
	ret = t_create(NULL, 80, 4000, usr_stacksize, 0, tid) ;
	if (0 != ret)
		TH_FPRINT (stderr, "[pthread_create]: t_create failed, errno[0x%x]\n", errno) ;
	
//	TH_PRINT("[pthread_create]: creat a new thread id[0x%x] arg[0x%x], total[%d]\n", *tid, arg, ++ count) ;
	
	ret = t_start(*tid, T_PREEMPT | T_TSLICE | T_ASR | T_ISR, _thread_start, args) ; 

	if (0 != ret)
		TH_FPRINT (stderr, "[pthread_create]: t_start failed, errno[0x%x]\n", errno) ;
	
	return ret ;
}

//----------------------------------------------------------------------------------------------------------
// 获取线程句柄
//----------------------------------------------------------------------------------------------------------
pthread_t pthread_self (void)
{
	pthread_t self ;

	if (0 != t_ident(NULL, 0, &self))
		TH_PRINT("[pthread_self]: t_ident failed, errno[0x%x]\n", errno) ;
	
	return self ;
}

//----------------------------------------------------------------------------------------------------------
// 结束线程(暂未实现) 
//----------------------------------------------------------------------------------------------------------
int pthread_cancel (pthread_t thread)
{
	TH_FPRINT (stderr, "[pthread_cancel]: null nop, thread id[%d]\n", thread) ;
	return 0 ;
}

//----------------------------------------------------------------------------------------------------------
// 等待线程结束(暂未实现)
//----------------------------------------------------------------------------------------------------------
int pthread_join (pthread_t thread, void **value_ptr)
{
	TH_FPRINT (stderr, "[pthread_join]: null nop, thread id[%d]\n", thread) ;
	return 0; 
}

//----------------------------------------------------------------------------------------------------------
// 线程属性初始化
//----------------------------------------------------------------------------------------------------------
int pthread_attr_init (pthread_attr_t * attr)
{
	if (NULL != attr)
	{
		attr->valid = 1 ;
		return 0 ;
	}
	return -1 ;
}

//----------------------------------------------------------------------------------------------------------
// 设置线程属性状态
//----------------------------------------------------------------------------------------------------------
int pthread_attr_setdetachstate (pthread_attr_t * attr, int detachstate)
{
	if (NULL != attr && attr->valid)
	{
		attr->detachstate = detachstate ;
		return 0 ;
	}
	return -1 ;
}

//----------------------------------------------------------------------------------------------------------
// 设置线程属性堆栈大小
//----------------------------------------------------------------------------------------------------------
int pthread_attr_setstacksize (pthread_attr_t * attr, unsigned int stacksize)
{
	if (NULL != attr && attr->valid)
	{
		attr->stacksize = stacksize ;
		return 0 ;
	}
	return -1 ;
}

//----------------------------------------------------------------------------------------------------------
// 删除线程属性
//----------------------------------------------------------------------------------------------------------
int pthread_attr_destroy (pthread_attr_t * attr)
{
	
	return -1 ;
}

//----------------------------------------------------------------------------------------------------------
// 初始化线程互斥体
//----------------------------------------------------------------------------------------------------------
int pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
{
	
	
	if (0 != ret)
	{
		TH_FPRINT(stderr, "[pthread_mutex_init]: sm_create failed, count[%d], errno[0x%x]\n", mutex_count+1, errno) ;
	}
	else
	{
		mutex_count ++ ;
		TH_PRINT("[pthread_mutex_init]: sm_create successfully, id[0x%x] count[%d]\n", mutex->id, mutex_count) ;
	}
	
	return ret ;
}

//----------------------------------------------------------------------------------------------------------
// 删除线程互斥体
//----------------------------------------------------------------------------------------------------------
int pthread_mutex_destroy (pthread_mutex_t * mutex)
{
	int ret = sm_delete(mutex->id) ;
	
	if (0 != ret)
		TH_FPRINT(stderr, "[pthread_mutex_destroy]: sm_delete failed, count[%d], errno[0x%x]\n", mutex_count, errno) ;
		 
	return ret ;
}

//----------------------------------------------------------------------------------------------------------
// 锁定线程互斥体
//----------------------------------------------------------------------------------------------------------
int pthread_mutex_lock (pthread_mutex_t * mutex)
{
	return sm_p(mutex->id, SM_WAIT, 0) ;
}

//----------------------------------------------------------------------------------------------------------
// 解锁线程互斥体
//----------------------------------------------------------------------------------------------------------
int pthread_mutex_unlock (pthread_mutex_t * mutex)
{
	return sm_v(mutex->id) ;
}


#undef TH_PRINT	
#undef TH_FPRINT	

⌨️ 快捷键说明

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