From d93fcbb20d2a452d78b831210c1d8e3ef381602e Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sat, 14 May 2011 19:40:49 +0000 Subject: Ajout cursesUpdateSliceDump() et initialisation du mutex pour l'ventListener (cf commit précédent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2011-ddhardrescue/trunk@16 d3078510-dda0-49f1-841c-895ef4b7ec81 --- src/ddhardrescue.c | 112 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 35 deletions(-) diff --git a/src/ddhardrescue.c b/src/ddhardrescue.c index de89c26..ba6781e 100644 --- a/src/ddhardrescue.c +++ b/src/ddhardrescue.c @@ -9,10 +9,10 @@ #include "recover.h" #include "utils.h" - +// Global variable shared by all threads to say "finish current operation and go away" int end=0; -//FIXME remove me, only for tests -unsigned long c=0; +WINDOW *winUpdateSliceDump=NULL; +static pthread_mutex_t ncursesWriteMutex = PTHREAD_MUTEX_INITIALIZER; struct threadArgs { struct progArgs *progArgs; @@ -24,18 +24,7 @@ void sigHookAbrt() { end=1; } -/*TODO : remove that when procViewer is done -void dumper(slices_evt_t *slicesEvt, slice_t *modifiedSlice) { - address_t blockSize=0; - char *dump; - dump=slicesDump(slicesEvt->data, &blockSize, 3000, 0, 21474836480ULL); - system("clear"); - puts(dump); - free(dump); - -} -*/ - +// Main procedures of each thread void *procWorker(void *a); void *procViewer(void *a); @@ -76,8 +65,7 @@ int main(int argc, char **argv) { // Data structure initialization memset(&slices, 0, sizeof(slices)); slices.data=slicesNewSingleton(args.beginSector, args.endSector, S_UNKNOWN); -// slices.eventListener=dumper; - res=pthread_mutex_init(&(slices.mutex), NULL); + res=pthread_mutex_init(&(slices.eventListenerMutex), NULL); if (res!=0) { return 3; } @@ -87,6 +75,7 @@ int main(int argc, char **argv) { tArgs.progArgs=&args; tArgs.slices=&slices; + res=pthread_create(&tWorker, NULL, procWorker, &tArgs); if (res!=0) { return 4; @@ -98,18 +87,20 @@ int main(int argc, char **argv) { // Thread join point (void) pthread_join(tWorker, NULL); - /*Final dump of datas + //Final dump of datas address_t blockSize=0; char *dump; dump=slicesDump(slices.data, &blockSize, 1000, args.beginSector, args.endSector); - puts(dump); - free(dump); + if (dump != NULL) { + puts(dump); + free(dump); + } printf("blockSize==%lld\n", blockSize); printf("slices->count==%d\n", slices.data->count); - */ + //Resources desallocation - (void) pthread_mutex_destroy(&(slices.mutex)); + (void) pthread_mutex_destroy(&(slices.eventListenerMutex)); slice_t *curr, *toFree; i=0; curr=slices.data->first; @@ -124,7 +115,7 @@ int main(int argc, char **argv) { return 0; } -void * procWorker(void *a) { +void *procWorker(void *a) { struct threadArgs *tArgs = (struct threadArgs *)a; recover( @@ -137,34 +128,85 @@ 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; + +//FIXME : do that realy + pthread_mutex_lock(&ncursesWriteMutex); + + + toPrint=slicesDump(slicesEvt->data, &blockSize, 1000, 0, 1000); + 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; - //struct threadArgs *tArgs = (struct threadArgs *)a; + int ch, i; + char str[2]; + struct threadArgs *tArgs = (struct threadArgs *)a; + cursesInit(wins, panels, CURSESWIN_COUNT); - /* Show it on the screen */ - attron(COLOR_PAIR(4)); - mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F2 to Exit)"); - attroff(COLOR_PAIR(4)); + 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: - top_panel(panels[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; } - update_panels(); doupdate(); + + pthread_mutex_unlock(&ncursesWriteMutex); } - endwin(); + + pthread_mutex_lock(&(tArgs->slices->eventListenerMutex)); + tArgs->slices->eventListener=NULL; + pthread_mutex_unlock(&(tArgs->slices->eventListenerMutex)); + + end=1; + cursesUnInit(wins, panels, CURSESWIN_COUNT); return a; } -- cgit v1.2.3