/* Thread destructor used to free stuff stored in per-thread data slot. */ static void thread_destructor(CYG_ADDRWORD data) { struct hostent *hent; hent = (struct hostent *)cyg_thread_get_data(ptdindex); if (hent) free_hent(hent); return; data=data; }
/* If there is an answer to an old query, free the memory it uses. */ static void free_stored_hent(void) { struct hostent *hent; hent = (struct hostent *)cyg_thread_get_data(ptdindex); if (hent) { free_hent(hent); cyg_thread_set_data(ptdindex, (CYG_ADDRWORD)NULL); cyg_thread_rem_destructor( &thread_destructor, 0 ); } }
/* Allocate hent structure with room for one in_addr. Returns NULL on failure. */ static struct hostent* alloc_hent(void) { struct hostent *hent; hent = malloc(sizeof(struct hostent)); if (hent) { memset(hent, 0, sizeof(struct hostent)); hent->h_addr_list = malloc(sizeof(char *)*2); if (!hent->h_addr_list) { free_hent(hent); return NULL; } hent->h_addr_list[0] = malloc(sizeof(struct in_addr)); if (!hent->h_addr_list[0]) { free_hent(hent); return NULL; } hent->h_addr_list[1] = NULL; } return hent; }
static __inline__ void free_stored_hent(void) { free_hent( &_hent ); }