source: libcf/trunk/src/cf_thread.c@ 57

Last change on this file since 57 was 57, checked in by cheese, 11 years ago

#1 fix thread interface

File size: 4.2 KB
RevLine 
[4]1/**
[28]2 * @file cf_thread.c
3 * @author myusgun <myusgun@gmail.com>
4 * @version 0.1
[4]5 */
6#include "cf_thread.h"
7#include "cf_local.h"
[40]8#include "cf_error.h"
[4]9
10#include <stdlib.h>
11
[50]12#if defined(_WIN32) || defined(_WIN64)
[4]13# include <windows.h>
14# include <process.h>
15# define THREAD_TYPE HANDLE
16# define MUTEX_TYPE HANDLE
[57]17# define THREAD_RETURN unsigned long /**< 스레드 워커 함수 반환 형 */
18# define THREAD_CALL __stdcall
[50]19#else // #if defined(_WIN32) || defined(_WIN64)
[4]20# include <pthread.h>
21# define THREAD_TYPE pthread_t
22# define MUTEX_TYPE pthread_mutex_t
[57]23# define THREAD_RETURN void * /**< 스레드 워커 함수 반환 형 */
24# define THREAD_CALL
[50]25#endif // #if defined(_WIN32) || defined(_WIN64)
[4]26
[55]27#define ASSERT_THREAD(__h) \
[4]28 if (__h == NULL) \
29 return CF_ERROR_THREAD_INVALID_ARGS
30
[55]31#define ASSERT_MUTEX(__h) \
[4]32 if (__h == NULL) \
33 return CF_ERROR_MUTEX_INVALID_ARGS
34
[23]35static int
[21]36CF_Thread_Local_Close (void * ctx)
[4]37{
[50]38#if defined(_WIN32) || defined(_WIN64)
[4]39 CloseHandle (ctx);
40#else
41 free (ctx);
42#endif
43
44 return CF_OK;
45}
46
[35]47/**
48 * 스레드를 생성
49 *
50 * @return 성공 시, CF_OK; 실패 시, 오류 코드
51 *
52 * @param threadID 스레드 아이디 주소
53 * @param callback 스레드 워커 함수 이름
54 * @param arg 스레드 함수로 전달할 인자
55 */
[4]56int
[5]57CF_Thread_Create (CF_Thread * threadID,
58 CF_Thread_Function callback,
59 void * arg)
[4]60{
61 int result = 0;
62
[57]63 THREAD_RETURN THREAD_CALL f = (THREAD_RETURN THREAD_CALL) callback;
64
[50]65#if defined(_WIN32) || defined(_WIN64)
[57]66
67 *threadID = (THREAD_TYPE) CreateThread (NULL, 0, f, arg, 0, NULL);
[8]68 if (*threadID == NULL)
69 return CF_ERROR_THREAD_CREATE;
[4]70#else
[8]71 *threadID = (THREAD_TYPE *) calloc (sizeof (THREAD_TYPE), 1);
72 if (*threadID == NULL)
73 return CF_ERROR_THREAD_CREATE;
[4]74
[57]75 result = pthread_create ((THREAD_TYPE *) *threadID, NULL, f, arg);
[8]76 if (result < 0)
77 return CF_ERROR_THREAD_CREATE;
[4]78#endif
79
80 return CF_OK;
81}
82
[35]83/**
84 * 스레드 아이디를 해제
85 *
86 * @return 성공 시, CF_OK; 실패 시, 오류 코드
87 *
88 * @param threadID 스레드 아이디 주소
89 *
90 * @remark 스레드 아이디를 해제하는 것이며 워커 스레드가 종료되지 않음
91 */
[4]92int
93CF_Thread_Release (CF_Thread * threadID)
94{
[55]95 ASSERT_THREAD (*threadID);
[4]96
[21]97 CF_Thread_Local_Close (*threadID);
[4]98
99 return CF_OK;
100}
101
[35]102/**
103 * 스레드가 종료될 때 까지 대기
104 *
105 * @return CF_OK 반환
106 *
107 * @param threadID 스레드 아이디 주소
108 */
[4]109int
110CF_Thread_Join (CF_Thread * threadID)
111{
[55]112 ASSERT_THREAD (*threadID);
[4]113
[50]114#if defined(_WIN32) || defined(_WIN64)
[5]115 WaitForSingleObject ((THREAD_TYPE) *threadID, INFINITE);
[4]116#else
[22]117 char status[16] = {0x00,};
118 pthread_join (*((THREAD_TYPE *) *threadID), (void **)status);
[4]119#endif
120
121 return CF_OK;
122}
123
[35]124/**
125 * 뮤텍스 생성
126 *
127 * @return 성공 시, CF_OK; 실패 시, 오류 코드
128 *
129 * @param mutex 뮤텍스 아이디 주소
130 *
131 * @see CF_Thread_Create
132 */
[4]133int
134CF_Mutex_Create (CF_Mutex * mutex)
135{
136 int result = 0;
137
[50]138#if defined(_WIN32) || defined(_WIN64)
[8]139 *mutex = (MUTEX_TYPE) CreateMutexA (NULL, FALSE, NULL);
140 if (*mutex == NULL)
141 return CF_ERROR_MUTEX_CREATE;
[4]142#else
[8]143 *mutex = (MUTEX_TYPE *) calloc (sizeof (MUTEX_TYPE), 1);
144 if (*mutex == NULL)
145 return CF_ERROR_MUTEX_CREATE;
[4]146
[8]147 result = pthread_mutex_init (*mutex, NULL);
148 if (result < 0)
149 return CF_ERROR_MUTEX_CREATE;
[4]150#endif
151
152 return CF_OK;
153}
154
[35]155/**
156 * 뮤텍스 해제
157 *
158 * @return 성공 시, CF_OK; 실패 시, 오류 코드
159 *
160 * @param mutex 뮤텍스 아이디 주소
161 */
[4]162int
163CF_Mutex_Destory (CF_Mutex * mutex)
164{
[55]165 ASSERT_MUTEX (*mutex);
[4]166
[21]167 CF_Thread_Local_Close (*mutex);
[4]168
169 return CF_OK;
170}
171
[35]172/**
173 * 뮤텍스 잠금
174 *
175 * @return 성공 시, CF_OK; 실패 시, 오류 코드
176 *
177 * @param mutex 뮤텍스 아이디 주소
178 */
[4]179int
180CF_Mutex_Lock (CF_Mutex * mutex)
181{
[55]182 ASSERT_MUTEX (*mutex);
[4]183
[50]184#if defined(_WIN32) || defined(_WIN64)
[4]185 WaitForSingleObject ((MUTEX_TYPE) *mutex, INFINITE);
186#else
187 pthread_mutex_lock ((MUTEX_TYPE *) *mutex);
188#endif
189
190 return CF_OK;
191}
192
[35]193/**
194 * 뮤텍스 잠금 해제
195 *
196 * @return 성공 시, CF_OK; 실패 시, 오류 코드
197 *
198 * @param mutex 뮤텍스 아이디 주소
199 */
[4]200int
201CF_Mutex_Unlock (CF_Mutex * mutex)
202{
[55]203 ASSERT_MUTEX (*mutex);
[4]204
[50]205#if defined(_WIN32) || defined(_WIN64)
[4]206 ReleaseMutex (*mutex);
207#else
208 pthread_mutex_unlock ((MUTEX_TYPE *) *mutex);
209#endif
210
211 return CF_OK;
212}
Note: See TracBrowser for help on using the repository browser.