gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r3492 - GNUnet/src/applications/fs/fsui


From: grothoff
Subject: [GNUnet-SVN] r3492 - GNUnet/src/applications/fs/fsui
Date: Tue, 17 Oct 2006 22:04:09 -0700 (PDT)

Author: grothoff
Date: 2006-10-17 22:04:07 -0700 (Tue, 17 Oct 2006)
New Revision: 3492

Modified:
   GNUnet/src/applications/fs/fsui/fsui.c
   GNUnet/src/applications/fs/fsui/serialize.c
Log:
better

Modified: GNUnet/src/applications/fs/fsui/fsui.c
===================================================================
--- GNUnet/src/applications/fs/fsui/fsui.c      2006-10-18 03:19:45 UTC (rev 
3491)
+++ GNUnet/src/applications/fs/fsui/fsui.c      2006-10-18 05:04:07 UTC (rev 
3492)
@@ -70,20 +70,22 @@
   FSUI_Event event;
 
   while (ret != NULL) {
-    event.type = FSUI_download_resumed;
-    event.data.DownloadResumed.dc.pos = ret;
-    event.data.DownloadResumed.dc.cctx = ret->cctx;
-    event.data.DownloadResumed.dc.ppos = ret->parent;
-    event.data.DownloadResumed.dc.pcctx = ret->parent->cctx;
-    event.data.DownloadResumed.eta = get_time(); /* FIXME: can do better here! 
*/
-    event.data.DownloadResumed.total = ret->total;
-    event.data.DownloadResumed.completed = ret->completed;
-    event.data.DownloadResumed.anonymityLevel = ret->anonymityLevel;
-    event.data.DownloadResumed.uri = ret->uri;
-    ret->cctx = ctx->ecb(ctx->ecbClosure, &event);
-    if (ret->child != NULL)
-      signalDownloadResume(ret->child,
-                          ctx);
+    if (ret->state == FSUI_PENDING) {
+      event.type = FSUI_download_resumed;
+      event.data.DownloadResumed.dc.pos = ret;
+      event.data.DownloadResumed.dc.cctx = ret->cctx;
+      event.data.DownloadResumed.dc.ppos = ret->parent;
+      event.data.DownloadResumed.dc.pcctx = ret->parent->cctx;
+      event.data.DownloadResumed.eta = get_time(); /* FIXME: can do better 
here! */
+      event.data.DownloadResumed.total = ret->total;
+      event.data.DownloadResumed.completed = ret->completed;
+      event.data.DownloadResumed.anonymityLevel = ret->anonymityLevel;
+      event.data.DownloadResumed.uri = ret->uri;
+      ret->cctx = ctx->ecb(ctx->ecbClosure, &event);
+      if (ret->child != NULL)
+       signalDownloadResume(ret->child,
+                            ctx);
+    }
     ret = ret->next;
   }
 }
@@ -93,24 +95,47 @@
   FSUI_Event event;
  
   while (ret != NULL) {
-    event.type = FSUI_upload_resumed;
-    event.data.UploadResumed.uc.pos = ret;
-    event.data.UploadResumed.uc.cctx = NULL;
-    event.data.UploadResumed.uc.ppos = ret->parent;
-    event.data.UploadResumed.uc.pcctx = ret->parent->cctx;
-    event.data.UploadResumed.completed = ret->completed;
-    event.data.UploadResumed.total = ret->total;
-    event.data.UploadResumed.anonymityLevel = ret->anonymityLevel;
-    event.data.UploadResumed.eta = 0; /* FIXME: use start_time for estimate! */
-    event.data.UploadResumed.filename = ret->filename;
-    ret->cctx = ctx->ecb(ctx->ecbClosure, &event);
-    if (ret->child != NULL)
-      signalUploadResume(ret->child,
-                        ctx);
+    if (ret->state == FSUI_PENDING) {
+      event.type = FSUI_upload_resumed;
+      event.data.UploadResumed.uc.pos = ret;
+      event.data.UploadResumed.uc.cctx = NULL;
+      event.data.UploadResumed.uc.ppos = ret->parent;
+      event.data.UploadResumed.uc.pcctx = ret->parent->cctx;
+      event.data.UploadResumed.completed = ret->completed;
+      event.data.UploadResumed.total = ret->total;
+      event.data.UploadResumed.anonymityLevel = ret->anonymityLevel;
+      event.data.UploadResumed.eta = 0; /* FIXME: use start_time for estimate! 
*/
+      event.data.UploadResumed.filename = ret->filename;
+      ret->cctx = ctx->ecb(ctx->ecbClosure, &event);
+      if (ret->child != NULL)
+       signalUploadResume(ret->child,
+                          ctx);
+    }
     ret = ret->next;
   }
 }
 
