From 700898cdd309acb86dcd275d8b1c34e02d67922e Mon Sep 17 00:00:00 2001 From: Subramanian Ganapathy Date: Thu, 10 May 2012 14:07:52 -0700 Subject: [PATCH] Adding support to return global segments of the process using the /proc/maps --- Makefile | 6 ++-- snapshot-interface.cc | 65 +++++++++++++++++++++++++++++++++++++++++++ snapshot-interface.h | 12 ++++++++ 3 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 snapshot-interface.cc create mode 100644 snapshot-interface.h diff --git a/Makefile b/Makefile index b48fb109..8344effd 100644 --- a/Makefile +++ b/Makefile @@ -10,9 +10,9 @@ LIB_MEM_SO=lib$(LIB_MEM).so USER_O=userprog.o USER_H=libthreads.h libatomic.h -MODEL_CC=libthreads.cc schedule.cc libatomic.cc model.cc threads.cc tree.cc librace.cc action.cc main.cc -MODEL_O=libthreads.o schedule.o libatomic.o model.o threads.o tree.o librace.o action.o main.o -MODEL_H=libthreads.h schedule.h common.h libatomic.h model.h threads.h tree.h librace.h action.h +MODEL_CC=libthreads.cc schedule.cc libatomic.cc model.cc threads.cc tree.cc librace.cc action.cc main.cc snapshot-interface.cc +MODEL_O=libthreads.o schedule.o libatomic.o model.o threads.o tree.o librace.o action.o main.o snapshot-interface.o +MODEL_H=libthreads.h schedule.h common.h libatomic.h model.h threads.h tree.h librace.h action.h snapshot-interface.h SHMEM_CC=snapshot.cc malloc.c mymemory.cc SHMEM_O=snapshot.o malloc.o mymemory.o diff --git a/snapshot-interface.cc b/snapshot-interface.cc new file mode 100644 index 00000000..e350bc47 --- /dev/null +++ b/snapshot-interface.cc @@ -0,0 +1,65 @@ +#define MYBINARYNAME "model" +#define MYLIBRARYNAME "libmodel.so" +#define MYALLOCNAME "libmymemory.so" +#define PROCNAME "/proc/*/maps" +#define REPLACEPOS 6 +#define PAGESIZE 4096 +#include "snapshot-interface.h" +#include +#include +#include +#include +#include +typedef std::basic_stringstream< char, std::char_traits< char >, MyAlloc< char > > MyStringStream; +std::vector< MyString, MyAlloc< MyString> > splitString( MyString input, char delim ){ + std::vector< MyString, MyAlloc< MyString > > splits; + MyStringStream ss( input ); + MyString item; + while( std::getline( ss, item, delim ) ){ + splits.push_back( item ); + } + return splits; +} + +bool checkPermissions( MyString permStr ){ + return permStr.find("w") != MyString::npos; +} +std::vector< std::pair< void *, size_t >, MyAlloc< std::pair< void *, size_t > > > snapshot_utils::ReturnGlobalSegmentsToSnapshot(){ + std::vector< std::pair< void *, size_t >, MyAlloc< std::pair< void *, size_t > > > theVec; + MyString fn = PROCNAME; + static char sProcessSize[ 12 ] = { 0 }; + std::pair< const char *, bool > dataSect[ 3 ]; + dataSect[ 0 ] = std::make_pair( MYBINARYNAME, false ); + dataSect[ 1 ] = std::make_pair( MYLIBRARYNAME, false ); + dataSect[ 2 ] = std::make_pair( MYALLOCNAME, false ); + static pid_t sProcID = 0; + if( 0 == sProcID ) { + sProcID = getpid(); + sprintf( sProcessSize, "%d", sProcID ); + } + fn.replace( REPLACEPOS, 1, sProcessSize ); + std::ifstream procName( fn.c_str() ); + if( procName.is_open() ){ + MyString line; + while( procName.good() ){ + getline( procName, line ); + int i = 0; + for( i = 0; i < 3; ++i ){ + if( MyString::npos != line.find( dataSect[ i ].first ) ) break; + } + if( i >= 3 || dataSect[ i ].second == true ) continue; + dataSect[ i ].second = true; + if( !procName.good() )return theVec; + getline( procName, line ); + std::vector< MyString, MyAlloc< MyString > > firstSplit = splitString( line, ' ' ); + if( !checkPermissions( firstSplit[ 1 ] ) ) continue; + std::vector< MyString, MyAlloc< MyString > > secondSplit = splitString( firstSplit[ 0 ], '-' ); + size_t val1 = 0, val2 = 0; + sscanf( secondSplit[ 0 ].c_str(), "%zx", &val1 ); + sscanf( secondSplit[ 1 ].c_str(), "%zx", &val2 ); + size_t len = ( val2 - val1 ) / PAGESIZE; + theVec.push_back( std::make_pair( ( void * ) val1, len ) ); + } + } + return theVec; +} diff --git a/snapshot-interface.h b/snapshot-interface.h new file mode 100644 index 00000000..0c2478ee --- /dev/null +++ b/snapshot-interface.h @@ -0,0 +1,12 @@ +#ifndef __SNAPINTERFACE_H +#define __SNAPINTERFACE_H +#include "snapshot.h" +#include "mymemory.h" +#include +#include +#include +typedef std::basic_string< char, std::char_traits< char >, MyAlloc< char > > MyString; +namespace snapshot_utils{ + std::vector< std::pair< void *, size_t >, MyAlloc< std::pair< void *, size_t > > > ReturnGlobalSegmentsToSnapshot(); +}; +#endif -- 2.34.1