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

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

#1 arrange definition and fix for windows

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