Mercurial > audio-send
view Alc/alcThread.c @ 19:22ac5a0367cd
finally, a first pass at ear.org
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Thu, 03 Nov 2011 14:54:45 -0700 |
parents | f9476ff7637e |
children |
line wrap: on
line source
1 /**2 * OpenAL cross platform audio library3 * Copyright (C) 1999-2007 by authors.4 * This library is free software; you can redistribute it and/or5 * modify it under the terms of the GNU Library General Public6 * License as published by the Free Software Foundation; either7 * version 2 of the License, or (at your option) any later version.8 *9 * This library is distributed in the hope that it will be useful,10 * but WITHOUT ANY WARRANTY; without even the implied warranty of11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU12 * Library General Public License for more details.13 *14 * You should have received a copy of the GNU Library General Public15 * License along with this library; if not, write to the16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,17 * Boston, MA 02111-1307, USA.18 * Or go to http://www.gnu.org/copyleft/lgpl.html19 */21 #include "config.h"23 #include <stdlib.h>25 #include "alMain.h"26 #include "alThunk.h"29 #ifdef _WIN3231 typedef struct {32 ALuint (*func)(ALvoid*);33 ALvoid *ptr;34 HANDLE thread;35 } ThreadInfo;37 static DWORD CALLBACK StarterFunc(void *ptr)38 {39 ThreadInfo *inf = (ThreadInfo*)ptr;40 ALint ret;42 ret = inf->func(inf->ptr);43 ExitThread((DWORD)ret);45 return (DWORD)ret;46 }48 ALvoid *StartThread(ALuint (*func)(ALvoid*), ALvoid *ptr)49 {50 DWORD dummy;51 ThreadInfo *inf = malloc(sizeof(ThreadInfo));52 if(!inf) return 0;54 inf->func = func;55 inf->ptr = ptr;57 inf->thread = CreateThread(NULL, 0, StarterFunc, inf, 0, &dummy);58 if(!inf->thread)59 {60 free(inf);61 return NULL;62 }64 return inf;65 }67 ALuint StopThread(ALvoid *thread)68 {69 ThreadInfo *inf = thread;70 DWORD ret = 0;72 WaitForSingleObject(inf->thread, INFINITE);73 GetExitCodeThread(inf->thread, &ret);74 CloseHandle(inf->thread);76 free(inf);78 return (ALuint)ret;79 }81 #else83 #include <pthread.h>85 typedef struct {86 ALuint (*func)(ALvoid*);87 ALvoid *ptr;88 ALuint ret;89 pthread_t thread;90 } ThreadInfo;92 static void *StarterFunc(void *ptr)93 {94 ThreadInfo *inf = (ThreadInfo*)ptr;95 inf->ret = inf->func(inf->ptr);96 return NULL;97 }99 ALvoid *StartThread(ALuint (*func)(ALvoid*), ALvoid *ptr)100 {101 ThreadInfo *inf = malloc(sizeof(ThreadInfo));102 if(!inf) return NULL;104 inf->func = func;105 inf->ptr = ptr;106 if(pthread_create(&inf->thread, NULL, StarterFunc, inf) != 0)107 {108 free(inf);109 return NULL;110 }112 return inf;113 }115 ALuint StopThread(ALvoid *thread)116 {117 ThreadInfo *inf = thread;118 ALuint ret;120 pthread_join(inf->thread, NULL);121 ret = inf->ret;123 free(inf);125 return ret;126 }128 #endif