Changeset 126 in libcf


Ignore:
Timestamp:
06/14/13 13:41:55 (12 years ago)
Author:
cheese
Message:

#1 separate header/source files for thread and mutex

Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/cf_thread.h

    r122 r126  
    33 * \author  myusgun <myusgun@gmail.com>
    44 *
    5  * \brief 멀티스레드 및 뮤텍스 지원
     5 * \brief 멀티스레드 지원
    66 *
    77 * \example thread.c
     
    1212#include "cf_base.h"
    1313
     14#include "cf_mutex.h"
     15
    1416/** 스레드 워커 함수 프로토타입 */
    1517typedef int (* CF_Thread_Function) (void *);
     
    1719/** 스레드 컨텍스트 */
    1820typedef void *  CF_Thread_Ctx;
    19 
    20 /** 뮤텍스 컨텍스트 */
    21 typedef void *  CF_Mutex_Ctx;
    2221
    2322#ifdef __cplusplus
     
    3938CF_Thread_Join          (CF_Thread_Ctx ctx);
    4039
    41 CF_EXPORT int
    42 CF_Mutex_CreateCtx      (CF_Mutex_Ctx * ctx);
    43 
    44 CF_EXPORT int
    45 CF_Mutex_DestoryCtx     (CF_Mutex_Ctx ctx);
    46 
    47 CF_EXPORT int
    48 CF_Mutex_Lock           (CF_Mutex_Ctx ctx);
    49 
    50 CF_EXPORT int
    51 CF_Mutex_Unlock         (CF_Mutex_Ctx ctx);
    52 
    5340#ifdef __cplusplus
    5441}
  • trunk/src/cf_thread.c

    r123 r126  
    33 * \author  myusgun <myusgun@gmail.com>
    44 *
    5  * \brief 멀티 스레드 및 뮤텍스 구현
     5 * \brief 멀티 스레드 구현
    66 */
    77#include "cf_thread.h"
    8 #include "cf_local.h"
    98#include "cf_error.h"
    109
     
    3029        return CF_ERROR_THREAD_INVALID_CTX
    3130
    32 #define ASSERT_MUTEX_CTX(__ctx) \
    33     if (__ctx == NULL)          \
    34         return CF_ERROR_MUTEX_INVALID_CTX
    35 
    3631typedef THREAD_RETURN (THREAD_CALL * THREAD_WORKER) (void *);
    3732
     
    4338} CF_THREAD_CTX;
    4439
    45 typedef struct __cf_ctx_ctx__
    46 {
    47     MUTEX_TYPE  mid;
    48 } CF_MUTEX_CTX;
    49 
    5040static int
    5141CF_Thread_Local_Close (THREAD_TYPE tid)
     
    5646
    5747    CloseHandle (tid);
    58 #endif
    59 
    60     return CF_OK;
    61 }
    62 
    63 static int
    64 CF_Mutex_Local_Close (MUTEX_TYPE mid)
    65 {
    66 #if defined(_WIN32) || defined(_WIN64)
    67     if (mid == NULL)
    68         return CF_ERROR_MUTEX_INVALID_ARGS;
    69 
    70     CloseHandle (mid);
    71 #else
    72     pthread_mutex_destroy (&mid);
    7348#endif
    7449
     
    213188    return CF_OK;
    214189}
    215 
    216 /**
    217  * 뮤텍스 컨텍스트를 생성
    218  *
    219  * \return 성공 시, CF_OK; 실패 시, 오류 코드
    220  *
    221  * \param ctx 뮤텍스 컨텍스트 주소
    222  */
    223 int
    224 CF_Mutex_CreateCtx (CF_Mutex_Ctx * ctx)
    225 {
    226     int result = 0;
    227 
    228     CF_MUTEX_CTX * context = NULL;
    229 
    230     context = (CF_MUTEX_CTX *) calloc (sizeof (CF_MUTEX_CTX), 1);
    231     if (context == NULL)
    232         return CF_ERROR_MUTEX_CREATE_CTX;
    233 
    234     TRY
    235     {
    236 #if defined(_WIN32) || defined(_WIN64)
    237         context->mid = CreateMutexA (NULL, FALSE, NULL);
    238         if (context->mid == NULL)
    239         {
    240             result = CF_ERROR_MUTEX_CREATE;
    241             TRY_BREAK;
    242         }
    243 #else
    244         result = pthread_mutex_init (&context->mid, NULL);
    245         if (result)
    246         {
    247             result = CF_ERROR_MUTEX_CREATE;
    248             TRY_BREAK;
    249         }
    250 #endif
    251 
    252         *ctx = context;
    253     }
    254     CATCH_IF (result < 0)
    255     {
    256         CF_Mutex_DestoryCtx ((CF_Mutex_Ctx) context);
    257     }
    258 
    259     return result;
    260 }
    261 
    262 /**
    263  * 뮤텍스 컨텍스트 해제
    264  *
    265  * \return 성공 시, CF_OK; 실패 시, 오류 코드
    266  *
    267  * \param ctx 뮤텍스 컨텍스트
    268  */
    269 int
    270 CF_Mutex_DestoryCtx (CF_Mutex_Ctx ctx)
    271 {
    272     CF_MUTEX_CTX * context = ctx;
    273 
    274     ASSERT_MUTEX_CTX (ctx);
    275 
    276     CF_Mutex_Local_Close (context->mid);
    277     free (context);
    278 
    279     return CF_OK;
    280 }
    281 
    282 /**
    283  * 뮤텍스 잠금
    284  *
    285  * \return 성공 시, CF_OK; 실패 시, 오류 코드
    286  *
    287  * \param ctx 뮤텍스 컨텍스트
    288  */
    289 int
    290 CF_Mutex_Lock (CF_Mutex_Ctx ctx)
    291 {
    292     CF_MUTEX_CTX * context = ctx;
    293 
    294     ASSERT_MUTEX_CTX (ctx);
    295 
    296 #if defined(_WIN32) || defined(_WIN64)
    297     WaitForSingleObject (context->mid, INFINITE);
    298 #else
    299     pthread_mutex_lock (&context->mid);
    300 #endif
    301 
    302     return CF_OK;
    303 }
    304 
    305 /**
    306  * 뮤텍스 잠금 해제
    307  *
    308  * \return 성공 시, CF_OK; 실패 시, 오류 코드
    309  *
    310  * \param ctx 뮤텍스 컨텍스트
    311  */
    312 int
    313 CF_Mutex_Unlock (CF_Mutex_Ctx ctx)
    314 {
    315     CF_MUTEX_CTX * context = ctx;
    316 
    317     ASSERT_MUTEX_CTX (ctx);
    318 
    319 #if defined(_WIN32) || defined(_WIN64)
    320     ReleaseMutex (context->mid);
    321 #else
    322     pthread_mutex_unlock (&context->mid);
    323 #endif
    324 
    325     return CF_OK;
    326 }
  • trunk/src/makefile

    r119 r126  
    1212                    cf_socket       \
    1313                    cf_thread       \
     14                    cf_mutex        \
    1415                    cf_debug        \
    1516                    cf_log          \
Note: See TracChangeset for help on using the changeset viewer.