From 261ec98c16ed512529472218fee3bf6db298a748 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 6 Mar 2011 10:52:03 +0000 Subject: Rush du dimanche matin. Beaucoup de choses écrites et pas testée ni finies mais ça avance. A relire !! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2011-ddhardrescue/trunk@8 d3078510-dda0-49f1-841c-895ef4b7ec81 --- src/ddhardrescue.c | 128 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 20 deletions(-) (limited to 'src/ddhardrescue.c') diff --git a/src/ddhardrescue.c b/src/ddhardrescue.c index df61bc6..486ea41 100755 --- a/src/ddhardrescue.c +++ b/src/ddhardrescue.c @@ -1,49 +1,137 @@ #include #include +#include #include - +#include +#include + #include "slices.h" #include "recover.h" +#include "utils.h" int end=0; unsigned long c=0; +struct threadArgs { + struct progArgs *progArgs; + struct slices_manage_t *slices; +}; + +typedef enum { E_BOUND, E_TYPE } sliceEventKind_t; + +typedef struct { + slices_t *data; + pthread_mutex_t mutex; + void (*slices_listener)(sliceEventKind_t eventKind, slices_t *slices, slice_t *slice); +} slices_manage_t; + + void sigHookAbrt() { end=1; } -int main() { - char *src, *dst, *ddOpts, *dump; - address_t beginSector, endSector, blockSize; - int /*depth,*/i; - slices_t *slices; - slice_t *curr, *toFree; +void *procWorker(void *a); +void *procViewer(void *a); + +int main(int argc, char **argv) { + // System structures + struct sigaction sa; + pthread_t tWorker, tViewer; + + // Main data structures + slices_manage_t slices; + + // Progam and threads arguments + struct progArgs args; + struct threadArgs tArgs; + + // Algorithmic needs + int res, i; + - //TODO Parse args - //TODO signal... + // Parse command-line arguments + res=parseArgs(argc, argv, &args); + if (res!=0) { + usage(argv[0]); + return 1; + } + // Set signals behavior + memset(&sa,0,sizeof(sa)); + sa.sa_handler=sigHookAbrt; + res=sigaction(SIGABRT, &sa, NULL); + if (res!=0) { + return 2; + } + + //XXX Remove srand : only for simulation srand(4); - slices=recover(src,dst,ddOpts,beginSector,endSector/*,depth*/); - - blockSize=0; - dump=slicesDump(slices, &blockSize, 1000, beginSector, endSector); + + // Data structure initialization + memset(&slices, 0, sizeof(slices)); + slices.data=slicesNewSingleton(args.beginSector, args.endSector, S_UNKNOWN); + res=pthread_mutex_init(&(slices.mutex), NULL); + if (res!=0) { + return 3; + } + + // Threads preparation, creation and start + memset(&tArgs, 0, sizeof(tArgs)); + tArgs.progArgs=&args; + tArgs.slices=&slices; + + res=pthread_create(&tWorker, NULL, procWorker, &tArgs); + if (res!=0) { + return 4; + } + + res=pthread_create(&tViewer, NULL, procViewer, &tArgs); + if (res!=0) { + return 5; + } + + // Thread join point + (void) pthread_join(tWorker, NULL); + (void) pthread_join(tViewer, NULL); + + //Final dump of datas + address_t blockSize=0; + char *dump; + dump=slicesDump(slices.data, &blockSize, 1000, args.beginSector, args.endSector); puts(dump); free(dump); printf("blockSize==%lld\n", blockSize); - printf("c==%ld\n", c); - printf("slices->count==%d\n", slices->count); + printf("slices->count==%d\n", slices.data->count); - curr=slices->first; - i=0; + //Resources desallocation + (void) pthread_mutex_destroy(&(slices.mutex)); + + slice_t *curr, *toFree; + i=0; curr=slices.data->first; while (curr!=NULL) { i++; toFree=curr; curr=curr->next; free(toFree); } - free(slices); + free(slices.data); +} + +void * procWorker(void *a) { + struct threadArgs *tArgs = (struct threadArgs *)a; + + (void) recover( + tArgs->progArgs->src, + tArgs->progArgs->dst, + tArgs->progArgs->ddOpts, + tArgs->progArgs->beginSector, + tArgs->progArgs->endSector + ); + + return a; +} - printf("i==%d\n", i); +void *procViewer(void *a) { - return 0; + return a; } -- cgit v1.2.3