aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_search.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-05-04 15:48:39 +0000
committerChristian Grothoff <christian@grothoff.org>2010-05-04 15:48:39 +0000
commit3d43fe27b2927c6d99384b23eb19bc00641dc6f3 (patch)
treea416eb20c7af61b1f54235d50124e90365b70579 /src/fs/fs_search.c
parent8fee5bde3e7fd7655c514d4035d57550fa4e28f2 (diff)
downloadgnunet-3d43fe27b2927c6d99384b23eb19bc00641dc6f3.tar.gz
gnunet-3d43fe27b2927c6d99384b23eb19bc00641dc6f3.zip
fixing mess with search update serialization and parenting
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r--src/fs/fs_search.c81
1 files changed, 41 insertions, 40 deletions
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c
index 8c324252f..9f62e04b1 100644
--- a/src/fs/fs_search.c
+++ b/src/fs/fs_search.c
@@ -53,7 +53,7 @@ GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
53 pi->value.search.cctx 53 pi->value.search.cctx
54 = sc->client_info; 54 = sc->client_info;
55 pi->value.search.pctx 55 pi->value.search.pctx
56 = (sc->parent == NULL) ? NULL : sc->parent->client_info; 56 = (sc->psearch_result == NULL) ? NULL : sc->psearch_result->client_info;
57 pi->value.search.query 57 pi->value.search.query
58 = sc->uri; 58 = sc->uri;
59 pi->value.search.duration = GNUNET_TIME_absolute_get_duration (sc->start_time); 59 pi->value.search.duration = GNUNET_TIME_absolute_get_duration (sc->start_time);
@@ -462,7 +462,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc,
462 * @param anonymity desired level of anonymity 462 * @param anonymity desired level of anonymity
463 * @param options options for the search 463 * @param options options for the search
464 * @param cctx client context 464 * @param cctx client context
465 * @param parent parent search (for namespace update searches) 465 * @param psearch parent search result (for namespace update searches)
466 * @return context that can be used to control the search 466 * @return context that can be used to control the search
467 */ 467 */
468static struct GNUNET_FS_SearchContext * 468static struct GNUNET_FS_SearchContext *
@@ -471,7 +471,7 @@ search_start (struct GNUNET_FS_Handle *h,
471 uint32_t anonymity, 471 uint32_t anonymity,
472 enum GNUNET_FS_SearchOptions options, 472 enum GNUNET_FS_SearchOptions options,
473 void *cctx, 473 void *cctx,
474 struct GNUNET_FS_SearchContext *parent); 474 struct GNUNET_FS_SearchResult *psearch);
475 475
476 476
477/** 477/**
@@ -523,14 +523,12 @@ process_sks_result (struct GNUNET_FS_SearchContext *sc,
523 uu.type = sks; 523 uu.type = sks;
524 uu.data.sks.namespace = sc->uri->data.sks.namespace; 524 uu.data.sks.namespace = sc->uri->data.sks.namespace;
525 uu.data.sks.identifier = GNUNET_strdup (id_update); 525 uu.data.sks.identifier = GNUNET_strdup (id_update);
526 /* FIXME: should attach update search to the individual result, not 526 (void) search_start (sc->h,
527 the entire SKS search! */ 527 &uu,
528 search_start (sc->h, 528 sc->anonymity,
529 &uu, 529 sc->options,
530 sc->anonymity, 530 NULL,
531 sc->options, 531 sr);
532 NULL,
533 sc);
534} 532}
535 533
536 534
@@ -1064,7 +1062,7 @@ try_reconnect (struct GNUNET_FS_SearchContext *sc)
1064 * @param anonymity desired level of anonymity 1062 * @param anonymity desired level of anonymity
1065 * @param options options for the search 1063 * @param options options for the search
1066 * @param cctx initial value for the client context 1064 * @param cctx initial value for the client context
1067 * @param parent parent search (for namespace update searches) 1065 * @param psearch parent search result (for namespace update searches)
1068 * @return context that can be used to control the search 1066 * @return context that can be used to control the search
1069 */ 1067 */
1070static struct GNUNET_FS_SearchContext * 1068static struct GNUNET_FS_SearchContext *
@@ -1073,7 +1071,7 @@ search_start (struct GNUNET_FS_Handle *h,
1073 uint32_t anonymity, 1071 uint32_t anonymity,
1074 enum GNUNET_FS_SearchOptions options, 1072 enum GNUNET_FS_SearchOptions options,
1075 void *cctx, 1073 void *cctx,
1076 struct GNUNET_FS_SearchContext *parent) 1074 struct GNUNET_FS_SearchResult *psearch)
1077{ 1075{
1078 struct GNUNET_FS_SearchContext *sc; 1076 struct GNUNET_FS_SearchContext *sc;
1079 struct GNUNET_FS_ProgressInfo pi; 1077 struct GNUNET_FS_ProgressInfo pi;
@@ -1084,13 +1082,13 @@ search_start (struct GNUNET_FS_Handle *h,
1084 sc->uri = GNUNET_FS_uri_dup (uri); 1082 sc->uri = GNUNET_FS_uri_dup (uri);
1085 sc->anonymity = anonymity; 1083 sc->anonymity = anonymity;
1086 sc->start_time = GNUNET_TIME_absolute_get (); 1084 sc->start_time = GNUNET_TIME_absolute_get ();
1087 sc->parent = parent; 1085 if (psearch != NULL)
1086 {
1087 sc->psearch_result = psearch;
1088 psearch->update_search = sc;
1089 }
1088 sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16); 1090 sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16);
1089 sc->client_info = cctx; 1091 sc->client_info = cctx;
1090 if (NULL != parent)
1091 GNUNET_CONTAINER_DLL_insert (parent->child_head,
1092 parent->child_tail,
1093 sc);
1094 if (GNUNET_OK != 1092 if (GNUNET_OK !=
1095 GNUNET_FS_search_start_searching_ (sc)) 1093 GNUNET_FS_search_start_searching_ (sc))
1096 { 1094 {
@@ -1206,6 +1204,8 @@ search_result_freeze_probes (void *cls,
1206 sr->probe_cancel_task); 1204 sr->probe_cancel_task);
1207 sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; 1205 sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK;
1208 } 1206 }
1207 if (sr->update_search != NULL)
1208 GNUNET_FS_search_pause (sr->update_search);
1209 return GNUNET_OK; 1209 return GNUNET_OK;
1210} 1210}
1211 1211
@@ -1226,11 +1226,23 @@ search_result_resume_probes (void *cls,
1226 struct GNUNET_FS_SearchResult *sr = value; 1226 struct GNUNET_FS_SearchResult *sr = value;
1227 1227
1228 GNUNET_FS_search_start_probe_ (sr); 1228 GNUNET_FS_search_start_probe_ (sr);
1229 if (sr->update_search != NULL)
1230 GNUNET_FS_search_continue (sr->update_search);
1229 return GNUNET_OK; 1231 return GNUNET_OK;
1230} 1232}
1231 1233
1232 1234
1233/** 1235/**
1236 * Create SUSPEND event for the given search operation
1237 * and then clean up our state (without stop signal).
1238 *
1239 * @param cls the 'struct GNUNET_FS_SearchContext' to signal for
1240 */
1241static void
1242search_signal_suspend (void *cls);
1243
1244
1245/**
1234 * Signal suspend and free the given search result. 1246 * Signal suspend and free the given search result.
1235 * 1247 *
1236 * @param cls the global FS handle 1248 * @param cls the global FS handle
@@ -1250,6 +1262,8 @@ search_result_suspend (void *cls,
1250 1262
1251 if (sr->download != NULL) 1263 if (sr->download != NULL)
1252 GNUNET_FS_download_signal_suspend_ (sr->download); 1264 GNUNET_FS_download_signal_suspend_ (sr->download);
1265 if (sr->update_search != NULL)
1266 search_signal_suspend (sr->update_search);
1253 pi.status = GNUNET_FS_STATUS_SEARCH_RESULT_SUSPEND; 1267 pi.status = GNUNET_FS_STATUS_SEARCH_RESULT_SUSPEND;
1254 pi.value.search.specifics.result_suspend.cctx = sr->client_info; 1268 pi.value.search.specifics.result_suspend.cctx = sr->client_info;
1255 pi.value.search.specifics.result_suspend.meta = sr->meta; 1269 pi.value.search.specifics.result_suspend.meta = sr->meta;
@@ -1279,20 +1293,10 @@ static void
1279search_signal_suspend (void *cls) 1293search_signal_suspend (void *cls)
1280{ 1294{
1281 struct GNUNET_FS_SearchContext *sc = cls; 1295 struct GNUNET_FS_SearchContext *sc = cls;
1282 struct GNUNET_FS_SearchContext *parent = cls;
1283 struct GNUNET_FS_ProgressInfo pi; 1296 struct GNUNET_FS_ProgressInfo pi;
1284 unsigned int i; 1297 unsigned int i;
1285 1298
1286 GNUNET_FS_end_top (sc->h, sc->top); 1299 GNUNET_FS_end_top (sc->h, sc->top);
1287 if (NULL != (parent = sc->parent))
1288 {
1289 GNUNET_CONTAINER_DLL_remove (parent->child_head,
1290 parent->child_tail,
1291 sc);
1292 sc->parent = NULL;
1293 }
1294 while (NULL != sc->child_head)
1295 search_signal_suspend (sc->child_head);
1296 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, 1300 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
1297 &search_result_suspend, 1301 &search_result_suspend,
1298 sc); 1302 sc);
@@ -1426,6 +1430,11 @@ search_result_free (void *cls,
1426 GNUNET_FS_download_sync_ (sr->download); 1430 GNUNET_FS_download_sync_ (sr->download);
1427 sr->download = NULL; 1431 sr->download = NULL;
1428 } 1432 }
1433 if (NULL != sr->update_search)
1434 {
1435 GNUNET_FS_search_stop (sr->update_search);
1436 GNUNET_assert (sr->update_search == NULL);
1437 }
1429 pi.status = GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED; 1438 pi.status = GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED;
1430 pi.value.search.specifics.result_stopped.cctx = sr->client_info; 1439 pi.value.search.specifics.result_stopped.cctx = sr->client_info;
1431 pi.value.search.specifics.result_stopped.meta = sr->meta; 1440 pi.value.search.specifics.result_stopped.meta = sr->meta;
@@ -1455,31 +1464,23 @@ GNUNET_FS_search_stop (struct GNUNET_FS_SearchContext *sc)
1455{ 1464{
1456 struct GNUNET_FS_ProgressInfo pi; 1465 struct GNUNET_FS_ProgressInfo pi;
1457 unsigned int i; 1466 unsigned int i;
1458 struct GNUNET_FS_SearchContext *parent;
1459 1467
1460 if (sc->top != NULL) 1468 if (sc->top != NULL)
1461 GNUNET_FS_end_top (sc->h, sc->top); 1469 GNUNET_FS_end_top (sc->h, sc->top);
1462 if (NULL != (parent = sc->parent)) 1470 if (sc->psearch_result != NULL)
1463 { 1471 sc->psearch_result->update_search = NULL;
1464 GNUNET_CONTAINER_DLL_remove (parent->child_head,
1465 parent->child_tail,
1466 sc);
1467 sc->parent = NULL;
1468 }
1469 while (NULL != sc->child_head)
1470 GNUNET_FS_search_stop (sc->child_head);
1471 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map, 1472 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
1472 &search_result_free, 1473 &search_result_free,
1473 sc); 1474 sc);
1474 if (sc->serialization != NULL) 1475 if (sc->serialization != NULL)
1475 { 1476 {
1476 GNUNET_FS_remove_sync_file_ (sc->h, 1477 GNUNET_FS_remove_sync_file_ (sc->h,
1477 (sc->parent != NULL) 1478 (sc->psearch_result != NULL)
1478 ? GNUNET_FS_SYNC_PATH_CHILD_SEARCH 1479 ? GNUNET_FS_SYNC_PATH_CHILD_SEARCH
1479 : GNUNET_FS_SYNC_PATH_MASTER_SEARCH, 1480 : GNUNET_FS_SYNC_PATH_MASTER_SEARCH,
1480 sc->serialization); 1481 sc->serialization);
1481 GNUNET_FS_remove_sync_dir_ (sc->h, 1482 GNUNET_FS_remove_sync_dir_ (sc->h,
1482 (sc->parent != NULL) 1483 (sc->psearch_result != NULL)
1483 ? GNUNET_FS_SYNC_PATH_CHILD_SEARCH 1484 ? GNUNET_FS_SYNC_PATH_CHILD_SEARCH
1484 : GNUNET_FS_SYNC_PATH_MASTER_SEARCH, 1485 : GNUNET_FS_SYNC_PATH_MASTER_SEARCH,
1485 sc->serialization); 1486 sc->serialization);