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; }
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); }