Files
c_soft/soft/mythread.c

101 lines
1.8 KiB
C

#include "pthread.h"
#include "unistd.h"
#include "mythread.h"
#include "exception.h"
#include "stdio.h"
#include "debug.h"
#include "string.h"
typedef struct{
myth_def *head;
}self_def;
static self_def g_self;
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
static void *p_thread(void *t){
myth_def *th=(myth_def *)t;
th->id=(size_t)pthread_self();
DBG_INFO("func:%08lx start id=%d.\n",(size_t)th->func,th->id);
try_{
if(!th->func){
throw_("th->func was null.");
}
th->func(th->arg);
}catch_ {
DBG_WARN("thread(%s)=%08lx failed.\n",th->name,(size_t)th->func);
DBG_WARN("%s:%d err(%s)\n",exception()->file,exception()->line,exception()->log);
}
DBG_INFO("func:%08lx end.\n",(size_t)th->func);
th->end=1;
return 0;
}
pthread_t* myth_create(int (*func)(void *t),void *t,const char *name){
myth_def *m=calloc(sizeof(myth_def),1);
m->func=func;
m->arg = t;
if(name)
strncpy(m->name, name, FUNC_NAME_LEN - 1);
pthread_create(&m->th, NULL, p_thread, m);
{
self_def *s=&g_self;
if(s->head==NULL){
s->head=m;
}else{
myth_def *myth=s->head;
while(myth->next){
myth=myth->next;
}
myth->next=m;
m->last=myth;
}
}
return &m->th;
}
int myth_join(){
self_def *s=&g_self;
myth_def *myth=s->head;
myth_def *old;
while(myth){
pthread_join(myth->th,NULL);
old=myth;
myth=myth->next;
free(old);
}
s->head=NULL;
return 0;
}
myth_def *myth_self(){
self_def *s=&g_self;
myth_def *myth=s->head;
size_t id=(size_t)pthread_self();
while(myth){
if(myth->id==id){
return myth;
}
myth=myth->next;
}
DBG_WARN("can not find myth.\n");
return NULL;
}