plan9-io.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 143 行

C
143
字号
#include <u.h>#include <libc.h>#include <venti.h>enum {	IdealAlignment = 32,	ChunkSize 	= 128*1024,};voidvtMemFree(void *p){	if(p == 0)		return;	free(p);}void *vtMemAlloc(int size){	void *p;	p = malloc(size);	if(p == 0)		vtFatal("vtMemAlloc: out of memory");	return p;}void *vtMemAllocZ(int size){	void *p = vtMemAlloc(size);	memset(p, 0, size);	return p;}void *vtMemRealloc(void *p, int size){	if(p == nil)		return vtMemAlloc(size);	p = realloc(p, size);	if(p == 0)		vtFatal("vtRealloc: out of memory");	return p;}void *vtMemBrk(int n){	static Lock lk;	static uchar *buf;	static int nbuf;	static int nchunk;	int align, pad;	void *p;	if(n >= IdealAlignment)		align = IdealAlignment;	else if(n > 8)		align = 8;	else			align = 4;	lock(&lk);	pad = (align - (uintptr)buf) & (align-1);	if(n + pad > nbuf) {		buf = vtMemAllocZ(ChunkSize);		nbuf = ChunkSize;		pad = (align - (uintptr)buf) & (align-1);		nchunk++;	}	assert(n + pad <= nbuf);			p = buf + pad;	buf += pad + n;	nbuf -= pad + n;	unlock(&lk);	return p;}voidvtThreadSetName(char *name){	int fd;	char buf[32];	sprint(buf, "/proc/%d/args", getpid());	if((fd = open(buf, OWRITE)) >= 0){		write(fd, name, strlen(name));		close(fd);	}}intvtFdRead(int fd, uchar *buf, int n){	n = read(fd, buf, n);	if(n < 0) {		vtOSError();		return -1;	}	if(n == 0) {		vtSetError("unexpected EOF");		return 0;	}	return n;}intvtFdWrite(int fd, uchar *buf, int n){	int nn;		nn = write(fd, buf, n);	if(nn < 0) {		vtOSError();		return 0;	}	if(n != nn) {		vtSetError("truncated write");		return 0;	}	return 1;}voidvtFdClose(int fd){	close(fd);}char *vtOSError(void){	return vtSetError("%r");}

⌨️ 快捷键说明

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