cam_extend.c

来自「基于组件方式开发操作系统的OSKIT源代码」· C语言 代码 · 共 116 行

C
116
字号
/* * Written by Julian Elischer (julian@tfs.com) * for TRW Financial Systems for use under the MACH(2.5) operating system. * * TRW Financial Systems, in accordance with their agreement with Carnegie * Mellon University, makes this software available to CMU to distribute * or use in any manner that they see fit as long as this message is kept with * the software. For this reason TFS also grants any other persons or * organisations permission to use or modify this software. * * TFS supplies this software to be publicly redistributed * on the understanding that TFS is not responsible for the correct * functioning of this software in any circumstances. * *      $Id: cam_extend.c,v 1.1 1998/09/15 06:33:23 gibbs Exp $ *//* * XXX XXX XXX XXX  We should get DEVFS working so that we * don't have to do this, possibly sparse, array based junk. *//* * Extensible arrays: Use a realloc like implementation to permit * the arrays to be extend. */#include <sys/param.h>#include <sys/systm.h>#include <sys/kernel.h>#include <sys/malloc.h>#include <cam/cam_extend.h>struct extend_array{	int nelem;	void **ps;};static void *cam_extend_alloc(size_t s){	void *p = malloc(s, M_DEVBUF, M_NOWAIT);	if (!p)		panic("extend_alloc: malloc failed.");	return p;}static voidcam_extend_free(void *p){	free(p, M_DEVBUF);}/* EXTEND_CHUNK: Number of extend slots to allocate whenever we need a new * one. */#ifndef EXTEND_CHUNK	#define EXTEND_CHUNK 8#endifstruct extend_array *cam_extend_new(void){	struct extend_array *p = cam_extend_alloc(sizeof(*p));	if (p) {		p->nelem = 0;		p->ps = 0;	}	return p;}void *cam_extend_set(struct extend_array *ea, int index, void *value){	if (index >= ea->nelem) {		void **space;		space = cam_extend_alloc(sizeof(void *) * (index + EXTEND_CHUNK));		bzero(space, sizeof(void *) * (index + EXTEND_CHUNK));		/* Make sure we have something to copy before we copy it */		if (ea->nelem) {			bcopy(ea->ps, space, sizeof(void *) * ea->nelem);			cam_extend_free(ea->ps);		}		ea->ps = space;		ea->nelem = index + EXTEND_CHUNK;	}	if (ea->ps[index]) {		printf("extend_set: entry %d already has storage.\n", index);		return 0;	}	else		ea->ps[index] = value;	return value;}void *cam_extend_get(struct extend_array *ea,	       int index){	if (ea == NULL || index >= ea->nelem || index < 0)		return NULL;	return ea->ps[index];}voidcam_extend_release(struct extend_array *ea, int index){	void *p = cam_extend_get(ea, index);	if (p) {		ea->ps[index] = 0;	}}

⌨️ 快捷键说明

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