fixed bugs in mutex protection in sio.
added qse_open_stdsios_with_flags
This commit is contained in:
		| @ -115,14 +115,14 @@ int fmtout (const char_t* fmt, fmtout_t* data, va_list ap) | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		qse_mchar_t  sbuf[32];	 | ||||
| 		qse_mchar_t  sbuf[32]; | ||||
| 		qse_mchar_t* ptr; | ||||
| 		qse_size_t   capa; | ||||
| 	} fltfmt; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		char_t       sbuf[96];	 | ||||
| 		char_t       sbuf[96]; | ||||
| 		char_t*      ptr; | ||||
| 		qse_size_t   capa; | ||||
| 	} fltout; | ||||
| @ -513,7 +513,7 @@ reswitch: | ||||
| 			} | ||||
|  | ||||
| 			width -= n; | ||||
| 		 | ||||
|  | ||||
| 			if (!(flagc & FLAGC_LEFTADJ) && width > 0) | ||||
| 			{ | ||||
| 				while (width--) PUT_CHAR(padc); | ||||
|  | ||||
| @ -456,8 +456,6 @@ static qse_ssize_t putwc_no_mutex (qse_sio_t* sio, qse_wchar_t c) | ||||
| { | ||||
| 	qse_ssize_t n; | ||||
|  | ||||
| 	LOCK (sio); | ||||
|  | ||||
| 	sio->errnum = QSE_SIO_ENOERR; | ||||
| #if defined(__OS2__) | ||||
| 	if (c == QSE_WT('\n') && (sio->status & STATUS_LINE_BREAK)) | ||||
| @ -470,7 +468,6 @@ static qse_ssize_t putwc_no_mutex (qse_sio_t* sio, qse_wchar_t c) | ||||
| 	if (n <= -1 && sio->errnum == QSE_SIO_ENOERR)  | ||||
| 		sio->errnum = tio_errnum_to_sio_errnum (&sio->tio.io); | ||||
|  | ||||
| 	UNLOCK (sio); | ||||
| 	return n; | ||||
| } | ||||
|  | ||||
| @ -875,15 +872,20 @@ static qse_sio_t* sio_stdout = QSE_NULL; | ||||
| static qse_sio_t* sio_stderr = QSE_NULL; | ||||
| /* TODO: add sio_stdin, qse_getmbs, etc */ | ||||
|  | ||||
| int qse_open_stdsios (void) | ||||
| int qse_open_stdsios () | ||||
| { | ||||
| 	return qse_open_stdsios_with_flags (QSE_SIO_LINEBREAK | QSE_SIO_REENTRANT); | ||||
| } | ||||
|  | ||||
| int qse_open_stdsios_with_flags (int flags) | ||||
| { | ||||
| 	if (sio_stdout == QSE_NULL) | ||||
| 	{ | ||||
| 		sio_stdout = qse_sio_openstd (QSE_MMGR_GETDFL(), 0, QSE_SIO_STDOUT, QSE_SIO_LINEBREAK | QSE_SIO_REENTRANT); | ||||
| 		sio_stdout = qse_sio_openstd (QSE_MMGR_GETDFL(), 0, QSE_SIO_STDOUT, flags); | ||||
| 	} | ||||
| 	if (sio_stderr == QSE_NULL) | ||||
| 	{ | ||||
| 		sio_stderr = qse_sio_openstd (QSE_MMGR_GETDFL(), 0, QSE_SIO_STDERR, QSE_SIO_LINEBREAK | QSE_SIO_REENTRANT); | ||||
| 		sio_stderr = qse_sio_openstd (QSE_MMGR_GETDFL(), 0, QSE_SIO_STDERR, flags); | ||||
| 	} | ||||
|  | ||||
| 	if (sio_stdout == QSE_NULL || sio_stderr == QSE_NULL)  | ||||
| @ -1031,9 +1033,11 @@ qse_ssize_t qse_errputwcsf (const qse_wchar_t* fmt, ...) | ||||
| 	fo.conv = mbs_to_wcs; | ||||
|  | ||||
| 	va_start (ap, fmt); | ||||
|  | ||||
| 	LOCK (sio_stderr); | ||||
| 	x = qse_wfmtout(fmt, &fo, ap); | ||||
| 	UNLOCK (sio_stderr); | ||||
|  | ||||
| 	va_end (ap); | ||||
|  | ||||
| 	return (x <= -1)? -1: fo.count; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user