#include "dat.h" #include "fn.h" Channel *drawc; Channel *keyc; Channel *dictreqc; Channel *dictresc; char **fontfiles; int nfontfiles; void usage(void) { fprint(2, "usage: strans mapdir fontfile [fontfile ...]\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) { if(argc < 3 || argc > Maxfonts + 2) usage(); fontfiles = argv + 2; nfontfiles = argc - 2; 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]); 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"); if(threadcreate(dictthread, nil, 16384) < 0) die("can't create dictionary worker"); imthread(nil); }