#include "dat.h" #include "fn.h" Channel *drawc; Channel *keyc; Channel *dictreqc; Channel *dictresc; void usage(void) { fprint(2, "usage: strans mapdir\n"); threadexitsall("usage"); } void die(char *fmt, ...) { va_list ap; fprint(2, "strans: "); va_start(ap, fmt); vfprint(2, fmt, ap); va_end(ap); fprint(2, "\n"); threadexitsall("die"); } void* emalloc(ulong n) { void *p; p = mallocz(n, 1); if(p == nil) die("out of memory"); return p; } void* erealloc(void *p, ulong n) { p = realloc(p, n); if(p == nil) die("out of memory"); return p; } void threadmain(int argc, char **argv) { char *display; if(argc != 2) usage(); drawc = chancreate(sizeof(Drawcmd), 4); keyc = chancreate(sizeof(Keyreq), 0); dictreqc = chancreate(sizeof(Dictreq), 4); dictresc = chancreate(sizeof(Dictres), 0); mapinit(argv[1]); dictinit(argv[1]); srvinit(); if(proccreate(drawthread, nil, 16384) < 0) die("can't create draw worker"); if(proccreate(srvthread, nil, 16384) < 0) die("can't create server worker"); if(proccreate(ibusthread, nil, 32768) < 0) die("can't create IBus worker"); display = getenv("DISPLAY"); if(display != nil && display[0] != '\0' && proccreate(ximthread, nil, 32768) < 0) die("xim: cannot create worker"); if(threadcreate(dictthread, nil, 16384) < 0) die("can't create dictionary worker"); imthread(nil); }