/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these libraries and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* $XConsortium: vmclear.c /main/2 1996/05/08 20:01:27 drk $ */ /*************************************************************** * * * AT&T - PROPRIETARY * * * * THIS IS PROPRIETARY SOURCE CODE LICENSED BY * * AT&T CORP. * * * * Copyright (c) 1995 AT&T Corp. * * All Rights Reserved * * * * This software is licensed by AT&T Corp. * * under the terms and conditions of the license in * * http://www.research.att.com/orgs/ssr/book/reuse * * * * This software was created by the * * Software Engineering Research Department * * AT&T Bell Laboratories * * * * For further information contact * * gsf@research.att.com * * * ***************************************************************/ #include "vmhdr.h" /* Clear out all allocated space. ** ** Written by (Kiem-)Phong Vo, kpv@research.att.com, 01/16/94. */ #if __STD_C int vmclear(Vmalloc_t* vm) #else vmclear(vm) Vmalloc_t* vm; #endif { reg Seg_t* seg; reg Seg_t* next; reg Block_t* tp; reg size_t size, s; reg Vmdata_t* vd = vm->data; if(!(vd->mode&VM_TRUST) ) { if(ISLOCK(vd,0)) return -1; SETLOCK(vd,0); } vd->free = vd->wild = NIL(Block_t*); vd->pool = 0; if(vd->mode&(VM_MTBEST|VM_MTDEBUG|VM_MTPROFILE) ) { vd->root = NIL(Block_t*); for(s = 0; s < S_TINY; ++s) TINY(vd)[s] = NIL(Block_t*); for(s = 0; s <= S_CACHE; ++s) CACHE(vd)[s] = NIL(Block_t*); } for(seg = vd->seg; seg; seg = next) { next = seg->next; tp = SEGBLOCK(seg); size = seg->baddr - ((uchar*)tp) - 2*sizeof(Head_t); SEG(tp) = seg; SIZE(tp) = size; if((vd->mode&(VM_MTLAST|VM_MTPOOL)) ) seg->free = tp; else { SIZE(tp) |= BUSY|JUNK; LINK(tp) = CACHE(vd)[C_INDEX(SIZE(tp))]; CACHE(vd)[C_INDEX(SIZE(tp))] = tp; } tp = BLOCK(seg->baddr); SEG(tp) = seg; SIZE(tp) = BUSY; } CLRLOCK(vd,0); return 0; }