vmmopen.c revision 7c2fbfb345896881c631598ee3852ce9ce33fb07
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Copyright (c) 1985-2008 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Create a region to allocate based on mmap()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo (kpv@research.att.com)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MM_MAGIC (('V'<<24) | ('M'<<16) | ('A'<<8) | ('P'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _user_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _mmvm_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _mmvmdisc_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int mmvminit(char* file, Void_t* addr, size_t round, Mmvm_t* mm)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(size == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* read the header */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin base = (Void_t*)mmap(mm->base, mm->size, PROT_READ|PROT_WRITE,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if((fd = open(file, O_RDWR|O_CREAT, CREAT_MODE)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(lseek(fd, size-1, 0) != (size-1) || write(fd, "", 1) != 1 )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin base = (Void_t*)mmap(addr, (size_t)size, PROT_READ|PROT_WRITE,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* write magic number */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(fd >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* mmvmmemory(vm, caddr, csize, nsize, disc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MMADDR(b) ((Void_t*)(((Vmuchar_t*)b) + MM_START) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* base and size of new map */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((nsize % disc->round) < (disc->round/2) ? disc->round/2 : 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make room for new space */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(lseek(mmdc->fd, (off_t)(csize-1), 0) != (off_t)(csize-1) ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* remap the space */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin caddr = (Void_t*)mmap(caddr, csize, PROT_READ|PROT_WRITE,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else /* bad problem */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (Void_t*)(((Vmuchar_t*)mmdc->mm->base) + MM_START);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int mmvmexcept(Vmalloc_t* vm, int type, Void_t* data, Vmdisc_t* disc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vmmopen(char* file, Void_t* base, size_t round)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set the amount to round up to on each memory request */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(mmdc = (Mmvmdisc_t*)vmalloc(Vmheap, sizeof(Mmvmdisc_t))) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { mmvmexcept(NIL(Vmalloc_t*), VM_CLOSE, NIL(Void_t*), &mmdc->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVoid_t* vmmset(Vmalloc_t* vm, int key, Void_t* data, int set)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(u)