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
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"
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
[23]30static int
[21]31CF_Thread_Local_Close (void * ctx)
[4]32{
33#ifdef _WIN32
34 CloseHandle (ctx);
35#else
36 free (ctx);
37#endif
38
39 return CF_OK;
40}
41
[35]42/**
43 * 스레드를 생성
44 *
45 * @return 성공 시, CF_OK; 실패 시, 오류 코드
46 *
47 * @param threadID 스레드 아이디 주소
48 * @param callback 스레드 워커 함수 이름
49 * @param arg 스레드 함수로 전달할 인자
50 */
[4]51int
[5]52CF_Thread_Create (CF_Thread * threadID,
53 CF_Thread_Function callback,
54 void * arg)
[4]55{
56 int result = 0;
57
58#ifdef _WIN32
[8]59 *threadID = (THREAD_TYPE) _beginthreadex (0, 0, callback, arg, 0, 0);
60 if (*threadID == NULL)
61 return CF_ERROR_THREAD_CREATE;
[4]62#else
[8]63 *threadID = (THREAD_TYPE *) calloc (sizeof (THREAD_TYPE), 1);
64 if (*threadID == NULL)
65 return CF_ERROR_THREAD_CREATE;
[4]66
[8]67 result = pthread_create ((THREAD_TYPE *) *threadID, NULL, callback, arg);
68 if (result < 0)
69 return CF_ERROR_THREAD_CREATE;
[4]70#endif
71
72 return CF_OK;
73}
74
[35]75/**
76 * 스레드 아이디를 해제
77 *
78 * @return 성공 시, CF_OK; 실패 시, 오류 코드
79 *
80 * @param threadID 스레드 아이디 주소
81 *
82 * @remark 스레드 아이디를 해제하는 것이며 워커 스레드가 종료되지 않음
83 */
[4]84int
85CF_Thread_Release (CF_Thread * threadID)
86{
87 CHECK_INVALID_THREAD (*threadID);
88
[21]89 CF_Thread_Local_Close (*threadID);
[4]90
91 return CF_OK;
92}
93
[35]94/**
95 * 스레드가 종료될 때 까지 대기
96 *
97 * @return CF_OK 반환
98 *
99 * @param threadID 스레드 아이디 주소
100 */
[4]101int
102CF_Thread_Join (CF_Thread * threadID)
103{
104 CHECK_INVALID_THREAD (*threadID);
105
106#ifdef _WIN32
[5]107 WaitForSingleObject ((THREAD_TYPE) *threadID, INFINITE);
[4]108#else
[22]109 char status[16] = {0x00,};
110 pthread_join (*((THREAD_TYPE *) *threadID), (void **)status);
[4]111#endif
112
113 return CF_OK;
114}
115
[35]116/**
117 * 뮤텍스 생성
118 *
119 * @return 성공 시, CF_OK; 실패 시, 오류 코드
120 *
121 * @param mutex 뮤텍스 아이디 주소
122 *
123 * @see CF_Thread_Create
124 */
[4]125int
126CF_Mutex_Create (CF_Mutex * mutex)
127{
128 int result = 0;
129
130#ifdef _WIN32
[8]131 *mutex = (MUTEX_TYPE) CreateMutexA (NULL, FALSE, NULL);
132 if (*mutex == NULL)
133 return CF_ERROR_MUTEX_CREATE;
[4]134#else
[8]135 *mutex = (MUTEX_TYPE *) calloc (sizeof (MUTEX_TYPE), 1);
136 if (*mutex == NULL)
137 return CF_ERROR_MUTEX_CREATE;
[4]138
[8]139 result = pthread_mutex_init (*mutex, NULL);
140 if (result < 0)
141 return CF_ERROR_MUTEX_CREATE;
[4]142#endif
143
144 return CF_OK;
145}
146
[35]147/**
148 * 뮤텍스 해제
149 *
150 * @return 성공 시, CF_OK; 실패 시, 오류 코드
151 *
152 * @param mutex 뮤텍스 아이디 주소
153 */
[4]154int
155CF_Mutex_Destory (CF_Mutex * mutex)
156{
157 CHECK_INVALID_MUTEX (*mutex);
158
[21]159 CF_Thread_Local_Close (*mutex);
[4]160
161 return CF_OK;
162}
163
[35]164/**
165 * 뮤텍스 잠금
166 *
167 * @return 성공 시, CF_OK; 실패 시, 오류 코드
168 *
169 * @param mutex 뮤텍스 아이디 주소
170 */
[4]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
[35]185/**
186 * 뮤텍스 잠금 해제
187 *
188 * @return 성공 시, CF_OK; 실패 시, 오류 코드
189 *
190 * @param mutex 뮤텍스 아이디 주소
191 */
[4]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.