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