diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-05-04 15:48:39 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-05-04 15:48:39 +0000 |
commit | 3d43fe27b2927c6d99384b23eb19bc00641dc6f3 (patch) | |
tree | a416eb20c7af61b1f54235d50124e90365b70579 /src/fs/fs_search.c | |
parent | 8fee5bde3e7fd7655c514d4035d57550fa4e28f2 (diff) | |
download | gnunet-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.c | 81 |
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 | */ |
468 | static struct GNUNET_FS_SearchContext * | 468 | static 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 | */ |
1070 | static struct GNUNET_FS_SearchContext * | 1068 | static 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 | */ | ||
1241 | static void | ||
1242 | search_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 | |||
1279 | search_signal_suspend (void *cls) | 1293 | search_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); |