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

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

#1 add doxygen prologue to .c file

File size: 2.6 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
42int
43CF_Thread_Create (CF_Thread * threadID,
44 CF_Thread_Function callback,
45 void * arg)
46{
47 int result = 0;
48
49#ifdef _WIN32
50 *threadID = (THREAD_TYPE) _beginthreadex (0, 0, callback, arg, 0, 0);
51 if (*threadID == NULL)
52 return CF_ERROR_THREAD_CREATE;
53#else
54 *threadID = (THREAD_TYPE *) calloc (sizeof (THREAD_TYPE), 1);
55 if (*threadID == NULL)
56 return CF_ERROR_THREAD_CREATE;
57
58 result = pthread_create ((THREAD_TYPE *) *threadID, NULL, callback, arg);
59 if (result < 0)
60 return CF_ERROR_THREAD_CREATE;
61#endif
62
63 return CF_OK;
64}
65
66int
67CF_Thread_Release (CF_Thread * threadID)
68{
69 CHECK_INVALID_THREAD (*threadID);
70
71 CF_Thread_Local_Close (*threadID);
72
73 return CF_OK;
74}
75
76int
77CF_Thread_Join (CF_Thread * threadID)
78{
79 CHECK_INVALID_THREAD (*threadID);
80
81#ifdef _WIN32
82 WaitForSingleObject ((THREAD_TYPE) *threadID, INFINITE);
83#else
84 char status[16] = {0x00,};
85 pthread_join (*((THREAD_TYPE *) *threadID), (void **)status);
86#endif
87
88 return CF_OK;
89}
90
91int
92CF_Mutex_Create (CF_Mutex * mutex)
93{
94 int result = 0;
95
96#ifdef _WIN32
97 *mutex = (MUTEX_TYPE) CreateMutexA (NULL, FALSE, NULL);
98 if (*mutex == NULL)
99 return CF_ERROR_MUTEX_CREATE;
100#else
101 *mutex = (MUTEX_TYPE *) calloc (sizeof (MUTEX_TYPE), 1);
102 if (*mutex == NULL)
103 return CF_ERROR_MUTEX_CREATE;
104
105 result = pthread_mutex_init (*mutex, NULL);
106 if (result < 0)
107 return CF_ERROR_MUTEX_CREATE;
108#endif
109
110 return CF_OK;
111}
112
113int
114CF_Mutex_Destory (CF_Mutex * mutex)
115{
116 CHECK_INVALID_MUTEX (*mutex);
117
118 CF_Thread_Local_Close (*mutex);
119
120 return CF_OK;
121}
122
123int
124CF_Mutex_Lock (CF_Mutex * mutex)
125{
126 CHECK_INVALID_MUTEX (*mutex);
127
128#ifdef _WIN32
129 WaitForSingleObject ((MUTEX_TYPE) *mutex, INFINITE);
130#else
131 pthread_mutex_lock ((MUTEX_TYPE *) *mutex);
132#endif
133
134 return CF_OK;
135}
136
137int
138CF_Mutex_Unlock (CF_Mutex * mutex)
139{
140 CHECK_INVALID_MUTEX (*mutex);
141
142#ifdef _WIN32
143 ReleaseMutex (*mutex);
144#else
145 pthread_mutex_unlock ((MUTEX_TYPE *) *mutex);
146#endif
147
148 return CF_OK;
149}
Note: See TracBrowser for help on using the repository browser.