Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <thread.h>
4
#include "threadimpl.h"
5
 
6
long
7
iocall(Ioproc *io, long (*op)(va_list*), ...)
8
{
9
	int ret, inted;
10
	Ioproc *msg;
11
 
12
	if(send(io->c, &io) == -1){
13
		werrstr("interrupted");
14
		return -1;
15
	}
16
	assert(!io->inuse);
17
	io->inuse = 1;
18
	io->op = op;
19
	va_start(io->arg, op);
20
	msg = io;
21
	inted = 0;
22
	while(send(io->creply, &msg) == -1){
23
		msg = nil;
24
		inted = 1;
25
	}
26
	if(inted){
27
		werrstr("interrupted");
28
		return -1;
29
	}
30
 
31
	/*
32
	 * If we get interrupted, we have to stick around so that
33
	 * the IO proc has someone to talk to.  Send it an interrupt
34
	 * and try again.
35
	 */
36
	inted = 0;
37
	while(recv(io->creply, nil) == -1){
38
		inted = 1;
39
		iointerrupt(io);
40
	}
41
	USED(inted);
42
	va_end(io->arg);
43
	ret = io->ret;
44
	if(ret < 0)
45
		errstr(io->err, sizeof io->err);
46
	io->inuse = 0;
47
 
48
	/* release resources */
49
	while(send(io->creply, &io) == -1)
50
		;
51
	return ret;
52
}