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

📄 alog.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
#include <stdio.h>#include <strings.h>#include <string.h>#include <time.h>#include <sys/types.h>#include <sys/stat.h>#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#if defined(NEEDS_STDLIB_PROTOTYPES)/* This is included in the MPI include files ONLY */#include "../../../../include/protofix.h"#endif#include "alog.h"int xx_alog_status = 0x3;	/* Logging turned ON (default) */int xx_alog_setup_called = 0;	/* setup  not yet called */int xx_alog_output_called = 0;	/* output not yet called */char xx_alog_outdir[MAX_DIRNAME_LEN+1] = "";struct head_trace_buf *xx_buf_head = NULL;VOID xx_write(head,pid,event,data1,data2)struct head_trace_buf *head;int pid,event,data1;char *data2;{	int xx_i, found;	struct trace_buf *buf;	if (xx_alog_status >> 1) {		fprintf(stderr, "ALOG: Error: event %d logging requested by PID %d before doing ALOG setup\n", event, pid);		return;	}	if (head == NULL) return;	if (head->next_entry == head->max_size +99)		return;	found = 0;	while(!found) {	    if (head->next_entry >= head->max_size) {		xx_i = 1;		head->next_entry = 0;		if (head->cbuf->next_buf == NULL)			xx_i = xx_getbuf(head);		else 			head->cbuf = head->cbuf->next_buf;		if ((!xx_i) && (head->trace_flag == ALOG_WRAP))			head->cbuf = head->xx_list;		else if (!xx_i) {			head->next_entry = (head->max_size + 99);			return;		}	    } /* endif */	    buf = head->cbuf;	    xx_i = head->next_entry;	    head->next_entry++;	    if (buf->ALOG_table[xx_i].event > (-1))		found = 1;	} /* end while */	buf->ALOG_table[xx_i].id 	= pid;	buf->ALOG_table[xx_i].task_id 	= 0;	buf->ALOG_table[xx_i].event 	= event;	buf->ALOG_table[xx_i].data_int	= data1;	if (event == (-11)){		buf->ALOG_table[xx_i].tstamp = atol(data2);		buf->ALOG_table[xx_i].tind = 0;		strcpy(buf->ALOG_table[xx_i].data_string," ");		head->prev_time = 0;	} else if ((event < 0) && (event > (-11))) {		buf->ALOG_table[xx_i].tstamp = 0; 		buf->ALOG_table[xx_i].tind = 0;		head->prev_time = 0;		strncpy(buf->ALOG_table[xx_i].data_string,data2,MAX_LOG_STRING_LEN);		buf->ALOG_table[xx_i].data_string[MAX_LOG_STRING_LEN] = '\0';	} else {		buf->ALOG_table[xx_i].tstamp = (unsigned long) usc_clock(); 		if (buf->ALOG_table[xx_i].tstamp < head->prev_time)			head->ind_time++;		buf->ALOG_table[xx_i].tind = head->ind_time;		head->prev_time = buf->ALOG_table[xx_i].tstamp;		strncpy(buf->ALOG_table[xx_i].data_string,data2,MAX_LOG_STRING_LEN);		buf->ALOG_table[xx_i].data_string[MAX_LOG_STRING_LEN] = '\0';	}}VOID xx_dump(head)struct head_trace_buf *head;{	struct trace_buf *temp;	FILE *fp;	int cycle;	register int xx_i;	if (head == NULL) return;	if (head->file_t == NULL) {		fprintf(stderr,"ALOG: *** Trace file not written ***\n");		return;	}	fp = head->file_t;	temp = head->xx_list;	for(xx_i = 0; xx_i< head->max_size; xx_i++)		if ((temp->ALOG_table[xx_i].event < 0) && (temp->ALOG_table[xx_i].event >= (-11)))			fprintf(fp,"%d %d %d %d %lu %lu %s\n",				temp->ALOG_table[xx_i].event,				temp->ALOG_table[xx_i].id,				temp->ALOG_table[xx_i].task_id,				temp->ALOG_table[xx_i].data_int,				temp->ALOG_table[xx_i].tind,				temp->ALOG_table[xx_i].tstamp,				temp->ALOG_table[xx_i].data_string);	if (head->trace_flag == ALOG_WRAP) {		temp = head->cbuf;		if (temp != NULL)			xx_dump_aux(temp,fp,head->next_entry,head->max_size);		cycle = 0;		while((temp != NULL) && (!cycle)) {			temp = temp->next_buf;			if (temp == NULL)				temp = head->xx_list;			if (temp == head->cbuf)				cycle = 1;			else				xx_dump_aux(temp,fp,0,head->max_size);		};		if (temp != NULL)			xx_dump_aux(temp,fp,0,head->next_entry);	} else {		temp = head->xx_list;		while(temp != NULL) {			xx_dump_aux(temp,fp,0,head->max_size);			temp = temp->next_buf;		};	};	fclose(head->file_t);}VOID xx_dump_aux(buf,fp,xx_j,xx_k)struct trace_buf *buf;FILE *fp;int xx_j, xx_k;{	register int xx_i;	for(xx_i = xx_j; xx_i < xx_k; xx_i++)		if ((buf->ALOG_table[xx_i].id != (-1)) && 		    ((buf->ALOG_table[xx_i].event >= 0) || (buf->ALOG_table[xx_i].event < (-11)))) 			fprintf(fp,"%d %d %d %d %lu %lu %s\n",				buf->ALOG_table[xx_i].event,				buf->ALOG_table[xx_i].id,				buf->ALOG_table[xx_i].task_id,				buf->ALOG_table[xx_i].data_int,				buf->ALOG_table[xx_i].tind,				buf->ALOG_table[xx_i].tstamp,				buf->ALOG_table[xx_i].data_string);}int xx_getbuf(head)struct head_trace_buf *head;{	register int i;	struct trace_buf *temp;	if (head == NULL) return(0);	temp = (struct trace_buf *) malloc(sizeof(struct trace_buf));	if (temp == NULL)	{		fprintf(stderr,"alog out of memory\n");		return(0);	}	else {			head->cbuf = temp;		for(i=0;i<MAX_BUF_SIZE;i++)			temp->ALOG_table[i].id = (-1);		temp->next_buf = NULL;		if (head->xx_list == NULL)			head->xx_list = temp;		else {			temp = head->xx_list;			while(temp->next_buf != NULL)				temp = temp->next_buf;			temp->next_buf = head->cbuf;		};		return(1);	};}VOID xx_user(head,id)struct head_trace_buf *head;int id;{	char c[MAX_LOG_STRING_LEN], cd[100];	if (head == NULL) return;	if (!strcmp(xx_alog_outdir, ""))		getcwd(cd,100);	else		strcpy(cd, xx_alog_outdir);	if (cd[strlen(cd)-1] != '/')		strcat(cd, "/");	strcat(cd,ALOG_LOGFILE);	sprintf(c,"%d",id);	strcat(cd,c);	if ((head->file_t = fopen(cd,"w")) == NULL)		fprintf(stderr,"ALOG: *** Trace file creation failure ***\n");}VOID xx_user1(head,id)struct head_trace_buf *head;int id;{	struct stat buf;	char c[MAX_LOG_STRING_LEN], cd[100], x[100];	if (head == NULL) return;	if (!strcmp(xx_alog_outdir, ""))		getcwd(cd,100);	else		strcpy(cd, xx_alog_outdir);	if (cd[strlen(cd)-1] != '/')		strcat(cd, "/");	strcat(cd,ALOG_LOGFILE);	sprintf(c,"%d",id);	strcat(cd,c);	stat(cd,&buf);	strcpy(cd,(char *) ctime(&buf.st_ctime));	strcpy(x,"AL");	strncat(x,cd+4,3);		strcat(x,"-");	strncat(x,cd+8,2);		strcat(x,"-");	strncat(x,cd+22,2);		strcpy(c,"            ");	strncpy(c,x,12);	xx_write(head,0,(-1),0,c);	sprintf(x,"%lu", (unsigned long) usc_rollover_val());	xx_write(head,0,(-11),0,x);}VOID xx_alog_setup(pid,flag)int pid, flag;{/*	register int i;	char c[MAX_LOG_STRING_LEN], cd[MAX_LOG_STRING_LEN]; */	usc_init(); 	xx_alog_status &= 0x1;    /* set initialized flag */	xx_buf_head = (struct head_trace_buf *)        		malloc(sizeof(struct head_trace_buf));	if (xx_buf_head == NULL) {        	fprintf(stderr,"ALOG: *** Trace buffer HEADER creation failure;\n");        	fprintf(stderr,"      *** tracing is being disabled.\n");		return;	}	xx_buf_head->next_entry = 0;	xx_buf_head->max_size = MAX_BUF_SIZE;	xx_buf_head->prev_time = 0;	xx_buf_head->ind_time = 0;	xx_buf_head->trace_flag = flag;	xx_buf_head->xx_list = NULL;	if (!(xx_getbuf(xx_buf_head)))        	printf("ALOG: **** trace buffer creation failure ****\n");	xx_user(xx_buf_head,(pid));}

⌨️ 快捷键说明

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