⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioproc.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <thread.h>#include "threadimpl.h"enum{	STACK = 8192,};voidiointerrupt(Ioproc *io){	if(!io->inuse)		return;	threadint(io->tid);}static voidxioproc(void *a){	Ioproc *io, *x;	io = a;	/*	 * first recvp acquires the ioproc.	 * second tells us that the data is ready.	 */	for(;;){		while(recv(io->c, &x) == -1)			;		if(x == 0)	/* our cue to leave */			break;		assert(x == io);		/* caller is now committed -- even if interrupted he'll return */		while(recv(io->creply, &x) == -1)			;		if(x == 0)	/* caller backed out */			continue;		assert(x == io);		io->ret = io->op(&io->arg);		if(io->ret < 0)			rerrstr(io->err, sizeof io->err);		while(send(io->creply, &io) == -1)			;		while(recv(io->creply, &x) == -1)			;	}}Ioproc*ioproc(void){	Ioproc *io;	io = mallocz(sizeof(*io), 1);	if(io == nil)		sysfatal("ioproc malloc: %r");	io->c = chancreate(sizeof(void*), 0);	io->creply = chancreate(sizeof(void*), 0);	io->tid = proccreate(xioproc, io, STACK);	return io;}voidcloseioproc(Ioproc *io){	if(io == nil)		return;	iointerrupt(io);	while(send(io->c, 0) == -1)		;	chanfree(io->c);	chanfree(io->creply);	free(io);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -