Index: trunk/src/cf_log.c
===================================================================
--- trunk/src/cf_log.c	(revision 149)
+++ trunk/src/cf_log.c	(revision 151)
@@ -19,4 +19,5 @@
 #include "cf_local.h"
 #include "cf_error.h"
+#include "cf_util.h"
 
 #include <stdio.h>
@@ -29,6 +30,7 @@
 # include <Windows.h>
 #else
-# include <sys/time.h>
 #endif
+
+#define LOG_BUFFER_DEFAULT_SIZE			128 * 1024
 
 #define ASSERT_CTX(__ctx)	\
@@ -36,153 +38,23 @@
 		return CF_ERROR_LOG_INVALID_CTX
 
-#define ASSERT_INIT()					\
-	if (gLogPool.ctxPool == NULL	||	\
-		gLogPool.poolSize <= 0		)	\
-		return CF_ERROR_LOG_NOT_INITIALIZE
-
-#define ASSERT_MAPID(__mapid)			\
-	if (gLogPool.poolSize <= __mapid)	\
-		return CF_ERROR_LOG_INVALID_MAPID
-
-#define ASSERT_MAPPED_CTX(__mapid)			\
-	if (gLogPool.ctxPool[__mapid] != NULL)	\
-		return CF_ERROR_LOG_ALREADY_MAPPED_ID
-
-#define ASSERT_NOT_MAPPED_CTX(__mapid)		\
-	if (gLogPool.ctxPool[__mapid] == NULL)	\
-		return CF_ERROR_LOG_NOT_MAPPED_ID
-
-#define LOG_BUFFER_DEFAULT_SIZE			128 * 1024
-
-#define LOG_DATETIME_LENGTH				sizeof ("0000-00-00 00:00:00.000") - 1
-
-/** 로그 컨텍스트 (Opaque) */
-typedef void *	CF_Log_Ctx;
-
-typedef struct __cf_util_datetime__
-{
-	int year;
-	int month;
-	int day;
-	int week; /* SUN:0 ~ SAT:6 */
-
-	int hour;
-	int min;
-	int sec;
-	int usec;
-} CF_LOG_DATETIME;
-
-/** 로그 컨텍스트 (CF_Log_Ctx의 구현) */
+#define ASSERT_ARGS(x)	\
+	if ((x))			\
+		return CF_ERROR_LOG_INVALID_ARGS
+
+/** 로그 컨텍스트 (cf_ctx의 구현) */
 typedef struct __cf_log_ctx__
 {
 	char			path[NAME_LENGTH + 1];
-	int				fd;
+	cf_ctx			file;
 	char			* buffer;
 	size_t			size;	/* entire size of buffer */
 	size_t			length; /* data length in current */
-	CF_Mutex_Ctx	mutex;
+	cf_ctx	mutex;
 } CF_LOG_CONTEXT;
