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

📄 touchall.c

📁 rtai-3.1-test3的源代码(Real-Time Application Interface )
💻 C
字号:
/* * Copyright (C) Tomasz Motylewski <motyl@stan.chemie.unibas.ch> * Copyright (C) Pierre Cloutier   <pcloutier@poseidoncontrols.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the version 2 of the GNU Lesser * General Public License as published by the Free Software * Foundation. * * This library is distributed in the hope that it 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. */#include <stdio.h>#include <stdlib.h>#include <asm/page.h>#include <sys/user.h>#include <sys/mman.h>#include <malloc.h>#define TOUCH_BUFSIZE 256#define GROW_STACK (64*1024)#define GROW_HEAP  (64*1024)#define STR_SIZE 16void touch_area(void *begin, size_t len, int writeable) {	volatile char *ptr = begin;	int i;	volatile int tmp;		for(i=0;i<len;i+=PAGE_SIZE) {		tmp=ptr[i];	/*	printf("R:%p",ptr+i); */		if(writeable) {			ptr[i]=tmp;	/*		printf("W:%p",ptr+i); */		}	}}int touch_all(void) {	FILE *maps;	unsigned int start,end,flags,size;	char perms[STR_SIZE],dev[STR_SIZE];	char buf[TOUCH_BUFSIZE];		maps=fopen("/proc/self/maps","r");	if(!maps) {		perror("touch_all");		return -1;	}	while(fgets(buf,TOUCH_BUFSIZE-1,maps)) {		if(sscanf(buf,"%8x-%8x %15s %x %15s %d",&start,&end,perms,&flags,dev,&size)<2)			continue;		if(perms[1] == 'w')			touch_area((void*)start,end-start,1);		else			touch_area((void*)start,end-start,0);	}	fclose(maps);	return 0;}int lock_all(int stk, int heap) {	extern void dump_malloc_stats(void);	int err, n, i;	unsigned *pt;	char stack[stk ? stk : GROW_STACK];	stack[0] = ' ';/*    glibc (2.1.3) limits and default values:	dynamically tunable      *	mmap threshold      128k *    mmap threshold max  512k  	mmap max           1024k *	trim threshold      128k *	top pad               0k *		heap min             32k	heap max           1024k*/    n = heap / 65536 + 1;	if ( n > (sizeof(stack) / sizeof(int))) {		printf("heap too large\n");		exit(-1);	}	    err = mallopt(M_MMAP_THRESHOLD, 512*1024);	if (!err) {		printf("mallopt(M_MMAP_THRESHOLD, heap) failed\n");		exit(-1);	}	 	err = mallopt(M_TOP_PAD,        heap ? heap : GROW_HEAP);    if (!err) {		printf("mallopt(M_TOP_PAD, heap) failed\n");		exit(-1);    }	if(mlockall(MCL_CURRENT|MCL_FUTURE)) {		perror("mlockall");		exit(-1);	}	touch_all();    pt = (unsigned *) stack;	for(i=0; i<n ; i++, pt++) *pt = (unsigned) malloc(65536);    pt = (unsigned *) stack;	for(i=0; i<n ; i++, pt++) free((void *) *pt);	return 0;}void dump_malloc_stats(void){	struct mallinfo mi;	extern int rtai_print_to_screen(const char *fmt, ...);//	memset(&mi, 0, sizeof(mi));		mi = mallinfo();	rtai_print_to_screen("\ntotal space allocated from system %d\n", mi.arena);	rtai_print_to_screen("number of non-inuse chunks        %d\n", mi.ordblks);	rtai_print_to_screen("number of mmapped regions         %d\n", mi.hblks);	rtai_print_to_screen("total space in mmapped regions    %d\n", mi.hblkhd);	rtai_print_to_screen("total allocated space             %d\n", mi.uordblks);	rtai_print_to_screen("total non-inuse space             %d\n", mi.fordblks);	rtai_print_to_screen("top-most, releasable space        %d\n", mi.keepcost);}/*int main(int argc, char *argv[]) {	sleep(5);	lock_all(0,0);	dump_malloc_stats();	sleep(5);	return 0;}*/

⌨️ 快捷键说明

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