added mio_sys_resetlog()
This commit is contained in:
		| @ -172,6 +172,10 @@ mio_errnum_t mio_sys_syserrstrb ( | ||||
| 	mio_oow_t         len | ||||
| ); | ||||
|  | ||||
| void mio_sys_resetlog ( | ||||
| 	mio_t*            mio | ||||
| ); | ||||
|  | ||||
| void mio_sys_writelog ( | ||||
| 	mio_t*            mio, | ||||
| 	mio_bitmask_t     mask, | ||||
|  | ||||
| @ -247,7 +247,23 @@ void mio_fini (mio_t* mio) | ||||
|  | ||||
| 	mio_sys_fini (mio); /* finalize the system dependent data */ | ||||
|  | ||||
| 	mio_freemem (mio, mio->log.ptr); | ||||
| 	if (mio->log.ptr) | ||||
| 	{ | ||||
| 		mio_freemem (mio, mio->log.ptr); | ||||
| 		mio->log.ptr = MIO_NULL; | ||||
| 	} | ||||
|  | ||||
| 	if (mio->option.log_target_u) | ||||
| 	{ | ||||
| 		mio_freemem (mio, mio->option.log_target_u); | ||||
| 		mio->option.log_target_u = MIO_NULL; | ||||
| 	} | ||||
|  | ||||
| 	if (mio->option.log_target_b) | ||||
| 	{ | ||||
| 		mio_freemem (mio, mio->option.log_target_b); | ||||
| 		mio->option.log_target_b = MIO_NULL; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| int mio_setoption (mio_t* mio, mio_option_t id, const void* value) | ||||
| @ -266,6 +282,50 @@ int mio_setoption (mio_t* mio, mio_option_t id, const void* value) | ||||
| 			mio->option.log_maxcapa = *(mio_oow_t*)value; | ||||
| 			return 0; | ||||
|  | ||||
| 		case MIO_LOG_TARGET_B: | ||||
| 		{ | ||||
| 			mio_bch_t* v1; | ||||
| 			mio_uch_t* v2; | ||||
|  | ||||
| 			v1 = mio_dupbcstr(mio, value, MIO_NULL); | ||||
| 			if (MIO_UNLIKELY(!v1)) return -1; | ||||
| 			 | ||||
| 			v2 = mio_dupbtoucstr(mio, value, MIO_NULL, 1); | ||||
| 			if (MIO_UNLIKELY(!v2)) | ||||
| 			{ | ||||
| 				mio_freemem (mio, v1); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			mio->option.log_target_u = v2; | ||||
| 			mio->option.log_target_b = v1; | ||||
|  | ||||
| 			mio_sys_resetlog (mio); | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		case MIO_LOG_TARGET_U: | ||||
| 		{ | ||||
| 			mio_uch_t* v1; | ||||
| 			mio_bch_t* v2; | ||||
|  | ||||
| 			v1 = mio_dupucstr(mio, value, MIO_NULL); | ||||
| 			if (MIO_UNLIKELY(!v1)) return -1; | ||||
|  | ||||
| 			v2 = mio_duputobcstr(mio, value, MIO_NULL); | ||||
| 			if (MIO_UNLIKELY(!v2)) | ||||
| 			{ | ||||
| 				mio_freemem (mio, v1); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			mio->option.log_target_u = v1; | ||||
| 			mio->option.log_target_b = v2; | ||||
|  | ||||
| 			mio_sys_resetlog (mio); | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		case MIO_LOG_WRITER: | ||||
| 			mio->option.log_writer = (mio_log_writer_t)value; | ||||
| 			return 0; | ||||
| @ -291,6 +351,14 @@ int mio_getoption (mio_t* mio, mio_option_t id, void* value) | ||||
| 			*(mio_oow_t*)value = mio->option.log_maxcapa; | ||||
| 			return 0; | ||||
|  | ||||
| 		case MIO_LOG_TARGET_B: | ||||
| 			*(mio_bch_t**)value = mio->option.log_target_b; | ||||
| 			return 0; | ||||
|  | ||||
| 		case MIO_LOG_TARGET_U: | ||||
| 			*(mio_uch_t**)value = mio->option.log_target_u; | ||||
| 			return 0; | ||||
|  | ||||
| 		case MIO_LOG_WRITER: | ||||
| 			*(mio_log_writer_t*)value = mio->option.log_writer; | ||||
| 			return 0; | ||||
|  | ||||
| @ -135,6 +135,16 @@ enum mio_option_t | ||||
| 	MIO_TRAIT, | ||||
| 	MIO_LOG_MASK, | ||||
| 	MIO_LOG_MAXCAPA, | ||||
|  | ||||
| 	/* log target for the builtin writer */ | ||||
| 	MIO_LOG_TARGET_B, | ||||
| 	MIO_LOG_TARGET_U, | ||||
| #if defined(MIO_OOCH_IS_UCH) | ||||
| #	define MIO_LOG_TARGET MIO_LOG_TARGET_U | ||||
| #else | ||||
| #	define MIO_LOG_TARGET MIO_LOG_TARGET_B | ||||
| #endif | ||||
|  | ||||
| 	MIO_LOG_WRITER | ||||
| }; | ||||
| typedef enum mio_option_t mio_option_t; | ||||
| @ -663,6 +673,8 @@ struct mio_t | ||||
| 		mio_bitmask_t trait; | ||||
| 		mio_bitmask_t log_mask; | ||||
| 		mio_oow_t log_maxcapa; | ||||
| 		mio_uch_t* log_target_u; | ||||
| 		mio_bch_t* log_target_b; | ||||
| 		mio_log_writer_t log_writer; | ||||
| 	} option; | ||||
|  | ||||
|  | ||||
| @ -493,7 +493,7 @@ static int dev_sck_kill (mio_dev_t* dev, int force) | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		MIO_ASSERT (mio, rdev->state == 0); | ||||
| 		MIO_ASSERT (mio, (rdev->state & MIO_DEV_SCK_ALL_PROGRESS_BITS) == 0); | ||||
| 		MIO_ASSERT (mio, rdev->tmrjob_index == MIO_TMRIDX_INVALID); | ||||
|  | ||||
| 		if (rdev->on_disconnect) rdev->on_disconnect (rdev); | ||||
|  | ||||
| @ -329,23 +329,8 @@ int mio_sys_initlog (mio_t* mio) | ||||
|  | ||||
| 	if (mio->_features & MIO_FEATURE_LOG_WRITER) | ||||
| 	{ | ||||
| /* TODO: different file? */ | ||||
| 	#define LOG_FILE "/dev/stderr" | ||||
| 		log->fd = open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND , 0644); | ||||
| 		if (log->fd == -1) | ||||
| 		{ | ||||
| 			/*mio_seterrbfmtwithsyserr (mio, 0, errno, "cannot open log file %hs", LOG_FILE);*/ | ||||
| 			log->fd = 2; | ||||
| 			log->fd_flag = 0; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			log->fd_flag |= LOGFD_OPENED_HERE; | ||||
| 		} | ||||
|  | ||||
| 	#if defined(HAVE_ISATTY) | ||||
| 		if (isatty(log->fd)) log->fd_flag |= LOGFD_TTY; | ||||
| 	#endif | ||||
| 		log->fd = 2; | ||||
| 		log->fd_flag = 0; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @ -373,6 +358,40 @@ void mio_sys_finilog (mio_t* mio) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void mio_sys_resetlog (mio_t* mio) | ||||
| { | ||||
| 	mio_sys_log_t* log = &mio->sysdep->log; | ||||
|  | ||||
| 	if (mio->_features & MIO_FEATURE_LOG_WRITER) | ||||
| 	{ | ||||
| 		int fd; | ||||
| 		int fd_flag = 0; | ||||
| 		int kill_fd = -1; | ||||
|  | ||||
| 		fd = open(mio->option.log_target_b, O_CREAT | O_WRONLY | O_APPEND , 0644); | ||||
| 		if (fd == -1) | ||||
| 		{ | ||||
| 			fd = 2; | ||||
| 			fd_flag = 0; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			fd_flag |= LOGFD_OPENED_HERE; | ||||
| 		#if defined(HAVE_ISATTY) | ||||
| 			if (isatty(fd)) fd_flag |= LOGFD_TTY; | ||||
| 		#endif | ||||
| 		} | ||||
|  | ||||
| 		if ((log->fd_flag & LOGFD_OPENED_HERE) && log->fd >= 0) kill_fd = log->fd; | ||||
|  | ||||
| 		/* swap - risk of race condition depite this late swap */ | ||||
| 		log->fd = fd; | ||||
| 		log->fd_flag = fd_flag; | ||||
|  | ||||
| 		if (kill_fd >= 0) close (kill_fd); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void mio_sys_locklog (mio_t* mio) | ||||
| { | ||||
| 	pthread_mutex_lock (&mio->sysdep->log.mtx); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user