static LocatorNode_t *locator_new_node (LocatorKind_t kind, const unsigned char *addr, uint32_t port) { LocSearchData data; LocatorNode_t **npp, *np; int is_new; data.kind = kind; data.addr = addr; data.port = port; npp = sl_insert (&loc_list, &data, &is_new, loc_cmp); if (!npp) { warn_printf ("locator_new_node: not enough memory for node!"); return (NULL); } if (is_new) { np = mds_pool_alloc (&mem_blocks [MB_LOCATOR]); if (!np) { warn_printf ("locator_new_node: not enough memory for locator data!"); #ifdef LIST_DELETE_NODE sl_delete_node (&loc_list, npp); #else sl_delete (&loc_list, &data, loc_cmp); #endif return (NULL); } np->users = 1; np->locator.kind = kind; np->locator.port = port; memcpy (np->locator.address, addr, sizeof (np->locator.address)); memset (&np->locator.scope_id, 0, 8); *npp = np; } else { np = *npp; np->users++; } return (np); }
int main( int argc, char **argv ) { sl_List sl; int count; int i; maa_init( argv[0] ); if (argc == 1) { count = 10; } else if (argc != 2 ) { fprintf( stderr, "usage: sltest count\n" ); return 1; } else { count = atoi( argv[1] ); } printf( "Running test for count of %d\n", count ); sl = sl_create( compare, key, NULL ); for (i = 1; i < count; i++) { printf( "adding %d\n", i ); sl_insert( sl, (void *) (intptr_t) i ); #ifdef DUMP _sl_dump( sl ); #endif } sl_iterate( sl, print ); printf( "\n" ); sl_delete( sl, (void *)5 ); sl_iterate( sl, print ); printf( "\n" ); sl_insert( sl, (void *)0 ); sl_iterate( sl, print ); printf( "\n" ); sl_insert( sl, (void *)66 ); sl_iterate( sl, print ); printf( "\n" ); sl_insert( sl, (void *)100 ); sl_iterate( sl, print ); printf( "\n" ); sl_insert( sl, (void *)-1 ); sl_iterate( sl, print ); printf( "\n" ); sl_insert( sl, (void *)5 ); sl_iterate( sl, print ); printf( "\n" ); sl_insert( sl, (void *)67 ); sl_iterate( sl, print ); printf( "\n" ); sl_insert( sl, (void *)68 ); sl_iterate( sl,print ); printf( "\n" ); sl_insert( sl, (void *)65 ); sl_iterate( sl, print ); printf( "\n" ); sl_destroy( sl ); return 0; }
LocatorNode_t *locator_list_add (LocatorList_t *list, LocatorKind_t kind, const unsigned char *addr, uint32_t port, uint32_t scope_id, Scope_t scope, unsigned flags, unsigned sproto) { LocSearchData data; LocatorNode_t **npp, *np; LocatorRef_t *rp, *p; int is_new; data.kind = kind; data.addr = addr; data.port = port; lock_take (loc_lock); npp = sl_insert (&loc_list, &data, &is_new, loc_cmp); if (!npp) { warn_printf ("locator_list_add: not enough memory for list node!"); lock_release (loc_lock); return (NULL); } if (is_new) { np = mds_pool_alloc (&mem_blocks [MB_LOCATOR]); if (!np) { warn_printf ("locator_list_add: not enough memory for locator node!"); #ifdef LIST_DELETE_NODE sl_delete_node (&loc_list, npp); #else sl_delete (&loc_list, &data, loc_cmp); #endif lock_release (loc_lock); return (NULL); } np->users = 0; np->locator.kind = kind; np->locator.port = port; memcpy (np->locator.address, addr, sizeof (np->locator.address)); np->locator.scope_id = scope_id; np->locator.scope = scope; np->locator.flags = flags; np->locator.sproto = sproto; np->locator.intf = 0; np->locator.handle = 0; *npp = np; } else { np = *npp; if (np->locator.scope_id != scope_id || (np->locator.scope && scope && np->locator.scope != scope) || /*(np->locator.flags && flags && (np->locator.flags & LOCF_MFLAGS) != (flags & LOCF_MFLAGS)) ||*/ (np->locator.sproto && sproto && np->locator.sproto != sproto)) log_printf (LOC_ID, 0, "locator_list_add: incompatible locator attributes for %s, " "%u:%u, %u:%u, 0x%x:0x%x, %u:%u!\r\n", locator_str (&np->locator), np->locator.scope_id, scope_id, np->locator.scope, scope, np->locator.flags, flags, np->locator.sproto, sproto); if (!np->locator.scope_id && scope_id) np->locator.scope_id = scope_id; if (!np->locator.scope && scope) np->locator.scope = scope; if (flags && np->locator.flags != flags) np->locator.flags |= flags; if (!np->locator.sproto && sproto) np->locator.sproto = sproto; /* Check if already in list. */ for (rp = *list; rp; rp = rp->next) if (rp->data == np) { /* Already there! */ lock_release (loc_lock); return (0); } } #ifdef LOG_LOCATORS log_printf (LOC_ID, 0, "LOC: locator_list_add (list=%p, %s)\r\n", (void *) list, locator_str (&np->locator)); #endif rp = mds_pool_alloc (&mem_blocks [MB_LOCREF]); if (!rp) { warn_printf ("locator_list_add: not enough memory for locator reference!\r\n"); if (is_new) { mds_pool_free (&mem_blocks [MB_LOCATOR], np); #ifdef LIST_DELETE_NODE sl_delete_node (&loc_list, npp); #else sl_delete (&loc_list, &data, loc_cmp); #endif } lock_release (loc_lock); return (NULL); } rp->next = NULL; rp->data = np; np->users++; lock_release (loc_lock); if (*list) { for (p = *list; p->next; p = p->next) ; p->next = rp; } else *list = rp; return (np); }