+/**
+ * Resume uploads.
+ * Only re-starts top-level upload threads;
+ * threads below are controlled by the parent.
+ */
+static void doResumeUploads(struct FSUI_UploadList * ret,
+                           FSUI_Context * ctx) {
+  while (ret != NULL) {
+    if (ret->state == FSUI_PENDING) {
+      ret->state = FSUI_ACTIVE;
+      ret->handle = PTHREAD_CREATE(&FSUI_uploadThread,
+                                  ret,
+                                  32 * 1024);
+      if (ret->handle == NULL)
+       GE_DIE_STRERROR(ctx->ectx,
+                       GE_FATAL | GE_ADMIN | GE_IMMEDIATE,
+                       "pthread_create");
+    }
+    ret = ret->next;
+  }
+}
 
 /**
  * Start FSUI manager.  Use the given progress callback to notify the
@@ -130,7 +155,6 @@
   FSUI_Event event;
   FSUI_Context * ret;
   FSUI_SearchList * list;
-  FSUI_UploadList * ulist;
   FSUI_UnindexList * xlist;
   char * fn;
   char * gh;
@@ -194,14 +218,16 @@
   /* 2b) signal search restarts */
   list = ret->activeSearches;
   while (list != NULL) {
-    event.type = FSUI_search_resumed;
-    event.data.SearchResumed.sc.pos = list;
-    event.data.SearchResumed.sc.cctx = NULL;
-    event.data.SearchResumed.fis = list->resultsReceived;
-    event.data.SearchResumed.fisSize = list->sizeResultsReceived;
-    event.data.SearchResumed.anonymityLevel = list->anonymityLevel;
-    event.data.SearchResumed.searchURI = list->uri;
-    list->cctx = cb(closure, &event);  
+    if (list->state == FSUI_PENDING) {
+      event.type = FSUI_search_resumed;
+      event.data.SearchResumed.sc.pos = list;
+      event.data.SearchResumed.sc.cctx = NULL;
+      event.data.SearchResumed.fis = list->resultsReceived;
+      event.data.SearchResumed.fisSize = list->sizeResultsReceived;
+      event.data.SearchResumed.anonymityLevel = list->anonymityLevel;
+      event.data.SearchResumed.searchURI = list->uri;
+      list->cctx = cb(closure, &event); 
+    }
     list = list->next;
   }
   /* 2c) signal upload restarts */
@@ -210,14 +236,16 @@
   /* 2d) signal unindex restarts */
   xlist = ret->unindexOperations;
   while (xlist != NULL) {
-    event.type = FSUI_unindex_resumed;
-    event.data.UnindexResumed.uc.pos = xlist;
-    event.data.UnindexResumed.uc.cctx = NULL;
-    event.data.UnindexResumed.completed = 0; /* FIXME */
-    event.data.UnindexResumed.total = 0; /* FIXME */
-    event.data.UnindexResumed.eta = 0; /* FIXME: use start_time for estimate! 
*/
-    event.data.UnindexResumed.filename = xlist->filename;
-    xlist->cctx = cb(closure, &event); 
+    if (xlist->state == FSUI_PENDING) {
+      event.type = FSUI_unindex_resumed;
+      event.data.UnindexResumed.uc.pos = xlist;
+      event.data.UnindexResumed.uc.cctx = NULL;
+      event.data.UnindexResumed.completed = 0; /* FIXME */
+      event.data.UnindexResumed.total = 0; /* FIXME */
+      event.data.UnindexResumed.eta = 0; /* FIXME: use start_time for 
estimate! */
+      event.data.UnindexResumed.filename = xlist->filename;
+      xlist->cctx = cb(closure, &event);       
+    }
     xlist = xlist->next;
   }
 
