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

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

#1 fix thread worker function casting

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