Пример #1
0
void
removepeer(int index, peer_t *peer, char do_compact)
{
	hash_info_t	*hashinfo = &hash_table->entry[index];
	int		i, j;

#ifdef	DEBUG
{
	struct in_addr	in;

	in.s_addr = peer->ip;
	fprintf(stderr, "removepeer:removing peer (%s) for hash (0x%016llx)\n",
		inet_ntoa(in), hashinfo->hash);
}
#endif

	for (i = 0; i < hashinfo->numpeers; ++i) {
		if (hashinfo->peers[i].ip == peer->ip) {
			if (hashinfo->numpeers == 1) {
				/*
				 * do the easy case first
				 */
				free(hashinfo->peers);

				hashinfo->peers = NULL;
				hashinfo->hash = 0;
				hashinfo->numpeers = 0;

				if (do_compact) {
					compact_hash_table();
					reclaim_free_entries();
				}
			} else {
				/*
				 * remove the peer by compacting all subsequent
				 * peers
				 */
				for (j = i; j < hashinfo->numpeers - 1; ++j) {
					memcpy(&hashinfo->peers[j],
						&hashinfo->peers[j+1],
						sizeof(*peer));
				}

				/*
				 * zero out the last entry
				 */
				bzero(&hashinfo->peers[hashinfo->numpeers-1],
					sizeof(*peer));

				--hashinfo->numpeers;
			}

			break;
		}
	}

	return;
}
Пример #2
0
void
unregister_all(char *buf, struct sockaddr_in *from_addr)
{
	peer_t		peer;
	int		i;

#ifdef	DEBUG
	fprintf(stderr, "unregister_all:enter\n");
	fprintf(stderr, "unregister_all:hash_table:before\n\n");
	print_hash_table();
#endif

	peer.ip = from_addr->sin_addr.s_addr;

	if (hash_table->head >= hash_table->tail) {
		for (i = hash_table->head - 1;
				(i > hash_table->tail) && (i >= 0) ; --i) {
			removepeer(i, &peer, 0);
		}
	} else {
		for (i = hash_table->head - 1; i >= 0 ; --i) {
			removepeer(i, &peer, 0);
		}

		for (i = (hash_table->size - 1) ;
				(i > hash_table->tail) && (i >= 0) ; --i) {
			removepeer(i, &peer, 0);
		}
	}

	compact_hash_table();
	reclaim_free_entries();

	clear_dt_table_entry(peer.ip);

#ifdef	DEBUG
	fprintf(stderr, "unregister_all:hash_table:after\n\n");
	print_hash_table();
#endif

}
int compact_persistent_script(zend_persistent_script *persistent_script)
{
	return compact_hash_table(&persistent_script->function_table) &&
	       compact_hash_table(&persistent_script->class_table);
}