gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r3909 - in gnunet-gtk: . src/plugins/fs


From: grothoff
Subject: [GNUnet-SVN] r3909 - in gnunet-gtk: . src/plugins/fs
Date: Sat, 9 Dec 2006 22:27:58 -0800 (PST)

Author: grothoff
Date: 2006-12-09 22:27:55 -0800 (Sat, 09 Dec 2006)
New Revision: 3909

Modified:
   gnunet-gtk/TODO
   gnunet-gtk/src/plugins/fs/download.c
   gnunet-gtk/src/plugins/fs/search.c
   gnunet-gtk/src/plugins/fs/upload.c
Log:
fixing deadlocks

Modified: gnunet-gtk/TODO
===================================================================
--- gnunet-gtk/TODO     2006-12-10 05:58:37 UTC (rev 3908)
+++ gnunet-gtk/TODO     2006-12-10 06:27:55 UTC (rev 3909)
@@ -1,6 +1,4 @@
 0.7.1:
-- deadlock: FSUI_startDownload/Upload
-  must NOT be done in main thread [pre2]
 - fix addition of previews for uploads [pre2]
 - create directory from known file IDs [ medium ] [pre2]
   in Assemble Directory's Files Available/Selected

Modified: gnunet-gtk/src/plugins/fs/download.c
===================================================================
--- gnunet-gtk/src/plugins/fs/download.c        2006-12-10 05:58:37 UTC (rev 
3908)
+++ gnunet-gtk/src/plugins/fs/download.c        2006-12-10 06:27:55 UTC (rev 
3909)
@@ -388,7 +388,7 @@
  * possibly refresh directory listing.
  */
 void fs_download_aborted(DownloadList * downloadContext) {
-  /* FIXME: update summary? / search list status entry (once added) */
+  /* FIXME: update summary? / search list status entry! */
   downloadContext->has_terminated = YES;
   refreshDirectoryViewFromDisk(downloadContext);
 }
@@ -479,6 +479,31 @@
   return OK;
 }
 
+typedef struct {
+  char * uri_name;
+  struct ECRS_URI * idc_uri;
+  struct ECRS_MetaData * idc_meta;
+  char * idc_final_download_destination;
+  SearchList * searchContext;
+  DownloadList * parentContext;
+  unsigned int anonymity;
+  int recursive;
+} SDC;
+
+static void * init_download_helper(void * cls) {
+  SDC * sdc = cls;
+
+  FSUI_startDownload(ctx,
+                    sdc->anonymity,
+                    sdc->recursive,
+                    sdc->idc_uri,
+                    sdc->idc_meta,
+                    sdc->idc_final_download_destination,
+                    sdc->searchContext->fsui_list,
+                    (sdc->parentContext != NULL) ? 
sdc->parentContext->fsui_list : NULL);
+  return NULL;
+}
+
 /**
  * The user clicked the download button.
  * Start the download of the selected entry.
@@ -488,7 +513,7 @@
                 GtkTreePath * path,
                 GtkTreeIter * iter,
                 gpointer unused) {
-  char * uri_name;
+  SDC sdc;
   char * final_download_dir;
   GtkTreeIter iiter;
   char * tmp;
@@ -497,43 +522,38 @@
   GtkTreePath *dirTreePath;
   char *dirPath;
   unsigned int dirPathLen;
-  struct ECRS_URI * idc_uri;
-  struct ECRS_MetaData * idc_meta;
   char * idc_name;
   char * idc_mime;
-  char * idc_final_download_destination;
-  SearchList * searchContext;
-  DownloadList * parentContext;
 
-  idc_uri = NULL;
-  idc_meta = NULL;
+  sdc.idc_uri = NULL;
+  sdc.idc_meta = NULL;
   idc_name = NULL;
   idc_mime = NULL;
-  searchContext = NULL;
-  parentContext = NULL;
+  sdc.searchContext = NULL;
+  sdc.parentContext = NULL;
   gtk_tree_model_get(model,
                      iter,
                      SEARCH_NAME, &idc_name,
-                     SEARCH_URI, &idc_uri,
-                     SEARCH_META, &idc_meta,
+                     SEARCH_URI, &sdc.idc_uri,
+                     SEARCH_META, &sdc.idc_meta,
                      SEARCH_MIME, &idc_mime,
-                    SEARCH_INTERNAL, &searchContext,
-                    SEARCH_INTERNAL_PARENT, &parentContext,
+                    SEARCH_INTERNAL, &sdc.searchContext,
+                    SEARCH_INTERNAL_PARENT, &sdc.parentContext,
                      -1);
-  if ( (idc_uri == NULL) ||
-       (! ECRS_isFileUri(idc_uri)) ) {
+  if ( (sdc.idc_uri == NULL) ||
+       (! ECRS_isFileUri(sdc.idc_uri)) ) {
     GE_BREAK(ectx, 0);
     FREENONNULL(idc_name);
     FREENONNULL(idc_mime);
     return;
   }
-  uri_name = ECRS_uriToString(idc_uri);
-  if ( (uri_name == NULL) ||
-       (strlen(uri_name) <
+  sdc.uri_name = ECRS_uriToString(sdc.idc_uri);
+  if ( (sdc.uri_name == NULL) ||
+       (strlen(sdc.uri_name) <
         strlen(ECRS_URI_PREFIX) +
         strlen(ECRS_FILE_INFIX)) ) {
     GE_BREAK(ectx, 0);
-    FREENONNULL(uri_name);
+    FREENONNULL(sdc.uri_name);
     FREENONNULL(idc_name);
     FREENONNULL(idc_mime);
     return;
@@ -542,12 +562,12 @@
 #ifdef WINDOWS
     char * filehash;
     
-    filehash = STRDUP(uri_name);
+    filehash = STRDUP(sdc.uri_name);
     filehash[16] = 0;
     idc_name = STRDUP(filehash);
     FREENONNULL(filehash);
 #else
-    idc_name = STRDUP(uri_name);
+    idc_name = STRDUP(sdc.uri_name);
 #endif
   }
 
@@ -620,41 +640,35 @@
   gtk_tree_path_free(dirTreePath);
 
   /* construct completed/directory/real-filename */
