thread.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 353 行
C
353 行
/*************************************************************************** begin : Thu Mar 25 2004 copyright : (C) 2004 - 2005 by Alper Akcan email : distchx@yahoo.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of the * * License, or (at your option) any later version. * * * ***************************************************************************/#include "xynth_.h"typedef struct s_thread_api_s { int (*sem_create) (s_thread_sem_t *sem, int initial); int (*sem_destroy) (s_thread_sem_t *sem); int (*sem_wait) (s_thread_sem_t *sem); int (*sem_wait_timeout) (s_thread_sem_t *sem, int msec); int (*sem_post) (s_thread_sem_t *sem); int (*mutex_init) (s_thread_mutex_t *mut); int (*mutex_destroy) (s_thread_mutex_t *mut); int (*mutex_lock) (s_thread_mutex_t *mut); int (*mutex_trylock) (s_thread_mutex_t *mut); int (*mutex_unlock) (s_thread_mutex_t *mut); int (*cond_init) (s_thread_cond_t *cond); int (*cond_destroy) (s_thread_cond_t *cond); int (*cond_signal) (s_thread_cond_t *cond); int (*cond_broadcast) (s_thread_cond_t *cond); int (*cond_wait) (s_thread_cond_t *cond, s_thread_mutex_t *mut); int (*cond_timedwait) (s_thread_cond_t *cond, s_thread_mutex_t *mut, int msec); int (*thread_create) (s_thread_t *tid, void * (*f) (void *), void *farg); int (*thread_cancel) (s_thread_t *tid); int (*thread_join) (s_thread_t *tid, void **ret); int (*thread_self) (void); void (*thread_exit) (void *ret);} s_thread_api_t;#if defined(THREAD_PSPDEV) #include "thread_pspdev.c" static s_thread_api_t *s_thread_api = &s_thread_pspdev;#elif defined(THREAD_PTHREADS) #include "thread_pthreads.c" static s_thread_api_t *s_thread_api = &s_thread_pthreads;#elif defined(THREAD_WIN32) #include "thread_win32.c" static s_thread_api_t *s_thread_api = &s_thread_win32;#else struct s_thread_s { char foo; }; struct s_thread_cond_s { char foo; }; struct s_thread_mutex_s { char foo; }; #error "I do need threads support" #error "Check Makefile.cfg"#endiftypedef struct s_thread_arg_s { int flag; void *arg; void * (*f) (void *); s_thread_cond_t *cond; s_thread_mutex_t *mut;} s_thread_arg_t;int s_thread_sem_create (s_thread_sem_t *sem, int initial){ if ((s_thread_api == NULL) || (s_thread_api->sem_create == NULL)) { return -1; } return s_thread_api->sem_create(sem, initial);}int s_thread_sem_destroy (s_thread_sem_t *sem){ if ((s_thread_api == NULL) || (s_thread_api->sem_destroy == NULL)) { return -1; } return s_thread_api->sem_destroy(sem);}int s_thread_sem_wait (s_thread_sem_t *sem){ if ((s_thread_api == NULL) || (s_thread_api->sem_wait == NULL)) { return -1; } return s_thread_api->sem_wait(sem);}int s_thread_sem_wait_timeout (s_thread_sem_t *sem, int msec){ if ((s_thread_api == NULL) || (s_thread_api->sem_wait_timeout == NULL)) { return -1; } return s_thread_api->sem_wait_timeout(sem, msec);}int s_thread_sem_post (s_thread_sem_t *sem){ if ((s_thread_api == NULL) || (s_thread_api->sem_post == NULL)) { return -1; } return s_thread_api->sem_post(sem);}int s_thread_mutex_init (s_thread_mutex_t **mut){ if ((s_thread_api == NULL) || (s_thread_api->mutex_init == NULL)) { return -1; } (*mut) = (s_thread_mutex_t *) s_malloc(sizeof(s_thread_mutex_t)); if (s_thread_api->mutex_init(*mut)) { goto err0; } return 0;err0: s_free(*mut); *mut = NULL; return -1;}int s_thread_mutex_destroy (s_thread_mutex_t *mut){ int ret; if ((s_thread_api == NULL) || (s_thread_api->mutex_destroy == NULL)) { return -1; } if (mut == NULL) { return 1; } ret = s_thread_api->mutex_destroy(mut); s_free(mut); mut = NULL; return ret;}int s_thread_mutex_lock (s_thread_mutex_t *mut){ if ((s_thread_api == NULL) || (s_thread_api->mutex_lock == NULL)) { return -1; } if (mut == NULL) { return -1; } return s_thread_api->mutex_lock(mut);}int s_thread_mutex_trylock (s_thread_mutex_t *mut){ if ((s_thread_api == NULL) || (s_thread_api->mutex_trylock == NULL)) { return -1; } if (mut == NULL) { return -1; } return s_thread_api->mutex_trylock(mut);}int s_thread_mutex_unlock (s_thread_mutex_t *mut){ if ((s_thread_api == NULL) || (s_thread_api->mutex_unlock == NULL)) { return -1; } if (mut == NULL) { return -1; } return s_thread_api->mutex_unlock(mut);}int s_thread_cond_init (s_thread_cond_t **cond){ if ((s_thread_api == NULL) || (s_thread_api->cond_init == NULL)) { return -1; } (*cond) = (s_thread_cond_t *) s_malloc(sizeof(s_thread_cond_t)); if (s_thread_api->cond_init(*cond)) { goto err0; } return 0;err0: s_free(*cond); *cond = NULL; return -1;}int s_thread_cond_destroy (s_thread_cond_t *cond){ int ret; if ((s_thread_api == NULL) || (s_thread_api->cond_destroy == NULL)) { return -1; } if (cond == NULL) { return 1; } ret = s_thread_api->cond_destroy(cond); s_free(cond); cond = NULL; return ret;}int s_thread_cond_signal (s_thread_cond_t *cond){ if ((s_thread_api == NULL) || (s_thread_api->cond_signal == NULL)) { return -1; } return s_thread_api->cond_signal(cond);}int s_thread_cond_broadcast (s_thread_cond_t *cond){ if ((s_thread_api == NULL) || (s_thread_api->cond_broadcast == NULL)) { return -1; } return s_thread_api->cond_broadcast(cond);}int s_thread_cond_wait (s_thread_cond_t *cond, s_thread_mutex_t *mut){ if ((s_thread_api == NULL) || (s_thread_api->cond_wait == NULL)) { return -1; } return s_thread_api->cond_wait(cond, mut);}int s_thread_cond_timedwait (s_thread_cond_t *cond, s_thread_mutex_t *mut, int msec){ if ((s_thread_api == NULL) || (s_thread_api->cond_timedwait == NULL)) { return -1; } return s_thread_api->cond_timedwait(cond, mut, msec);}void * s_thread_run (void *farg){ s_thread_arg_t *arg = (s_thread_arg_t *) farg; void *p = arg->arg; void * (*f) (void *) = arg->f; s_thread_mutex_lock(arg->mut); arg->flag = 1; s_thread_cond_signal(arg->cond); s_thread_mutex_unlock(arg->mut); f(p); return NULL;}s_thread_t * s_thread_create (void * (*f) (void *), void *farg){ s_thread_t *tid; s_thread_arg_t *arg; if ((s_thread_api == NULL) || (s_thread_api->thread_create == NULL)) { return NULL; } tid = (s_thread_t *) s_malloc(sizeof(s_thread_t)); arg = (s_thread_arg_t *) s_malloc(sizeof(s_thread_arg_t)); arg->f = f; arg->arg = farg; s_thread_cond_init(&arg->cond); s_thread_mutex_init(&arg->mut); s_thread_mutex_lock(arg->mut); arg->flag = 0; s_thread_cond_signal(arg->cond); s_thread_mutex_unlock(arg->mut); s_thread_api->thread_create(tid, &s_thread_run, (void *) arg); s_thread_mutex_lock(arg->mut); while (arg->flag != 1) { if (s_thread_cond_wait(arg->cond, arg->mut)) { debugf(DSYS, "s_thread_cond_wait failed"); return NULL; } } s_thread_mutex_unlock(arg->mut); s_thread_cond_destroy(arg->cond); s_thread_mutex_destroy(arg->mut); s_free(arg); arg = NULL; return tid;}int s_thread_cancel (s_thread_t *tid){ if ((s_thread_api == NULL) || (s_thread_api->thread_cancel == NULL)) { return -1; } return s_thread_api->thread_cancel(tid);}int s_thread_join (s_thread_t *tid, void **ret){ int r; if ((s_thread_api == NULL) || (s_thread_api->thread_join == NULL)) { return -1; } r = s_thread_api->thread_join(tid, ret); free(tid); return r;}int s_thread_self (void){ if ((s_thread_api == NULL) || (s_thread_api->thread_self == NULL)) { return -1; } return s_thread_api->thread_self();}void s_thread_exit (void *ret){ if ((s_thread_api == NULL) || (s_thread_api->thread_exit == NULL)) { return; } s_thread_api->thread_exit(ret);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?