@@ -231,28 +259,12 @@
               ret);
   cron_start(ret->cron);
   /* 3b) resume uploads */
-  ulist = ret->activeUploads;
-  while (ulist != NULL) {
-    if ( (ulist->state != FSUI_ABORTED_JOINED) &&
-        (ulist->state != FSUI_COMPLETED_JOINED) &&
-        (ulist->state != FSUI_ERROR_JOINED) ) {
-      ulist->state = FSUI_ACTIVE;
-      ulist->handle = PTHREAD_CREATE(&FSUI_uploadThread,
-                                    ulist,
-                                    32 * 1024);
-      if (ulist->handle == NULL)
-       GE_DIE_STRERROR(ectx,
-                       GE_FATAL | GE_ADMIN | GE_IMMEDIATE,
-                       "pthread_create");
-    }     
-    ulist = ulist->next;
-  }
+  doResumeUploads(ret->activeUploads.child,
+                 ret);
   /* 3c) resume unindexing */
   xlist = ret->unindexOperations;
   while (xlist != NULL) {
-    if ( (xlist->state != FSUI_ABORTED_JOINED) &&
-        (xlist->state != FSUI_COMPLETED_JOINED) &&
-        (xlist->state != FSUI_ERROR_JOINED) ) {
+    if (xlist->state != FSUI_PENDING) {
       xlist->state = FSUI_ACTIVE;
       xlist->handle = PTHREAD_CREATE(&FSUI_unindexThread,
                                     xlist,
@@ -267,9 +279,7 @@
   /* 3d) resume searching */
   list = ret->activeSearches;
   while (list != NULL) {
-    if ( (list->state != FSUI_ABORTED_JOINED) &&
-        (list->state != FSUI_COMPLETED_JOINED) &&
-        (list->state != FSUI_ERROR_JOINED) ) {
+    if (list->state == FSUI_PENDING) {
       list->state = FSUI_ACTIVE;
       list->handle = PTHREAD_CREATE(&FSUI_searchThread,
                                    list,
@@ -295,20 +305,45 @@
                                  FSUI_DownloadList * list) {
   FSUI_Event event;
   while (list != NULL) {
-    signalDownloadSuspend(ectx,
-                         ctx,
-                         list->child);
-    event.type = FSUI_download_suspended;
-    event.data.DownloadSuspended.dc.pos = list;
-    event.data.DownloadSuspended.dc.cctx = list->cctx;
-    event.data.DownloadSuspended.dc.ppos = list->parent;
-    event.data.DownloadSuspended.dc.pcctx = list->parent->cctx; 
-    ctx->ecb(ctx->ecbClosure, &event);
+    if (list->state == FSUI_PENDING) {
+      signalDownloadSuspend(ectx,
+                           ctx,
+                           list->child);
+      event.type = FSUI_download_suspended;
+      event.data.DownloadSuspended.dc.pos = list;
+      event.data.DownloadSuspended.dc.cctx = list->cctx;
+      event.data.DownloadSuspended.dc.ppos = list->parent;
+      event.data.DownloadSuspended.dc.pcctx = list->parent->cctx; 
+      ctx->ecb(ctx->ecbClosure, &event);
+    }
     list = list->next;
   }
 }
 
 /**
+ * (recursively) signal upload suspension.
+ */
+static void signalUploadSuspend(struct GE_Context * ectx,
+                               FSUI_Context * ctx,
+                               FSUI_UploadList * upos) {
+  FSUI_Event event;
+  while (upos != NULL) {
+    if (upos->state == FSUI_PENDING) {
+      signalUploadSuspend(ectx,
+                         ctx,
+                         upos->child);
+      event.type = FSUI_upload_suspended;
+      event.data.UploadSuspended.uc.pos = upos;
+      event.data.UploadSuspended.uc.cctx = upos->cctx;
+      event.data.UploadSuspended.uc.ppos = upos->parent;
+      event.data.UploadSuspended.uc.pcctx = upos->parent->cctx;
+      ctx->ecb(ctx->ecbClosure, &event);
+    }
+    upos = upos->next;
+  }
+}
+
+/**
  * (recursively) free download list
  */
 static void freeDownloadList(FSUI_DownloadList * list) {
@@ -324,6 +359,26 @@
 }
 
 /**
+ * (recursively) free upload list
+ */
+static void freeUploadList(struct FSUI_Context * ctx,
+                          FSUI_UploadList * list) {
+  FSUI_UploadList *  next;
+  
+  while (list != NULL) {
+    freeUploadList(ctx, list->child);
+    next = list->next;
+    FREE(list->filename);
+    ECRS_freeMetaData(list->meta);
+    ECRS_freeUri(list->uri);
+    if (list->parent == &ctx->activeUploads)
+      EXTRACTOR_removeAll(list->extractors);
+    FREE(list);
+    list = next;
+  }
+}
+
+/**
  * Stop all processes under FSUI control (serialize state, continue
  * later if possible).
  */
@@ -361,25 +416,54 @@
   /* 1b) stop searching */
   spos = ctx->activeSearches;
   while (spos != NULL) {
-    spos->signalTerminate = YES;
-    PTHREAD_STOP_SLEEP(spos->handle);
-    PTHREAD_JOIN(spos->handle, &unused);
+    if ( (spos->state == FSUI_ACTIVE) ||
+        (spos->state == FSUI_ABORTED) ||
+        (spos->state == FSUI_ERROR) ||
+        (spos->state == FSUI_COMPLETED) ) {
+      spos->signalTerminate = YES;
+      PTHREAD_STOP_SLEEP(spos->handle);
+      PTHREAD_JOIN(spos->handle, &unused);
+      if (spos->state == FSUI_ACTIVE)
+       spos->state = FSUI_PENDING;
+      else
+       spos->state++; /* _JOINED */
+    }
     spos = spos->next;
   }
   /* 1c) stop unindexing */
   xpos = ctx->unindexOperations;
   while (xpos != NULL) {
-    xpos->force_termination = YES;
-    PTHREAD_STOP_SLEEP(xpos->handle);
-    PTHREAD_JOIN(xpos->handle, &unused);    
+    if ( (xpos->state == FSUI_ACTIVE) ||
+        (xpos->state == FSUI_ABORTED) ||
+        (xpos->state == FSUI_ERROR) ||
+        (xpos->state == FSUI_COMPLETED) ) {
+      xpos->force_termination = YES;
+      PTHREAD_STOP_SLEEP(xpos->handle);
+      PTHREAD_JOIN(xpos->handle, &unused);    
+      if (xpos->state == FSUI_ACTIVE)
+       xpos->state = FSUI_PENDING;
+      else
+       xpos->state++; /* _JOINED */
+    }    
     xpos = xpos->next;    
   }
   /* 1d) stop uploading */
-  upos = ctx->activeUploads;
+  upos = ctx->activeUploads.child;
   while (upos != NULL) {
-    upos->force_termination = YES;
-    PTHREAD_STOP_SLEEP(upos->handle);
-    PTHREAD_JOIN(upos->handle, &unused);
+    if ( (upos->state == FSUI_ACTIVE) ||
+        (upos->state == FSUI_ABORTED) ||
+        (upos->state == FSUI_ERROR) ||
+        (upos->state == FSUI_COMPLETED) ) {
+      /* NOTE: will force transitive termination
+        of rest of tree! */
+      upos->force_termination = YES;
+      PTHREAD_STOP_SLEEP(upos->handle);
+      PTHREAD_JOIN(upos->handle, &unused);
+      if (upos->state == FSUI_ACTIVE)
+       upos->state = FSUI_PENDING;
+      else
+       upos->state++; /* _JOINED */
+    }
     upos = upos->next;
   } 
 
@@ -394,16 +478,9 @@
     spos = spos->next;
   }
   /* 2b) signal uploads suspension */
-  upos = ctx->activeUploads;
-  while (upos != NULL) {
-    event.type = FSUI_upload_suspended;
-    event.data.UploadSuspended.uc.pos = upos;
-    event.data.UploadSuspended.uc.cctx = upos->cctx;
-    event.data.UploadSuspended.uc.ppos = NULL; /* FIXME */
-    event.data.UploadSuspended.uc.pcctx = NULL; /* FIXME */
-    ctx->ecb(ctx->ecbClosure, &event);
-    upos = upos->next;
-  }
+  signalUploadSuspend(ectx,
+                     ctx,
+                     ctx->activeUploads.child);
   /* 2c) signal downloads suspension */
   signalDownloadSuspend(ectx,
                        ctx,
@@ -459,15 +536,8 @@
     FREE(xpos);
   }
   /* 4c) free upload memory */
-  while (ctx->activeUploads != NULL) {
-    upos = ctx->activeUploads;
-    ctx->activeUploads = upos->next;
-    FREE(upos->filename);
-    ECRS_freeMetaData(upos->meta);
-    ECRS_freeUri(upos->uri);
-    EXTRACTOR_removeAll(upos->extractors);
-    FREE(upos);
-  }
+  freeUploadList(ctx,
+                ctx->activeUploads.child);
   /* 4d) free download memory */
   freeDownloadList(ctx->activeDownloads.child);
 

Modified: GNUnet/src/applications/fs/fsui/serialize.c
===================================================================
--- GNUnet/src/applications/fs/fsui/serialize.c 2006-10-18 03:19:45 UTC (rev 
3491)
+++ GNUnet/src/applications/fs/fsui/serialize.c 2006-10-18 05:04:07 UTC (rev 
3492)
@@ -24,9 +24,6 @@
  * @brief FSUI functions for writing state to disk
  * @author Christian Grothoff
  * @see deserializer.c
- *
- * TODO:
- * - upload tree handling (need to change upload representation)
  */
 
 #include "platform.h"
@@ -224,26 +221,23 @@
 }
 
 static void writeUploads(int fd,
-                        struct FSUI_Context * ctx) {
-  FSUI_UploadList * upos;
-
-  upos = ctx->activeUploads;
+                        struct FSUI_Context * ctx,
+                        struct FSUI_UploadList * upos) {
   while (upos != NULL) {
     WRITEINT(fd, 1);
     WRITEINT(fd, upos->state);
-    WRITELONG(fd, upos->main_completed);
-    WRITELONG(fd, upos->main_total);
+    WRITELONG(fd, upos->completed);
+    WRITELONG(fd, upos->total);
     WRITELONG(fd, upos->expiration);
     WRITELONG(fd, upos->start_time);
     writeURI(fd, upos->uri);
-    writeURI(fd, upos->globalUri); /* need to handle NULL? */
     WRITESTRING(fd, upos->filename);
-    WRITESTRING(fd, upos->main_filename);
     WRITEINT(fd, upos->isRecursive);
     WRITEINT(fd, upos->doIndex);
     WRITEINT(fd, upos->anonymityLevel);
     WRITEINT(fd, upos->priority);
     WRITEINT(fd, upos->individualKeywords);
+    writeUploads(fd, ctx, upos->child);
     upos = upos->next;
   }
   WRITEINT(fd, 0);
@@ -268,7 +262,9 @@
                    ctx,
                    ctx->activeDownloads.child);
   writeUnindexing(fd, ctx);
-  writeUploads(fd, ctx);  
+  writeUploads(fd, 
+              ctx,
+              ctx->activeUploads.child);  
   CLOSE(fd);
 }
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]