-  idc_final_download_destination = MALLOC(strlen(final_download_dir) + 2 +
-                                         strlen(idc_name) + 
strlen(GNUNET_DIRECTORY_EXT) +
-                                         strlen(dirPath));
-  strcpy(idc_final_download_destination, 
+  sdc.idc_final_download_destination = MALLOC(strlen(final_download_dir) + 2 +
+                                             strlen(idc_name) + 
strlen(GNUNET_DIRECTORY_EXT) +
+                                             strlen(dirPath));
+  strcpy(sdc.idc_final_download_destination, 
         final_download_dir);
-  if (idc_final_download_destination[strlen(idc_final_download_destination)-1] 
!= DIR_SEPARATOR)
-    strcat(idc_final_download_destination,
+  if 
(sdc.idc_final_download_destination[strlen(sdc.idc_final_download_destination)-1]
 != DIR_SEPARATOR)
+    strcat(sdc.idc_final_download_destination,
            DIR_SEPARATOR_STR);
-  strcat(idc_final_download_destination, 
+  strcat(sdc.idc_final_download_destination, 
         dirPath);
-  strcat(idc_final_download_destination, 
+  strcat(sdc.idc_final_download_destination, 
         idc_name);
-  /* FIXME: check that there is no pending download for idc_name! */
+  sdc.anonymity = getSpinButtonValue(sdc.searchContext->searchXML,
+                                    "downloadAnonymitySpinButton");
+  sdc.recursive = getToggleButtonValue(sdc.searchContext->searchXML,
+                                      "downloadRecursiveCheckButton");
   if (OK == check_pending(idc_name,
                          NULL)) {
     addLogEntry(_("Downloading `%s'"),
                idc_name);
-    /* FIXME! DEADLOCK! */
-    FSUI_startDownload(ctx,
-                      getSpinButtonValue(searchContext->searchXML,
-                                         "downloadAnonymitySpinButton"),
-                      getToggleButtonValue(searchContext->searchXML,
-                                           "downloadRecursiveCheckButton"),
-                      idc_uri,
-                      idc_meta,
-                      idc_final_download_destination,
-                      searchContext->fsui_list,
-                      (parentContext != NULL) ? parentContext->fsui_list : 
NULL);
+    run_with_save_calls(&init_download_helper,
+                       &sdc);
   } else {
     addLogEntry(_("ERROR: already downloading `%s'"),
                idc_name);
   }
-  FREE(uri_name);
+  FREE(sdc.uri_name);
   FREE(dirPath);
-  FREE(idc_final_download_destination);
+  FREE(sdc.idc_final_download_destination);
   FREENONNULL(final_download_dir);
   FREENONNULL(idc_name);
   FREENONNULL(idc_mime);
@@ -683,36 +697,35 @@
  * TODO:
  * - support for recursive downloads
  * - support for user-specified filename
+ * - enable button only if valid URI is entered
  */
 void on_statusDownloadURIEntry_editing_done_fs(GtkWidget * entry,
                                               GtkWidget * downloadButton) {
-  struct ECRS_URI * idc_uri;
-  struct ECRS_MetaData * idc_meta;
-  char * idc_final_download_destination;
   const char * uris;
   char * urid;
   char * final_download_dir;
   const char * dname;
+  SDC sdc;
 
   uris = gtk_entry_get_text(GTK_ENTRY(entry));
   urid = STRDUP(uris);
   gtk_entry_set_text(GTK_ENTRY(entry),
                     ECRS_URI_PREFIX);
-  idc_uri = ECRS_stringToUri(ectx, urid);
-  if (idc_uri == NULL) {
+  sdc.idc_uri = ECRS_stringToUri(ectx, urid);
+  if (sdc.idc_uri == NULL) {
     addLogEntry(_("Invalid URI `%s'"), urid);
     FREE(urid);
     return;
   }
-  if (ECRS_isKeywordUri(idc_uri)) {
+  if (ECRS_isKeywordUri(sdc.idc_uri)) {
     addLogEntry(_("Please use the search function for keyword (KSK) URIs!"));
     FREE(urid);
-    ECRS_freeUri(idc_uri);
+    ECRS_freeUri(sdc.idc_uri);
     return;
-  } else if (ECRS_isLocationUri(idc_uri)) {
+  } else if (ECRS_isLocationUri(sdc.idc_uri)) {
     addLogEntry(_("Location URIs are not yet supported"));
     FREE(urid);
-    ECRS_freeUri(idc_uri);
+    ECRS_freeUri(sdc.idc_uri);
     return;
   }
   GC_get_configuration_value_filename(cfg,
@@ -722,26 +735,28 @@
                                      &final_download_dir);
   disk_directory_create(ectx, final_download_dir);
   dname = &uris[strlen(ECRS_URI_PREFIX) + strlen(ECRS_FILE_INFIX)];
-  idc_final_download_destination = MALLOC(strlen(final_download_dir) + 
strlen(dname) + 2);
-  strcpy(idc_final_download_destination, final_download_dir);
+  sdc.idc_final_download_destination = MALLOC(strlen(final_download_dir) + 
strlen(dname) + 2);
+  strcpy(sdc.idc_final_download_destination, 
+        final_download_dir);
   FREE(final_download_dir);
-  if (idc_final_download_destination[strlen(idc_final_download_destination)] 
!= DIR_SEPARATOR)
-    strcat(idc_final_download_destination, DIR_SEPARATOR_STR);
-  strcat(idc_final_download_destination, dname);
+  if 
(sdc.idc_final_download_destination[strlen(sdc.idc_final_download_destination)] 
!= DIR_SEPARATOR)
+    strcat(sdc.idc_final_download_destination, 
+          DIR_SEPARATOR_STR);
+  strcat(sdc.idc_final_download_destination,
+        dname);
 
   addLogEntry(_("Downloading `%s'"), 
              uris);
-  idc_meta = ECRS_createMetaData();
-  FSUI_startDownload(ctx,
-                    getSpinButtonValue(getMainXML(),
-                                       "fsstatusAnonymitySpin"),
-                    NO, /* FIXME: isRecursive */
-                    idc_uri,
-                    idc_meta,
-                    idc_final_download_destination,
-                    NULL,
-                    NULL);
-  ECRS_freeMetaData(idc_meta);
+  sdc.idc_meta = ECRS_createMetaData();
+  sdc.anonymity = getSpinButtonValue(getMainXML(),
+                                    "fsstatusAnonymitySpin");
+  sdc.recursive = NO; 
+  sdc.searchContext = NULL;
+  sdc.parentContext = NULL;
+  run_with_save_calls(&init_download_helper,
+                     &sdc);
+  ECRS_freeMetaData(sdc.idc_meta);
+  FREE(sdc.idc_final_download_destination);
   FREE(urid);
 }
 

Modified: gnunet-gtk/src/plugins/fs/search.c
===================================================================
--- gnunet-gtk/src/plugins/fs/search.c  2006-12-10 05:58:37 UTC (rev 3908)
+++ gnunet-gtk/src/plugins/fs/search.c  2006-12-10 06:27:55 UTC (rev 3909)
@@ -511,14 +511,30 @@
                           strlen(searchString) > 0);
 }
 
+typedef struct {
+  unsigned int anonymity;
+  unsigned int max;
+  cron_t delay;
+  struct ECRS_URI * uri;
+} FSSS;
 
+static void * search_start_helper(void * cls) {
+  FSSS * fsss;
+  FSUI_startSearch(ctx,
+                  fsss->anonymity,
+                  fsss->max,
+                  fsss->delay,
+                  fsss->uri);
+  return NULL;
+}
+
 /**
  * The user has clicked the "SEARCH" button.
  * Initiate a search.
  */
 void on_fssearchbutton_clicked_fs(gpointer dummy2,
                                  GtkWidget * searchButton) {
-  struct ECRS_URI * uri;
+  FSSS fsss;
   const char * searchString;
   gint pages;
   gint i;
@@ -554,7 +570,7 @@
                       0, searchString,
                       -1);
   }
-  uri = NULL;
+  fsss.uri = NULL;
   /* check for namespace search */
   searchNamespaceGtkCB
     = glade_xml_get_widget(getMainXML(),
@@ -593,8 +609,8 @@
       strcat(ustring, ns);
       strcat(ustring, "/");
       strcat(ustring, searchString);
-      uri = ECRS_stringToUri(ectx, ustring);
-      if (uri == NULL) {
+      fsss.uri = ECRS_stringToUri(ectx, ustring);
+      if (fsss.uri == NULL) {
        GE_LOG(ectx,
               GE_ERROR | GE_BULK | GE_USER,
               _("Failed to create namespace URI from `%s'.\n"),
@@ -607,9 +623,9 @@
     if (ns != NULL)
       free(ns);
   }
-  if (uri == NULL)
-    uri = ECRS_parseCharKeywordURI(ectx, searchString);
-  if (uri == NULL) {
+  if (fsss.uri == NULL)
+    fsss.uri = ECRS_parseCharKeywordURI(ectx, searchString);
+  if (fsss.uri == NULL) {
     GE_BREAK(ectx, 0);
     return;
   }
@@ -621,14 +637,14 @@
   list = search_head;
   while (list != NULL) {
     if (ECRS_equalsUri(list->uri,
-                      uri)) {
+                      fsss.uri)) {
       for (i=0;i<pages;i++) {
        if (gtk_notebook_get_nth_page(notebook,
                                      i)
            == list->searchpage) {
          gtk_notebook_set_current_page(notebook,
                                        i);
-         ECRS_freeUri(uri);
+         ECRS_freeUri(fsss.uri);
          return;
        }
       }
@@ -636,16 +652,15 @@
     }
     list = list->next;
   }
-  /* FIXME: deadlock! */
-  FSUI_startSearch(ctx,
-                  getSpinButtonValue(getMainXML(),
-                                     "searchAnonymitySelectionSpinButton"),    
-                  getSpinButtonValue(getMainXML(),
-                                     "maxResultsSpinButton"),  
-                  getSpinButtonValue(getMainXML(),
-                                     "searchDelaySpinButton") * cronSECONDS,
-                  uri);
-  ECRS_freeUri(uri);
+  fsss.anonymity = getSpinButtonValue(getMainXML(),
+                                     "searchAnonymitySelectionSpinButton");
+  fsss.max = getSpinButtonValue(getMainXML(),
+                               "maxResultsSpinButton");
+  fsss.delay = getSpinButtonValue(getMainXML(),
+                                 "searchDelaySpinButton") * cronSECONDS;
+  run_with_save_calls(search_start_helper,
+                     &fsss);
+  ECRS_freeUri(fsss.uri);
 }
 
 struct FCBC {

Modified: gnunet-gtk/src/plugins/fs/upload.c
===================================================================
--- gnunet-gtk/src/plugins/fs/upload.c  2006-12-10 05:58:37 UTC (rev 3908)
+++ gnunet-gtk/src/plugins/fs/upload.c  2006-12-10 06:27:55 UTC (rev 3909)
@@ -316,16 +316,48 @@
                           strlen(input) > 0);
 }
 
+typedef struct {
+  const char * filename;
+  unsigned int anonymity;
+  unsigned int priority;
+  int index;
+  int extract;
+  int deep_index;
+  cron_t expire;
+  struct ECRS_MetaData * meta;
+  struct ECRS_URI * gkeywordURI;
+  struct ECRS_URI * keywordURI;
+} FSUC;
+
+static void * start_upload_helper(void * cls) {
+  FSUC * fsuc = cls;
+  
+  FSUI_startUpload(ctx,
+                  fsuc->filename,
+                  (DirectoryScanCallback) &disk_directory_scan,
+                  ectx,
+                  fsuc->anonymity,
+                  fsuc->priority,
+                  fsuc->index,
+                  fsuc->extract,
+                  fsuc->deep_index,
+                  fsuc->expire,
+                  fsuc->meta,
+                  fsuc->gkeywordURI,
+                  fsuc->keywordURI);
+  return NULL;
+}
+
+
 void on_fsinsertuploadbutton_clicked_fs(gpointer dummy,
                                        GtkWidget * uploadButton) {
+  FSUC fsuc;
   const char * filenamerest;
-  const char * filename;
   GtkWidget * dialog;
   EXTRACTOR_ExtractorList * extractors;
   char * config;
+  struct ECRS_MetaData * meta;
   struct ECRS_URI * keywordURI;
-  struct ECRS_URI * gkeywordURI;
-  struct ECRS_MetaData * meta;
 
   extractors = EXTRACTOR_loadDefaultLibraries();
   config = NULL;
@@ -340,8 +372,8 @@
     FREE(config);
   }
 
-  filename = getEntryLineValue(getMainXML(),
-                              "uploadFilenameComboBoxEntry");
+  fsuc.filename = getEntryLineValue(getMainXML(),
+                                   "uploadFilenameComboBoxEntry");
   metaXML
     = glade_xml_new(getGladeFileName(),
                    "metaDataDialog",
@@ -352,11 +384,11 @@
   meta = ECRS_createMetaData();
   ECRS_extractMetaData(ectx,
                       meta,
-                      filename,
+                      fsuc.filename,
                       extractors);
   EXTRACTOR_removeAll(extractors);
-  filenamerest = &filename[strlen(filename)-1];
-  while ( (filenamerest > filename) &&
+  filenamerest = &fsuc.filename[strlen(fsuc.filename)-1];
+  while ( (filenamerest > fsuc.filename) &&
          (filenamerest[-1] != DIR_SEPARATOR) )
     filenamerest--;
   ECRS_addToMetaData(meta,
@@ -397,36 +429,30 @@
   gtk_dialog_set_default_response(GTK_DIALOG(dialog),
                                  GTK_RESPONSE_OK);
   if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL) {
-    meta = getMetaDataFromList(metaXML,
-                              "metaDataDialogMetaDataList",
-                              "previewImage");
-    keywordURI = getKeywordURIFromList(metaXML,
+    fsuc.anonymity = getSpinButtonValue(getMainXML(),
+                                       "uploadAnonymityLevelSpinButton");
+    fsuc.priority = getSpinButtonValue(getMainXML(),
+                                      "contentPrioritySpinButton");
+    fsuc.index = getToggleButtonValue(getMainXML(),
+                                     "indexbutton");
+    fsuc.extract = getToggleButtonValue(getMainXML(),
+                                       "doExtractCheckButton");
+    fsuc.deep_index = getToggleButtonValue(getMainXML(),
+                                          "deepIndexCheckButton");
+    fsuc.expire = get_time() + 2 * cronYEARS;
+    fsuc.meta = getMetaDataFromList(metaXML,
+                                   "metaDataDialogMetaDataList",
+                                   "previewImage");
+    fsuc.keywordURI = getKeywordURIFromList(metaXML,
                                       "metaDataDialogKeywordList");
-    gkeywordURI = ECRS_stringToUri(ectx,
+    fsuc.gkeywordURI = ECRS_stringToUri(ectx,
                                   ECRS_URI_PREFIX
                                   ECRS_SEARCH_INFIX);
-    /* FIXME: DEADLOCK! */
-    FSUI_startUpload(ctx,
-                    filename,
-                    (DirectoryScanCallback) &disk_directory_scan,
-                    ectx,
-                    getSpinButtonValue(getMainXML(),
-                                       "uploadAnonymityLevelSpinButton"),
-                    getSpinButtonValue(getMainXML(),
-                                       "contentPrioritySpinButton"),
-                    getToggleButtonValue(getMainXML(),
-                                         "indexbutton"),
-                    getToggleButtonValue(getMainXML(),
-                                         "doExtractCheckButton"),
-                    getToggleButtonValue(getMainXML(),
-                                         "deepIndexCheckButton"),
-                    get_time() + 2 * cronYEARS,
-                    meta,
-                    gkeywordURI,
-                    keywordURI);
-    ECRS_freeMetaData(meta);
-    ECRS_freeUri(gkeywordURI);
-    ECRS_freeUri(keywordURI);
+    run_with_save_calls(&start_upload_helper,
+                       &fsuc);
+    ECRS_freeMetaData(fsuc.meta);
+    ECRS_freeUri(fsuc.gkeywordURI);
+    ECRS_freeUri(fsuc.keywordURI);
   }
   gtk_widget_destroy (dialog);
   UNREF(metaXML);





reply via email to

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