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

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

#1 separate example code and doxygen comment and fix logging push logic by vfire

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