/*@ PetscMemoryGetCurrentUsage - Returns the current resident set size (memory used) for the program. Not Collective Output Parameter: . mem - memory usage in bytes Options Database Key: . -memory_view - Print memory usage at end of run . -malloc_log - Activate logging of memory usage Level: intermediate Notes: The memory usage reported here includes all Fortran arrays (that may be used in application-defined sections of code). This routine thus provides a more complete picture of memory usage than PetscMallocGetCurrentUsage() for codes that employ Fortran with hardwired arrays. .seealso: PetscMallocGetMaximumUsage(), PetscMemoryGetMaximumUsage(), PetscMallocGetCurrentUsage(), PetscMemorySetGetMaximumUsage(), PetscMemoryView() Concepts: resident set size Concepts: memory usage @*/ PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *mem) { #if defined(PETSC_USE_PROCFS_FOR_SIZE) FILE *file; int fd; char proc[PETSC_MAX_PATH_LEN]; prpsinfo_t prusage; #elif defined(PETSC_USE_SBREAK_FOR_SIZE) long *ii = sbreak(0); int fd = ii - (long*)0; #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) FILE *file; char proc[PETSC_MAX_PATH_LEN]; int mm,rss,err; #elif defined(PETSC_HAVE_GETRUSAGE) static struct rusage temp; #endif PetscFunctionBegin; #if defined(PETSC_USE_PROCFS_FOR_SIZE) sprintf(proc,"/proc/%d",(int)getpid()); if ((fd = open(proc,O_RDONLY)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to access system file %s to get memory usage data",file); if (ioctl(fd,PIOCPSINFO,&prusage) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_READ,"Unable to access system file %s to get memory usage data",file); *mem = (PetscLogDouble)prusage.pr_byrssize; close(fd); #elif defined(PETSC_USE_SBREAK_FOR_SIZE) *mem = (PetscLogDouble)(8*fd - 4294967296); /* 2^32 - upper bits */ #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) sprintf(proc,"/proc/%d/statm",(int)getpid()); if (!(file = fopen(proc,"r"))) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to access system file %s to get memory usage data",proc); if (fscanf(file,"%d %d",&mm,&rss) != 2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"Failed to read two integers (mm and rss) from %s",proc); *mem = ((PetscLogDouble)rss) * ((PetscLogDouble)getpagesize()); err = fclose(file); if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); #elif defined(PETSC_HAVE_GETRUSAGE) getrusage(RUSAGE_SELF,&temp); #if defined(PETSC_USE_KBYTES_FOR_SIZE) *mem = 1024.0 * ((PetscLogDouble)temp.ru_maxrss); #elif defined(PETSC_USE_PAGES_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) *mem = ((PetscLogDouble)getpagesize())*((PetscLogDouble)temp.ru_maxrss); #else *mem = temp.ru_maxrss; #endif #else *mem = 0.0; #endif PetscFunctionReturn(0); }
static CONN_STATE process( const POLL_MODE pollMode, const char callGrade ) { KWBoolean master = (KWBoolean) ( pollMode == POLL_ACTIVE ? KWTrue : KWFalse ); KWBoolean aborted = KWFalse; XFER_STATE state = (XFER_STATE) (master ? XFER_SENDINIT : XFER_RECVINIT); XFER_STATE old_state = XFER_EXIT; /* Initialized to any state but the original value of "state" */ XFER_STATE save_state = XFER_EXIT; char currentGrade = (char) ((unsigned char) 0xff); /*--------------------------------------------------------------------*/ /* Yea old state machine for the high level file transfer procotol */ /*--------------------------------------------------------------------*/ while( state != XFER_EXIT ) { printmsg(state == old_state ? 14 : 4 , "process: Machine state is = %c", state ); old_state = state; if ( terminate_processing != aborted ) { aborted = terminate_processing; state = XFER_ABORT; } switch( state ) { case XFER_SENDINIT: /* Initialize outgoing protocol */ state = sinit(); break; case XFER_RECVINIT: /* Initialize Receive protocol */ state = rinit(); break; case XFER_MASTER: /* Begin master mode */ master = KWTrue; state = XFER_NEXTJOB; resetGrade( ); /* Reset best grade status */ currentGrade = E_firstGrade; break; case XFER_SLAVE: /* Begin slave mode */ master = KWFalse; state = XFER_RECVHDR; break; case XFER_NEXTJOB: /* Look for work in local queue */ state = scandir( rmtname, currentGrade ); break; case XFER_REQUEST: /* Process next file in current job in queue */ state = newrequest(); break; case XFER_PUTFILE: /* Got local transmit request */ state = ssfile(); break; case XFER_GETFILE: /* Got local tranmit request */ state = srfile(); break; case XFER_SENDDATA: /* Remote accepted our work, send data */ state = sdata(); break; case XFER_SENDEOF: /* File xfer complete, send EOF */ state = seof( master ); break; case XFER_FILEDONE: /* Receive or transmit is complete */ state = (XFER_STATE) (master ? XFER_REQUEST : XFER_RECVHDR); break; case XFER_NEXTGRADE: /* Process next grade of local files */ currentGrade = nextGrade( callGrade ); if ( currentGrade ) state = XFER_NEXTJOB; else state = XFER_NOLOCAL; break; case XFER_NOLOCAL: /* No local work, remote have any? */ state = sbreak(); break; case XFER_NOREMOTE: /* No remote work, local have any? */ state = schkdir( (KWBoolean) (pollMode == POLL_ACTIVE ? KWTrue : KWFalse ), callGrade ); break; case XFER_RECVHDR: /* Receive header from other host */ state = rheader(); break; case XFER_TAKEFILE: /* Set up to receive remote requested file transfer */ state = rrfile(); break; case XFER_GIVEFILE: /* Set up to transmit remote requuest file transfer */ state = rsfile(); break; case XFER_RECVDATA: /* Receive file data from other host */ state = rdata(); break; case XFER_RECVEOF: state = reof(); break; case XFER_LOST: /* Lost the other host, flame out */ printmsg(0,"process: Connection lost to %s, " "previous system state = %c", rmtname, save_state ); hostp->status.hstatus = HS_CALL_FAILED; state = XFER_EXIT; break; case XFER_ABORT: /* Internal error, flame out */ printmsg(0,"process: Aborting connection to %s, " "previous system state = %c", rmtname, save_state ); hostp->status.hstatus = HS_CALL_FAILED; state = XFER_ENDP; break; case XFER_ENDP: /* Terminate the protocol */ state = endp(); break; default: printmsg(0,"process: Unknown state = %c, " "previous system state = %c", state, save_state ); state = XFER_ABORT; break; } /* switch */ save_state = old_state; /* Used only if we abort */ } /* while( state != XFER_EXIT ) */ /*--------------------------------------------------------------------*/ /* Protocol is complete, terminate the connection */ /*--------------------------------------------------------------------*/ return CONN_TERMINATE; } /* process */
/*@ PetscMemoryGetCurrentUsage - Returns the current resident set size (memory used) for the program. Not Collective Output Parameter: . mem - memory usage in bytes Options Database Key: . -memory_info - Print memory usage at end of run . -malloc_log - Activate logging of memory usage Level: intermediate Notes: The memory usage reported here includes all Fortran arrays (that may be used in application-defined sections of code). This routine thus provides a more complete picture of memory usage than PetscMallocGetCurrentUsage() for codes that employ Fortran with hardwired arrays. .seealso: PetscMallocGetMaximumUsage(), PetscMemoryGetMaximumUsage(), PetscMallocGetCurrentUsage() Concepts: resident set size Concepts: memory usage @*/ PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *mem) { #if defined(PETSC_USE_PROCFS_FOR_SIZE) FILE *file; int fd; char proc[PETSC_MAX_PATH_LEN]; prpsinfo_t prusage; #elif defined(PETSC_USE_SBREAK_FOR_SIZE) long *ii = sbreak(0); int fd = ii - (long*)0; #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) FILE *file; char proc[PETSC_MAX_PATH_LEN]; int mm,rss,err; #elif defined(PETSC_HAVE_TASK_INFO) /* task_basic_info_data_t ti; unsigned int count; */ /* The next line defined variables that are not used; but if they are not included the code crashes. Something must be wrong with either the task_info() command or compiler corrupting the stack. */ /* kern_return_t kerr; */ #elif defined(PETSC_HAVE_GETRUSAGE) static struct rusage temp; #endif PetscFunctionBegin; #if defined(PETSC_USE_PROCFS_FOR_SIZE) sprintf(proc,"/proc/%d",(int)getpid()); if ((fd = open(proc,O_RDONLY)) == -1) { SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to access system file %s to get memory usage data",file); } if (ioctl(fd,PIOCPSINFO,&prusage) == -1) { SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_READ,"Unable to access system file %s to get memory usage data",file); } *mem = (PetscLogDouble)prusage.pr_byrssize; close(fd); #elif defined(PETSC_USE_SBREAK_FOR_SIZE) *mem = (PetscLogDouble)(8*fd - 4294967296); /* 2^32 - upper bits */ #elif defined(PETSC_USE_PROC_FOR_SIZE) && defined(PETSC_HAVE_GETPAGESIZE) sprintf(proc,"/proc/%d/statm",(int)getpid()); if (!(file = fopen(proc,"r"))) { SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to access system file %s to get memory usage data",proc); } if (fscanf(file,"%d %d",&mm,&rss) != 2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"Failed to read two integers (mm and rss) from %s",proc); *mem = ((PetscLogDouble)rss) * ((PetscLogDouble)getpagesize()); err = fclose(file); if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); #elif defined(PETSC_HAVE_TASK_INFO) *mem = 0; /* if ((kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&ti,&count)) != KERN_SUCCESS) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Mach system call failed: kern_return_t ",kerr); *mem = (PetscLogDouble) ti.resident_size; */ #elif defined(PETSC_HAVE_GETRUSAGE) getrusage(RUSAGE_SELF,&temp); #if defined(PETSC_USE_KBYTES_FOR_SIZE) *mem = 1024.0 * ((PetscLogDouble)temp.ru_maxrss); #elif defined(PETSC_HAVE_GETPAGESIZE) *mem = ((PetscLogDouble)getpagesize())*((PetscLogDouble)temp.ru_maxrss); #else *mem = 0.0; #endif #else *mem = 0.0; #endif PetscFunctionReturn(0); }