void request_tigertree(shared_file_t *sf, bool high_priority) { int inserted; verify_tth_init(); shared_file_check(sf); g_return_if_fail(shared_file_is_finished(sf)); if (!shared_file_is_servable(sf)) return; /* "stale" shared file, has been superseded or removed */ /* * This routine can be called when the VERIFY_DONE event is received by * huge_verify_callback(). We may have already shutdown the TTH * verification thread. */ if G_UNLIKELY(NULL == verify_tth.verify) return; sf = shared_file_ref(sf); inserted = verify_enqueue(verify_tth.verify, high_priority, shared_file_path(sf), 0, shared_file_size(sf), request_tigertree_callback, sf); if (!inserted) shared_file_unref(&sf); }
/** * Put the shared file on the stack of the things to do. * * We first begin with the computation of the SHA1, and when completed we * will continue with the TTH computation. */ static void queue_shared_file_for_sha1_computation(shared_file_t *sf) { int inserted; shared_file_check(sf); inserted = verify_sha1_enqueue(FALSE, shared_file_path(sf), shared_file_size(sf), huge_verify_callback, shared_file_ref(sf)); if (!inserted) shared_file_unref(&sf); }
void request_tigertree(shared_file_t *sf, bool high_priority) { int inserted; verify_tth_init(); g_return_if_fail(sf); shared_file_check(sf); g_return_if_fail(!shared_file_is_partial(sf)); sf = shared_file_ref(sf); inserted = verify_enqueue(verify_tth.verify, high_priority, shared_file_path(sf), 0, shared_file_size(sf), request_tigertree_callback, sf); if (!inserted) shared_file_unref(&sf); }
/** * Insert an item into the search_table * one-char strings are silently ignored. * * @return TRUE if the item was inserted; FALSE otherwise. */ gboolean st_insert_item(search_table_t *table, const char *s, const shared_file_t *sf) { size_t i, len; struct st_entry *entry; GHashTable *seen_keys; len = utf8_char_count(s); if ((size_t) -1 == len || len < 2) return FALSE; seen_keys = g_hash_table_new(NULL, NULL); WALLOC(entry); entry->string = atom_str_get(s); entry->sf = shared_file_ref(sf); entry->mask = mask_hash(entry->string); len = strlen(entry->string); for (i = 0; i < len - 1; i++) { int key = st_key(table, &entry->string[i]); /* don't insert item into same bin twice */ if (g_hash_table_lookup(seen_keys, GINT_TO_POINTER(key))) continue; g_hash_table_insert(seen_keys, GINT_TO_POINTER(key), GINT_TO_POINTER(1)); g_assert(key < table->nbins); if (table->bins[key] == NULL) table->bins[key] = bin_allocate(); bin_insert_item(table->bins[key], entry); } bin_insert_item(&table->all_entries, entry); table->nentries++; g_hash_table_destroy(seen_keys); return TRUE; }