MFC: syscons.c rev. 1.453 and syscons.h rev. 1.88

Serialize output routine of terminal emulator (te_puts()) by a lock.
This commit is contained in:
simokawa 2007-10-25 06:09:15 +00:00
parent a3a277382f
commit 65f894c866
2 changed files with 17 additions and 1 deletions

View File

@ -2513,14 +2513,23 @@ exchange_scr(sc_softc_t *sc)
void
sc_puts(scr_stat *scp, u_char *buf, int len)
{
int need_unlock = 0;
#ifdef DEV_SPLASH
/* make screensaver happy */
if (!sticky_splash && scp == scp->sc->cur_scp && !sc_saver_keyb_only)
run_scrn_saver = FALSE;
#endif
if (scp->tsw)
if (scp->tsw) {
if (!kdb_active && !mtx_owned(&scp->scr_lock)) {
need_unlock = 1;
mtx_lock_spin(&scp->scr_lock);
}
(*scp->tsw->te_puts)(scp, buf, len);
if (need_unlock)
mtx_unlock_spin(&scp->scr_lock);
}
if (scp->sc->delayed_next_scr)
sc_switch_scr(scp->sc, scp->sc->delayed_next_scr - 1);
@ -2895,6 +2904,7 @@ scterm(int unit, int flags)
(*scp->tsw->te_term)(scp, &scp->ts);
if (scp->ts != NULL)
free(scp->ts, M_DEVBUF);
mtx_destroy(&scp->scr_lock);
/* clear the structure */
if (!(flags & SC_KERNEL_CONSOLE)) {
@ -3078,6 +3088,8 @@ init_scp(sc_softc_t *sc, int vty, scr_stat *scp)
scp->history = NULL;
scp->history_pos = 0;
scp->history_size = 0;
mtx_init(&scp->scr_lock, "scrlock", NULL, MTX_SPIN);
}
int

View File

@ -34,6 +34,9 @@
#ifndef _DEV_SYSCONS_SYSCONS_H_
#define _DEV_SYSCONS_SYSCONS_H_
#include <sys/lock.h>
#include <sys/mutex.h>
/* machine-dependent part of the header */
#ifdef PC98
@ -332,6 +335,7 @@ typedef struct scr_stat {
int splash_save_mode; /* saved mode for splash screen */
int splash_save_status; /* saved status for splash screen */
struct mtx scr_lock; /* mutex for sc_puts() */
#ifdef _SCR_MD_STAT_DECLARED_
scr_md_stat_t md; /* machine dependent vars */
#endif