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

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

#1 rename threading worker function typedef in code

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