From e9ef70cefa571bb1ada1ec515a433ed9a643a171 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Mon, 15 Aug 2011 16:26:07 +0000 Subject: Refactoring : Tout ce qui "ncurses" a été dégagé dans un "module" séparé. Le ddhardrescue.c est tout propre maintenant. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2011-ddhardrescue/trunk@21 d3078510-dda0-49f1-841c-895ef4b7ec81 --- src/ddhardrescue.c | 116 +++++++++-------------------------------------------- 1 file changed, 19 insertions(+), 97 deletions(-) (limited to 'src/ddhardrescue.c') diff --git a/src/ddhardrescue.c b/src/ddhardrescue.c index e10d323..67c061b 100644 --- a/src/ddhardrescue.c +++ b/src/ddhardrescue.c @@ -1,39 +1,34 @@ -#include -#include #include -#include -#include #include +#include /* For memset() */ #include "slices_evt.h" -#include "recover.h" #include "utils.h" +#include "recover.h" +#include "cursesview.h" // Global variable shared by all threads to say "finish current operation and go away" int end=0; -WINDOW *winUpdateSliceDump=NULL; -static pthread_mutex_t ncursesWriteMutex = PTHREAD_MUTEX_INITIALIZER; - -struct threadArgs { - struct progArgs *progArgs; - slices_evt_t *slices; -}; - void sigHookAbrt() { end=1; } -// Main procedures of each thread +// Main thread procedures declaration and a struct for passing arguments in a clean way void *procWorker(void *a); void *procViewer(void *a); +struct threadArgs { + struct progArgs *progArgs; + slices_evt_t *slices; +}; + int main(int argc, char **argv) { // System structures struct sigaction sa; pthread_t tWorker; - // Main data structures + // Main data structure slices_evt_t slices; // Progam and threads arguments @@ -42,7 +37,6 @@ int main(int argc, char **argv) { // Algorithmic needs int res, i; - // Parse command-line arguments res=parseArgs(argc, argv, &args); @@ -62,8 +56,8 @@ int main(int argc, char **argv) { //XXX Remove srand : only for simulation srand(4); - // Data structure initialization - // TODO : provides a standard method to do that ? + // Initialize main data structure + //XXX provide a method to do that ? memset(&slices, 0, sizeof(slices)); slices.data=slicesNewSingleton(args.beginSector, args.endSector, S_UNKNOWN); if ( slices.data == NULL ) { @@ -71,7 +65,6 @@ int main(int argc, char **argv) { } slices.data->min=args.beginSector; slices.data->max=args.endSector; - res=pthread_mutex_init(&(slices.eventListenerMutex), NULL); if (res!=0) { return 4; @@ -91,13 +84,13 @@ int main(int argc, char **argv) { // Ncurses interface run in the main thread (void) procViewer((void*)&tArgs); - // Thread join point + // Thread join point (wait worker thread when viewer is done) (void) pthread_join(tWorker, NULL); //Final dump of datas address_t blockSize=0; char *dump; - dump=slicesDump(slices.data, &blockSize, 1000, args.beginSector, args.endSector); + dump=slicesDump(slices.data, &blockSize, 10000, args.beginSector, args.endSector); if (dump != NULL) { puts(dump); free(dump); @@ -109,6 +102,7 @@ int main(int argc, char **argv) { //Resources desallocation (void) pthread_mutex_destroy(&(slices.eventListenerMutex)); + //XXX Method for that slice_t *curr, *toFree; i=0; curr=slices.data->first; while (curr!=NULL) { @@ -125,6 +119,7 @@ int main(int argc, char **argv) { void *procWorker(void *a) { struct threadArgs *tArgs = (struct threadArgs *)a; + //XXX : We will need something more controlable than just a blocking call to the main algorithm recover( tArgs->slices, tArgs->progArgs->src, @@ -135,87 +130,14 @@ void *procWorker(void *a) { return a; } -void cursesUpdateSliceDump(slices_evt_t *slicesEvt, slice_t *modifiedSlice) { -// char *strProgress="|/-\\"; -// static int progress=0; - char *toPrint; - address_t blockSize=0; - unsigned int charCount=(getmaxx(winUpdateSliceDump)-getbegx(winUpdateSliceDump))*(getmaxy(winUpdateSliceDump)-getbegy(winUpdateSliceDump)+2); - -//FIXME : do that realy - pthread_mutex_lock(&ncursesWriteMutex); - toPrint=slicesDump(slicesEvt->data, &blockSize, charCount, slicesEvt->data->min, slicesEvt->data->max); - if (toPrint != NULL) { - attron(COLOR_PAIR(4)); - mvwprintw(winUpdateSliceDump, 1, 0, toPrint); -// attroff(COLOR_PAIR(4)); - - update_panels(); - doupdate(); - - free(toPrint); - } - -/* sprintf(toPrint, "%c - %p %p", strProgress[progress], slicesEvt, modifiedSlice); - progress=(progress+1)%strlen(strProgress); -*/ - pthread_mutex_unlock(&ncursesWriteMutex); -} - -#define CURSESWIN_COUNT 3 void *procViewer(void *a) { - WINDOW *wins[CURSESWIN_COUNT]; - PANEL *panels[CURSESWIN_COUNT]; - int ch, i; - char str[2]; struct threadArgs *tArgs = (struct threadArgs *)a; - - - cursesInit(wins, panels, CURSESWIN_COUNT); - - wattron(wins[CURSESWIN_COUNT-1], COLOR_PAIR(4)); - mvwprintw(wins[CURSESWIN_COUNT-1], 1, 0, "(F2 to Exit)"); -// wattroff(wins[CURSESWIN_COUNT-1], COLOR_PAIR(4)); - update_panels(); - doupdate(); - - /* Enable worker listener */ - //FIXME : check pointers ? - winUpdateSliceDump=wins[1]; - tArgs->slices->eventListener=cursesUpdateSliceDump; - - while((ch = getch()) != KEY_F(2)) { - - pthread_mutex_lock(&ncursesWriteMutex); - - switch(ch) { - case '1': - case '2': - case '3': - str[0]=ch; str[1]='\0'; // int (ascii value+flags) to string - i=strtol(str, (char **)NULL, 10); // string to real integer - if (i>0 && i<=CURSESWIN_COUNT) { - top_panel(panels[i-1]); - update_panels(); - } - break; - } - - doupdate(); - - pthread_mutex_unlock(&ncursesWriteMutex); - } - - pthread_mutex_lock(&(tArgs->slices->eventListenerMutex)); - tArgs->slices->eventListener=NULL; - pthread_mutex_unlock(&(tArgs->slices->eventListenerMutex)); - - end=1; - cursesUnInit(wins, panels, CURSESWIN_COUNT); + cursesMainLoop( + tArgs->slices + ); return a; } - -- cgit v1.2.3