-
-typedef struct __cf_log_array__
-{
-	CF_Log_Ctx	* ctxPool;
-	int			poolSize;
-} CF_LOG_POOL;
-
-static CF_LOG_POOL	gLogPool;
-
-#if defined(_WIN32) || defined(_WIN64)
-/* {{{ */
-struct timezone
-{
-	int tz_minuteswest;	/* minutes W of Greenwich */
-	int tz_dsttime;		/* type of dst correction */
-};
-
-int gettimeofday (struct timeval *tv, struct timezone *tz)
-{
-	FILETIME			ft;
-	unsigned __int64	buf =0;
-	//static int tzflag = 0;
-
-	if (NULL != tv)
-	{
-		GetSystemTimeAsFileTime (&ft);
-
-		buf |=	ft.dwHighDateTime;
-		buf <<=	32;
-		buf |=	ft.dwLowDateTime;
-
-		if (buf)
-		{
-			buf /= 10;
-			buf -= ((369 * 365 + 89) * (unsigned __int64) 86400) * 1000000;
-		}
-
-		tv->tv_sec = (long)(buf / 1000000UL);
-		tv->tv_usec = (long)(buf % 1000000UL);
-	}
-
-	/*
-	if (NULL != tz)
-	{
-		if (!tzflag)
-		{
-			_tzset();
-			tzflag++;
-		}
-
-		// Adjust for the timezone west of Greenwich
-		tz->tz_minuteswest = _timezone / 60;
-		tz->tz_dsttime = _daylight;
-	}
-	*/
-
-	return 0;
-}
-/* }}} */
-#endif
-
-static int
-CF_Log_Local_GetTime (CF_LOG_DATETIME * dt)
-{
-	struct timeval	timeVal;
-	struct tm		* timeSt;
-
-	gettimeofday (&timeVal, NULL);
-	timeSt = localtime ((const time_t *)&timeVal.tv_sec);
-
-	dt->year	= timeSt->tm_year + 1900;
-	dt->month	= timeSt->tm_mon + 1;
-	dt->day		= timeSt->tm_mday;
-	dt->week	= timeSt->tm_wday;
-
-	dt->hour	= timeSt->tm_hour;
-	dt->min		= timeSt->tm_min;
-	dt->sec		= timeSt->tm_sec;
-
-	dt->usec	= (int) timeVal.tv_usec;
-
-	return CF_OK;
-}
-
-static int
-CF_Log_Local_GetTimeString (char * buffer)
-{
-	CF_LOG_DATETIME dt;
-	CF_Log_Local_GetTime (&dt);
-
-	snprintf (buffer, LOG_DATETIME_LENGTH,
-			  "%04d-%02d-%02d %02d:%02d:%02d.%03d",
-			  dt.year, dt.month, dt.day,
-			  dt.hour, dt.min, dt.sec, dt.usec);
-
-	return CF_OK;
-}
 
 static int
 CF_Log_Local_Flush (CF_LOG_CONTEXT * ctx)
 {
-	if (CF_File_Write (ctx->fd, ctx->buffer, ctx->length) < 0)
+	if (CF_File_Write (ctx->file, ctx->buffer, ctx->length) < 0)
 		return CF_ERROR_LOG_FLUSH;
 
@@ -208,17 +80,21 @@
 				   const size_t		demandSize)
 {
-	int result = CF_OK;
+	int result = 0;
+
+	size_t writeSize;
+	size_t remainSize;
 
 	if (ctx->size > 0) /* 버퍼단위 버퍼링.... */
 	{
-		size_t writeSize;
-		size_t remainSize;
-
 		remainSize = demandSize;
 		while (remainSize)
 		{
-			writeSize = (ctx->size - ctx->length) < remainSize ? (ctx->size - ctx->length) : remainSize;
-
-			memcpy (ctx->buffer + ctx->length, buffer + demandSize - remainSize, writeSize);
+			writeSize = (ctx->size - ctx->length) < remainSize
+					  ? (ctx->size - ctx->length)
+					  : remainSize;
+
+			memcpy (ctx->buffer + ctx->length,
+					buffer + demandSize - remainSize,
+					writeSize);
 			ctx->length += writeSize;
 
@@ -247,12 +123,12 @@
  * \param ctx 로그 컨텍스트
  */
-static int
-CF_Log_SetMultiThread (CF_Log_Ctx ctx)
-{
-	CF_LOG_CONTEXT * context = (CF_LOG_CONTEXT *) ctx;
-
-	ASSERT_CTX (ctx);
-
-	if (CF_Mutex_CreateCtx (&context->mutex) < 0)
+int
+CF_Log_SetMultiThread (cf_ctx ctx)
+{
+	CF_LOG_CONTEXT * context = (CF_LOG_CONTEXT *) ctx;
+
+	ASSERT_CTX (ctx);
+
+	if (CF_Mutex_Create (&context->mutex) < 0)
 		return CF_ERROR_LOG_SET_MULTITHREAD;
 
@@ -267,12 +143,12 @@
  * \param ctx 로그 컨텍스트
  */
-static int
-CF_Log_UnsetMultiThread (CF_Log_Ctx ctx)
-{
-	CF_LOG_CONTEXT * context = (CF_LOG_CONTEXT *) ctx;
-
-	ASSERT_CTX (ctx);
-
-	if (CF_Mutex_DestoryCtx (context->mutex) < 0)
+int
+CF_Log_UnsetMultiThread (cf_ctx ctx)
+{
+	CF_LOG_CONTEXT * context = (CF_LOG_CONTEXT *) ctx;
+
+	ASSERT_CTX (ctx);
+
+	if (CF_Mutex_Destory (context->mutex) < 0)
 		return CF_ERROR_LOG_UNSET_MULTITHREAD;
 
@@ -293,19 +169,21 @@
  */
 static int
-CF_Log_Local_WriteVA (CF_Log_Ctx	ctx,
-					  const char	* prefix,
-					  const char	* fmt,
-					  va_list		valist)
+CF_Log_Local_WriteVA (CF_LOG_CONTEXT	* context,
+					  const char		* prefix,
+					  const char		* fmt,
+					  va_list			valist)
 {
 #define BUF_LEN	16 * 1024
-	CF_LOG_CONTEXT	* context = (CF_LOG_CONTEXT *) ctx;
-	char		buffer[BUF_LEN + 1] = {0x00,};
-	char		datetime[LOG_DATETIME_LENGTH + 1] = {0x00,};
-	int			length = 0;
-	int			result = 0;
-
-	ASSERT_CTX (ctx);
-
-	CF_Log_Local_GetTimeString (datetime);
+	char	buffer[BUF_LEN + 1] = {0x00,};
+	char	datetime[CF_UTIL_DATETIME_LENGTH + 1] = {0x00,};
+	int		length = 0;
+	int		result = 0;
+
+	CF_UTIL_DATETIME dt;
+
+	ASSERT_CTX (context);
+
+	CF_Util_GetCurrentTime (&dt);
+	CF_Util_GetTimeString (&dt, datetime);
 	length = snprintf (buffer, BUF_LEN, "[%s][%s] ", datetime, prefix);
 	vsnprintf (&buffer[length], BUF_LEN - (size_t)length, fmt, valist);
@@ -329,13 +207,15 @@
  */
 int
-CF_Log_WriteCtx (CF_Log_Ctx	ctx,
-				 const char	* prefix,
-				 const char	* fmt, ...)
-{
+CF_Log_Write (cf_ctx		ctx,
+			  const char	* prefix,
+			  const char	* fmt, ...)
+{
+	CF_LOG_CONTEXT * context = (CF_LOG_CONTEXT *) ctx;
+
 	int		result = 0;
 	va_list	valist;
 
 	va_start (valist, fmt);
-	result = CF_Log_Local_WriteVA (ctx, prefix, fmt, valist);
+	result = CF_Log_Local_WriteVA (context, prefix, fmt, valist);
 	va_end (valist);
 
@@ -350,9 +230,10 @@
  * \param ctx 로그 컨텍스트
  */
-static int
-CF_Log_FlushCtx (CF_Log_Ctx ctx)
-{
-	CF_LOG_CONTEXT	* context = (CF_LOG_CONTEXT *) ctx;
-	int			result = 0;
+int
+CF_Log_Flush (cf_ctx ctx)
+{
+	int result = 0;
+
+	CF_LOG_CONTEXT * context = (CF_LOG_CONTEXT *) ctx;
 
 	ASSERT_CTX (ctx);
@@ -372,6 +253,6 @@
  * \param ctx 로그 컨텍스트
  */
-static int
-CF_Log_DestroyCtx (CF_Log_Ctx ctx)
+int
+CF_Log_Destroy (cf_ctx ctx)
 {
 	CF_LOG_CONTEXT * context = (CF_LOG_CONTEXT *) ctx;
@@ -381,5 +262,5 @@
 	if (context->size > 0)
 	{
-		CF_Log_FlushCtx (ctx);
+		CF_Log_Flush (ctx);
 		free (context->buffer);
 		context->buffer = NULL;
@@ -387,8 +268,10 @@
 	}
 
-	CF_File_Close (context->fd);
-
-	CF_Mutex_DestoryCtx (context->mutex);
+	CF_File_Close (context->file);
+
+	CF_Mutex_Destory (context->mutex);
 	context->mutex = NULL;
+
+	free (context);
 
 	return CF_OK;
@@ -406,8 +289,8 @@
  * \see CF_LOG_DEFAULT_BUFFER, CF_LOG_NO_BUFFER
  */
-static int
-CF_Log_CreateCtx (CF_Log_Ctx	* ctx,
-				  const char	* path,
-				  const int		memsize)
+int
+CF_Log_Create (cf_ctx		* ctx,
+			   const char	* path,
+			   const int	memsize)
 {
 	int result = 0;
@@ -417,12 +300,12 @@
 			 : memsize;
 
-	CF_LOG_CONTEXT	* context = NULL;
-
-	if (path == NULL)
-		return CF_ERROR_LOG_INVALID_ARGS;
+	CF_LOG_CONTEXT * context = NULL;
+
+	ASSERT_CTX (ctx);
+	ASSERT_ARGS (path == NULL);
 
 	TRY
 	{
-		context = (CF_LOG_CONTEXT *) calloc (sizeof (CF_LOG_CONTEXT), 1);
+		context = NEWCTX (CF_LOG_CONTEXT);
 		if (context == NULL)
 		{
@@ -431,11 +314,11 @@
 		}
 
-		context->fd = CF_File_Open (path, fileFlag);
-		if (context->fd < 0)
+		result = CF_File_Open (&context->file, path, fileFlag);
+		if (result < 0)
 		{
 			result = CF_ERROR_LOG_CREATE_FILE;
 			TRY_BREAK;
 		}
-		snprintf (context->path, sizeof (context->path) -1, "%s", path);
+		snprintf (context->path, sizeof (context->path) - 1, "%s", path);
 
 		if (size > 0)
@@ -450,249 +333,11 @@
 		}
 
-		*ctx = (CF_Log_Ctx) context;
+		*ctx = (cf_ctx) context;
 	}
 	CATCH_IF (result < 0)
 	{
-		CF_Log_DestroyCtx ((CF_Log_Ctx) context);
-	}
-
-	return result;
-}
-
-/**
- * 로그 컨텍스트에 아이디 넘버 할당<br />
- * 로그 기록 시, 아이디 넘버를 사용하면 해당 로그로 기록할 수 있음
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param mapid	부여할 아이디 넘버
- * \param ctx	로그 컨텍스트
- *
- * \remarks 반드시 먼저 초기화 해야하며, 초기화 시에 주어진 번호보다 작은 아이디 넘버를 사용
- */
-static int
-CF_Log_MapCtxID (const int			mapid,
-				 const CF_Log_Ctx	ctx)
-{
-	ASSERT_INIT ();
-	ASSERT_MAPID (mapid);
-	ASSERT_MAPPED_CTX (mapid);
-
-	gLogPool.ctxPool[mapid] = ctx;
-
-	return CF_OK;
-}
-
-/**
- * 아이디 넘버에 해당하는 로그를 닫고 해당하는 컨텍스트를 해제
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param mapid 로그의 아이디 넘버
- *
- * \remarks 아이디 넘버에 해당하는 컨텍스트가 해제되므로 주의
- */
-static int
-CF_Log_UnmapCtxID (const int mapid)
-{
-	ASSERT_INIT ();
-	ASSERT_MAPID (mapid);
-	ASSERT_NOT_MAPPED_CTX (mapid);
-
-	CF_Log_DestroyCtx (gLogPool.ctxPool[mapid]);
-
-	free (gLogPool.ctxPool[mapid]);
-	gLogPool.ctxPool[mapid] = NULL;
-
-	return CF_OK;
-}
-
-/**
- * 아이디 넘버에 해당하는 로그 컨텍스트를 얻기
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param mapid	로그의 아이디 넘버
- * \param ctx	로그 컨텍스트 받을 주소
- */
-static int
-CF_Log_GetMappedCtx (const int	mapid,
-					 CF_Log_Ctx	* ctx)
-{
-	ASSERT_INIT ();
-	ASSERT_MAPID (mapid);
-	ASSERT_NOT_MAPPED_CTX (mapid);
-
-	*ctx = gLogPool.ctxPool[mapid];
-
-	return CF_OK;
-}
-
-/**
- * 로그를 사용하기 위해 초기화
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param poolSize	로그 풀 크기로, 로그 아이디 넘버의 최대 값
- */
-int
-CF_Log_Initialize (const int poolSize)
-{
-	memset (&gLogPool, 0x00, sizeof (CF_LOG_POOL));
-
-	if (poolSize > 0)
-	{
-		gLogPool.ctxPool =
-			(CF_Log_Ctx *) calloc ((size_t) poolSize, sizeof (CF_Log_Ctx));
-		if (gLogPool.ctxPool == NULL)
-			return CF_ERROR_LOG_INITIALIZE;
-		gLogPool.poolSize = poolSize;
-	}
-
-	return CF_OK;
-}
-
-/**
- * 로그가 모두 사용된 후 자원 해제
- *
- * \return CF_OK 반환
- */
-int
-CF_Log_Finalize (void)
-{
-	int mapid = 0;
-
-	for (mapid = 0 ; mapid < gLogPool.poolSize ; mapid++)
-	{
-		CF_Log_UnmapCtxID (mapid);
-	}
-
-	if (gLogPool.ctxPool != NULL)
-		free (gLogPool.ctxPool);
-
-	memset (&gLogPool, 0x00, sizeof (CF_LOG_POOL));
-
-	return CF_OK;
-}
-
-/**
- * 로그 열기
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param mapid		로그의 아이디 넘버
- * \param path		로그 파일 경로
- * \param memsize	로그 버퍼 크기
- *
- * \see CF_LOG_DEFAULT_BUFFER, CF_LOG_NO_BUFFER
- */
-int
-CF_Log_Open (const int	mapid,
-			 const char	* path,
-			 const int	memsize)
-{
-	int			result = 0;
-	CF_Log_Ctx	ctx = NULL;
-
-	result = CF_Log_CreateCtx (&ctx, path, memsize);
-	if (result < 0)
-		return result;
-
-	result = CF_Log_MapCtxID (mapid, ctx);
-	if (result < 0)
-		CF_Log_DestroyCtx (ctx);
-
-	return result;
-}
-
-/**
- * 로그 닫기
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param mapid 로그의 아이디 넘버
- */
-int
-CF_Log_Close (const int mapid)
-{
-	return CF_Log_UnmapCtxID (mapid);
-}
-
-/**
- * 로그 버퍼의 데이터를 즉시 로그 파일에 쓰기
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param mapid 로그의 아이디 넘버
- */
-int
-CF_Log_Flush (const int mapid)
-{
-	int			result = 0;
-	CF_Log_Ctx	ctx = NULL;
-
-	result = CF_Log_GetMappedCtx (mapid, &ctx);
-	if (result < 0)
-		return result;
-
-	result = CF_Log_FlushCtx (ctx);
-
-	return result;
-}
-
-/**
- * 로그 컨텍스트에 멀티쓰레드 모드 설정
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드 
- *
- * \param mapid	로그의 아이디 넘버
- * \param flag	설정/해제 bool 플래그
- *
- * \see CF_BOOL
- */
-int
-CF_Log_SetMT (const int		mapid,
-			  const CF_BOOL	flag)
-{
-	int			result = 0;
-	CF_Log_Ctx	ctx = NULL;
-
-	result = CF_Log_GetMappedCtx (mapid, &ctx);
-	if (result < 0)
-		return result;
-
-	result = (flag) ? CF_Log_SetMultiThread (ctx) :
-					  CF_Log_UnsetMultiThread (ctx);
-
-	return result;
-}
-
-/**
- * 로그 쓰기
- *
- * \return 성공 시, CF_OK; 실패 시, 오류 코드
- *
- * \param mapid		로그의 아이디 넘버
- * \param prefix	로그의 프리픽스 문자열
- * \param fmt		포맷 스트링
- * \param ...		가변 인자
- */
-int
-CF_Log_Write (const int		mapid,
-			  const char	* prefix,
-			  const char	* fmt, ...)
-{
-	int			result = 0;
-	CF_Log_Ctx	ctx = NULL;
-	va_list		valist;
-
-	result = CF_Log_GetMappedCtx (mapid, &ctx);
-	if (result < 0)
-		return result;
-
-	va_start (valist, fmt);
-	result = CF_Log_Local_WriteVA (ctx, prefix, fmt, valist);
-	va_end (valist);
-
-	return result;
-}
+		CF_Log_Destroy ((cf_ctx) context);
+	}
+
+	return result;
+}
