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