222 lines
4.3 KiB
C
222 lines
4.3 KiB
C
/* threads.c for Eterm
|
|
* Feb 25 1998, vendu
|
|
*/
|
|
|
|
static const char cvs_ident[] = "$Id$";
|
|
|
|
#include "config.h"
|
|
#include "feature.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#ifdef USE_POSIX_THREADS
|
|
# include "main.h"
|
|
# include "debug.h"
|
|
# include "screen.h"
|
|
|
|
# ifdef PIXMAP_SUPPORT
|
|
# include "pixmap.h"
|
|
# endif
|
|
|
|
/* extern char *sig_to_str(int sig); */
|
|
|
|
# ifdef USE_IMLIB
|
|
extern imlib_t imlib_bg;
|
|
|
|
# endif
|
|
|
|
# include "threads.h"
|
|
|
|
extern int refresh_count, refresh_limit;
|
|
extern unsigned char *cmdbuf_base, *cmdbuf_ptr, *cmdbuf_endp;
|
|
extern unsigned char cmd_getc(void);
|
|
|
|
# ifdef MUTEX_SYNCH
|
|
/* pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; */
|
|
# endif
|
|
|
|
short bg_set = 0;
|
|
pthread_t resize_sub_thr;
|
|
pthread_attr_t resize_sub_thr_attr;
|
|
|
|
# ifdef MUTEX_SYNCH
|
|
void
|
|
prepare(void *dummy)
|
|
{
|
|
D_THREADS(("prepare(): pthread_mutex_trylock(&mutex)\n"));
|
|
pthread_mutex_trylock(&mutex);
|
|
}
|
|
|
|
void
|
|
parent(void *dummy)
|
|
{
|
|
D_THREADS(("parent(): pthread_mutex_unlock(&mutex)\n"));
|
|
pthread_mutex_unlock(&mutex);
|
|
}
|
|
|
|
void
|
|
child(void *dummy)
|
|
{
|
|
D_THREADS(("child(): pthread_mutex_unlock(&mutex)\n"));
|
|
pthread_mutex_unlock(&mutex);
|
|
}
|
|
|
|
# endif
|
|
|
|
inline void
|
|
refresh_termwin(void)
|
|
{
|
|
scrollbar_show(0);
|
|
scr_touch();
|
|
}
|
|
|
|
void
|
|
render_bg_thread(void *dummy)
|
|
{
|
|
void *retval = NULL;
|
|
|
|
D_THREADS(("render_bg_thread() entered\n"));
|
|
|
|
if (bg_set) {
|
|
# ifdef AGGRESSIVE_THREADS
|
|
;
|
|
# else
|
|
D_THREADS(("Background already set\n"));
|
|
# endif
|
|
}
|
|
# ifdef MUTEX_SYNCH
|
|
if (pthread_mutex_trylock(&mutex) != EBUSY) {
|
|
D_THREADS(("pthread_mutex_trylock(&mutex): "));
|
|
} else {
|
|
D_THREADS(("mutex already locked\n"));
|
|
}
|
|
# endif
|
|
|
|
D_THREADS(("pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);\n"));
|
|
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
|
|
|
|
D_THREADS(("pthread_detach();\n"));
|
|
pthread_detach(resize_sub_thr);
|
|
|
|
D_THREADS(("render_bg_thread(): render_pixmap()\n"));
|
|
render_pixmap(TermWin.vt, imlib_bg, bgPixmap, 0, 1);
|
|
|
|
D_THREADS(("refresh_termwin()\n"));
|
|
refresh_termwin();
|
|
|
|
bg_set = 1;
|
|
|
|
# ifdef MUTEX_SYNCH
|
|
D_THREADS(("pthread_mutex_unlock(&mutex);\n"));
|
|
pthread_mutex_unlock(&mutex);
|
|
# endif
|
|
|
|
D_THREADS(("pthread_exit()\n"));
|
|
pthread_exit(retval);
|
|
}
|
|
|
|
/* Read and process output from the application - threaded version. */
|
|
void
|
|
main_thread(void *ignored)
|
|
{
|
|
register int ch;
|
|
|
|
D_THREADS(("[%d] main_thread() entered\n", getpid()));
|
|
D_CMD(("bg_set = %d\n", bg_set));
|
|
|
|
do {
|
|
while ((ch = cmd_getc()) == 0); /* wait for something */
|
|
|
|
if (ch >= ' ' || ch == '\t' || ch == '\n' || ch == '\r') {
|
|
/* Read a text string from the input buffer */
|
|
int nlines = 0;
|
|
|
|
/* unsigned char * str; */
|
|
register unsigned char *str;
|
|
|
|
/*
|
|
* point to the start of the string,
|
|
* decrement first since already did get_com_char ()
|
|
*/
|
|
str = --cmdbuf_ptr;
|
|
while (cmdbuf_ptr < cmdbuf_endp) {
|
|
ch = *cmdbuf_ptr++;
|
|
if (ch >= ' ' || ch == '\t' || ch == '\r') {
|
|
/* nothing */
|
|
} else if (ch == '\n') {
|
|
nlines++;
|
|
if (++refresh_count >= (refresh_limit * (TermWin.nrow - 1)))
|
|
break;
|
|
} else { /* unprintable */
|
|
cmdbuf_ptr--;
|
|
break;
|
|
}
|
|
}
|
|
|
|
scr_add_lines(str, nlines, (cmdbuf_ptr - str));
|
|
} else {
|
|
switch (ch) {
|
|
# ifdef NO_VT100_ANS
|
|
case 005:
|
|
break;
|
|
# else
|
|
case 005:
|
|
tt_printf(VT100_ANS);
|
|
break; /* terminal Status */
|
|
# endif
|
|
case 007:
|
|
scr_bell();
|
|
break; /* bell */
|
|
case '\b':
|
|
scr_backspace();
|
|
break; /* backspace */
|
|
case 013:
|
|
case 014:
|
|
scr_index(UP);
|
|
break; /* vertical tab, form feed */
|
|
case 016:
|
|
scr_charset_choose(1);
|
|
break; /* shift out - acs */
|
|
case 017:
|
|
scr_charset_choose(0);
|
|
break; /* shift in - acs */
|
|
case 033:
|
|
process_escape_seq();
|
|
break;
|
|
}
|
|
}
|
|
} while (ch != EOF);
|
|
}
|
|
|
|
inline void
|
|
check_bg_pixmap(void)
|
|
{
|
|
if (bg_set) {
|
|
# ifdef MUTEX_SYNCH
|
|
if (pthread_mutex_trylock(&mutex) == EBUSY) {
|
|
D_THREADS(("cmd_getc(): mutex locked, bbl\n"));
|
|
} else
|
|
# endif
|
|
{
|
|
# ifdef MUTEX_SYNCH
|
|
D_THREADS(("cmd_getc(): pthread_mutex_trylock(&mutex): "));
|
|
# endif
|
|
|
|
D_THREADS(("refresh_termwin() "));
|
|
refresh_termwin();
|
|
|
|
# ifdef MUTEX_SYNCH
|
|
D_THREADS(("pthread_mutex_unlock(&mutex);\n"));
|
|
pthread_mutex_unlock(&mutex);
|
|
# endif
|
|
/* bg_set = 0; */
|
|
}
|
|
|
|
bg_set = 0;
|
|
|
|
/* main_thread(NULL); */
|
|
}
|
|
}
|
|
|
|
#endif /* USE_POSIX_THREADS */
|