From 748b294646092e461053ade09a52a29586cbf4f7 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sat, 8 Oct 2011 21:50:22 +0000 Subject: Essai d'optimisation de l'affichage : ne pas rafraichir tout le dessin à chaque fois. Au finak c'est compliqué car on ne peut pas réutiliser le code de slicesDump car on ne peut pas relire les caractères envoyés sur la WINDOW ncurse... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2011-ddhardrescue/trunk@27 d3078510-dda0-49f1-841c-895ef4b7ec81 --- src/slices.c | 89 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 44 insertions(+), 45 deletions(-) (limited to 'src/slices.c') diff --git a/src/slices.c b/src/slices.c index fae363a..e8f1d49 100644 --- a/src/slices.c +++ b/src/slices.c @@ -92,6 +92,48 @@ int sliceSplit(slices_t *slices, slice_t *initialSlice, address_t splitAt, slice return 1 + (splitBeforeSingularity?1:0) + (splitAfterSingularity?1:0); } +void sliceDumpUpdate(char *dump, slice_t *s, address_t blockSize, unsigned int charCount, address_t begin, address_t end) { + address_t sb,se,i; + char ci; + + // If "s" slice is (partially) contained/visible in the [begin,end] display interval + if ( !(s->end < begin) && !(s->begin > end) ) { + // Draw the slice on the right number of characters + // Mathematically correct, but crashes because address_t is UNSIGNED + // sb=MAX(0, (s->begin - begin) / *blockSize); + sb=(s->begin < begin)?0:(s->begin - begin) / blockSize; + se=MIN((s->end - begin) / blockSize, charCount-1); + + /* Debug "assertion" + if (sb >= charCount || se >= charCount) { + printf("BUG : sb==%lli, se=%lli, charCount==%i\n", sb, se, charCount); + printf("BUG : MAX(0, (%lli - %lli) / %lli)", s->begin, begin, blockSize); + exit(42); + }*/ + + // Choose from the sent slice status the right char to draw + switch (s->status) { + case S_UNKNOWN: ci='_'; break; + case S_UNREADABLE: ci='!'; break; + case S_RECOVERED: ci='.'; break; + default: ci='~'; break; + } + + // Draw on the right number of characters, paying attention with information collision + for (i=sb;i<=se;i++) { + if (dump[i] == ' ' ) { + // This is a new information + dump[i]=ci; + } else if ( dump[i] == ci || dump[i] == '!' ) { + // Already the right information or error, don't modify + } else { + // Multiple information on the same character + dump[i]='#'; + } + } + } +} + slices_t *slicesNewEmpty() { int res; slices_t *ss = malloc(1*sizeof(slices_t)); @@ -203,54 +245,11 @@ slice_t *slicesFindLargestFast(slices_t *slices, address_t *foundMax, sliceStatu return sMax; } -void _sliceDump(char *dump, slice_t *curr, address_t blockSize, unsigned int charCount, address_t begin, address_t end) { - address_t sb,se,i; - char ci; - - // If "curr" slice is (partially) contained/visible in the [begin,end] display interval - if ( !(curr->end < begin) && !(curr->begin > end) ) { - // Draw the slice on the right number of characters - // Mathematically correct, but crashes because address_t is UNSIGNED - // sb=MAX(0, (curr->begin - begin) / *blockSize); - sb=(curr->begin < begin)?0:(curr->begin - begin) / blockSize; - se=MIN((curr->end - begin) / blockSize, charCount-1); - - /* Debug "assertion" - if (sb >= charCount || se >= charCount) { - printf("BUG : sb==%lli, se=%lli, charCount==%i\n", sb, se, charCount); - printf("BUG : MAX(0, (%lli - %lli) / %lli)", curr->begin, begin, blockSize); - pthread_mutex_unlock(&(slices->writeOrConsistentReadMutex)); - exit(42); - }*/ - - // Choose from the current slice status the right char to draw - switch (curr->status) { - case S_UNKNOWN: ci='_'; break; - case S_UNREADABLE: ci='!'; break; - case S_RECOVERED: ci='.'; break; - default: ci='~'; break; - } - - // Draw on the right number of characters, paying attention with information collision - for (i=sb;i<=se;i++) { - if (dump[i] == ' ' ) { - // This is a new information - dump[i]=ci; - } else if ( dump[i] == ci || dump[i] == '!' ) { - // Already the right information or error, don't modify - } else { - // Multiple information on the same character - dump[i]='#'; - } - } - } -} - char *slicesDump(slices_t *slices, address_t *blockSize, unsigned int charCount, address_t begin, address_t end) { int res; slice_t *curr; char *dump; - + res=pthread_mutex_lock(&(slices->writeOrConsistentReadMutex)); if (res!=0) { //FIXME Trashy code @@ -273,7 +272,7 @@ char *slicesDump(slices_t *slices, address_t *blockSize, unsigned int charCount, //For each slice write in dump ASCII representation curr = slices->first; while (curr != NULL) { - _sliceDump(dump, curr, *blockSize, charCount, begin, end); + sliceDumpUpdate(dump, curr, *blockSize, charCount, begin, end); curr=curr->next; } -- cgit v1.2.3