Unified · Split
| @@ -3,6 +3,7 @@ · 2 unmodified lines | ||
| 3 | 3 | set but not used changes from Acme-sac |
| 4 | 4 | mdb(1) changes from Acme-sac |
| 5 | 5 | ftpfs uses new dial(2) |
| 6 | + add qbypass to emu/port/qio.c | |
| 6 | 7 | 20080115 |
| 7 | 8 | add blowfish to keyring (not yet documented) |
| 8 | 9 | add explicit public and private key types to keyring (in development: not yet documented) |
| @@ -22,6 +22,7 @@ char* clipread(void); · 21 unmodified lines | ||
| 22 | 22 | int clipwrite(char*); |
| 23 | 23 | void copen(Chan*); |
| 24 | 24 | void cmderror(Cmdbuf*, char*); |
| 25 | +Block* concatblock(Block*); | |
| 25 | 26 | int cread(Chan*, uchar*, int, vlong); |
| 26 | 27 | void cwrite(Chan*, uchar*, int, vlong); |
| 27 | 28 | Chan* cunique(Chan*); |
| @@ -145,6 +146,7 @@ Block* pullupqueue(Queue*, int); · 117 unmodified lines | ||
| 145 | 146 | void qaddlist(Queue*, Block*); |
| 146 | 147 | Block* qbread(Queue*, int); |
| 147 | 148 | long qbwrite(Queue*, Block*); |
| 149 | +Queue* qbypass(void (*)(void*, Block*), void*); | |
| 148 | 150 | int qcanread(Queue*); |
| 149 | 151 | void qclose(Queue*); |
| 150 | 152 | int qisclosed(Queue*); |
| @@ -185,6 +187,7 @@ void setpointer(int, int); · 34 unmodified lines | ||
| 185 | 187 | char* skipslash(char*); |
| 186 | 188 | void srvrtinit(void); |
| 187 | 189 | void swiproc(Proc*, int); |
| 190 | +Block* trimblock(Block*, int, int); | |
| 188 | 191 | long unionread(Chan*, void*, long); |
| 189 | 192 | void unlock(Lock*); |
| 190 | 193 | Uqid* uqidalloc(Uqidtab*, Chan*); |
| @@ -24,6 +24,7 @@ struct Queue · 23 unmodified lines | ||
| 24 | 24 | int eof; /* number of eofs read by user */ |
| 25 | 25 | |
| 26 | 26 | void (*kick)(void*); /* restart output */ |
| 27 | + void (*bypass)(void*, Block*); /* bypass queue altogether */ | |
| 27 | 28 | void* arg; /* argument to kick */ |
| 28 | 29 | |
| 29 | 30 | QLock rlock; /* mutex for reading processes */ |
| @@ -846,6 +847,24 @@ qopen(int limit, int msg, void (*kick)(void*), void *arg) · 816 unmodified lines | ||
| 846 | 847 | return q; |
| 847 | 848 | } |
| 848 | 849 | |
| 850 | +/* open a queue to be bypassed */ | |
| 851 | +Queue* | |
| 852 | +qbypass(void (*bypass)(void*, Block*), void *arg) | |
| 853 | +{ | |
| 854 | + Queue *q; | |
| 855 | + | |
| 856 | + q = malloc(sizeof(Queue)); | |
| 857 | + if(q == 0) | |
| 858 | + return 0; | |
| 859 | + | |
| 860 | + q->limit = 0; | |
| 861 | + q->arg = arg; | |
| 862 | + q->bypass = bypass; | |
| 863 | + q->state = 0; | |
| 864 | + | |
| 865 | + return q; | |
| 866 | +} | |
| 867 | + | |
| 849 | 868 | static int |
| 850 | 869 | notempty(void *a) |
| 851 | 870 | { |
| @@ -1179,6 +1198,10 @@ qbwrite(Queue *q, Block *b) · 327 unmodified lines | ||
| 1179 | 1198 | |
| 1180 | 1199 | dowakeup = 0; |
| 1181 | 1200 | n = BLEN(b); |
| 1201 | + if(q->bypass){ | |
| 1202 | + (*q->bypass)(q->arg, b); | |
| 1203 | + return n; | |
| 1204 | + } | |
| 1182 | 1205 | cb.b = b; |
| 1183 | 1206 | |
| 1184 | 1207 | qlock(&q->wlock); |