Ejemplo n.º 1
0
static addrMapNode* getNode(void* addr)
{
	addrMapNode n;
	n.chunk.addr = (u8*)addr;
	auto p = rbtree_find(&sAddrMap, &n.node);
	return p ? getAddrMapNode(p) : nullptr;
}
Ejemplo n.º 2
0
void
rbtree_insert(struct rbtree *tree, struct rbtree_elem *elem)
{
  rbnode_t root;

  //rbtree_inorder_check(tree) ;
  root = tree->root;
#if 0
  if (node = rbtree_find(tree, elem)) {
    //rbtree_inorder_check(tree) ;
    return false;
  }
#endif

  //rbtree_inorder_check(tree) ;
  elem->left = elem->right = elem->parent = nil;
  elem->color = _RED_;

  node_insert(&tree->root, elem, tree->less, tree->aux);

  //if (node->parent!=nil && node->parent->left==node) ASSERT(node->high<node->parent->low) ;
  //if (node->parent!=nil && node->parent->right==node) ASSERT(node->low>node->parent->high) ;
  //if (node->right!=nil) ASSERT(node->high<node->right->low) ;
  //if (node->left!=nil) ASSERT(node->low>node->left->high) ;
  //rbtree_inorder_check(tree);
}
Ejemplo n.º 3
0
/************ private functions *************/
static SECURID_SESSION *securid_sessionlist_delete(rlm_securid_t *inst, SECURID_SESSION *session)
{
	rbnode_t *node;

	node = rbtree_find(inst->session_tree, session);
	if (!node) return NULL;

	session = rbtree_node2data(inst->session_tree, node);

	/*
	 *	Delete old session from the tree.
	 */
	rbtree_delete(inst->session_tree, node);
	
	/*
	 *	And unsplice it from the linked list.
	 */
	if (session->prev) {
		session->prev->next = session->next;
	} else {
		inst->session_head = session->next;
	}
	if (session->next) {
		session->next->prev = session->prev;
	} else {
		inst->session_tail = session->prev;
	}
	session->prev = session->next = NULL;

	return session;
}
Ejemplo n.º 4
0
/*!
 * Check whether the tree contains an object [takes O(log n) operations]
 *
 * \param tree The tree
 *
 * \param object The query object
 *
 * \return (true) if an equal object is found in the tree, otherwise (false)
 */
BOOL rbtree_contains
    (
    rbtree_t * tree,
    void * object
    )
    {
    return (rbtree_find(tree, object) != NULL);
    }
Ejemplo n.º 5
0
static inline vres_event_t *vres_event_lookup(vres_event_group_t *group, vres_event_desc_t *desc)
{
    rbtree_node_t *node = NULL;

    if (!rbtree_find(&group->tree, desc, &node))
        return tree_entry(node, vres_event_t, node);
    else
        return NULL;
}
Ejemplo n.º 6
0
/** Find the user data.
 *
 */
void *rbtree_finddata(rbtree_t *tree, void const *data)
{
	rbnode_t *x;

	x = rbtree_find(tree, data);
	if (!x) return NULL;

	return x->data;
}
Ejemplo n.º 7
0
player_t find_player_by_actname(const char* actname)
{
	string_t key = new_string(actname);
	struct rbnode *node = rbtree_find(g_player_tree,(void*)key);
	player_t ply = NULL;
	if(node) ply = (player_t)(((char*)node)-sizeof(struct refbase));
	release_string(key);
	return ply;
}
Ejemplo n.º 8
0
/*
 *	Find the user data.
 */
void *rbtree_finddata(rbtree_t *tree, const void *Data)
{
	rbnode_t *X;

	X = rbtree_find(tree, Data);
	if (!X) return NULL;

	return X->Data;
}
Ejemplo n.º 9
0
Archivo: map.c Proyecto: jash16/algo
//map_find返回一个pair
void *map_find(map *m, const void *key) {
    rbnode *n = rbtree_find(m->_t, key);
    if (n == NULL) {
        return NULL;
    } else {
        return RBNODE_VAL(n);
    }
    return NULL;
}
Ejemplo n.º 10
0
/** Delete a node from the tree, based on given data, which MUST have come from rbtree_finddata().
 *
 *
 */
bool rbtree_deletebydata(rbtree_t *tree, void const *data)
{
	rbnode_t *node = rbtree_find(tree, data);

	if (!node) return false;

	rbtree_delete(tree, node);

	return true;
}
Ejemplo n.º 11
0
/*
 *	Delete a node from the tree, based on given data, which MUST
 *	have come from rbtree_finddata().
 */
int rbtree_deletebydata(rbtree_t *tree, const void *data)
{
	rbnode_t *node = rbtree_find(tree, data);

	if (!node) return 0;	/* false */

	rbtree_delete(tree, node);

	return 1;
}
Ejemplo n.º 12
0
struct rbnode* rbtree_remove(rbtree_t rb,void *key)
{
	struct rbnode *n = rbtree_find(rb,key);
	if(n)
	{
		rbtree_erase(n);
		return n;
	}
	return NULL;
}
Ejemplo n.º 13
0
/*************************************************************************
 * Read a motif database
 *************************************************************************/
static MOTIF_DB_T* read_motifs(int id, char* motif_source, char* bg_source, 
    ARRAY_T** bg, double pseudocount, RBTREE_T *selected, ALPH_T alph) {
  // vars
  int read_motifs;
  MOTIF_DB_T* motifdb;
  MREAD_T *mread;
  MOTIF_T *motif;
  ARRAYLST_T *motifs;
  // open the motif file for reading
  mread = mread_create(motif_source, OPEN_MFILE);
  mread_set_pseudocount(mread, pseudocount);
  // determine background to use
  if (*bg != NULL) mread_set_background(mread, *bg);
  else mread_set_bg_source(mread, bg_source);
  // load motifs
  read_motifs = 0;
  if (rbtree_size(selected) > 0) {
    motifs = arraylst_create();
    while(mread_has_motif(mread)) {
      motif = mread_next_motif(mread);
      read_motifs++;
      if (rbtree_find(selected, get_motif_id(motif))) {
        arraylst_add(motif, motifs);
      } else {
        DEBUG_FMT(NORMAL_VERBOSE, "Discarding motif %s in %s.\n", 
            get_motif_id(motif), motif_source);
        destroy_motif(motif);
      }
    }
  } else {
    motifs = mread_load(mread, NULL);
    read_motifs = arraylst_size(motifs);
  }
  arraylst_fit(motifs);
  if (read_motifs > 0) {
    // check the alphabet
    if (mread_get_alphabet(mread) != alph) {
      die("Expected %s alphabet motifs\n", alph_name(alph));
    }
    // get the background
    if (*bg == NULL) *bg = mread_get_background(mread);
  } else {
    fprintf(stderr, "Warning: Motif file %s contains no motifs.\n", motif_source);
  }
  // clean up motif reader
  mread_destroy(mread);
  // create motif db
  motifdb = mm_malloc(sizeof(MOTIF_DB_T));
  memset(motifdb, 0, sizeof(MOTIF_DB_T));
  motifdb->id = id;
  motifdb->source = strdup(motif_source);
  motifdb->motifs = motifs;
  return motifdb; 
}
Ejemplo n.º 14
0
static inline vres_file_t *vres_file_lookup_file(const char *path)
{
    vres_file_t *file = NULL;
    rbtree_node_t *node = NULL;

    pthread_rwlock_rdlock(&vres_file_flock);
    if (!rbtree_find(&vres_file_ftree, path, &node))
        file = tree_entry(node, vres_file_t, f_node);
    pthread_rwlock_unlock(&vres_file_flock);
    return file;
}
Ejemplo n.º 15
0
bool fr_packet_list_yank(fr_packet_list_t *pl, RADIUS_PACKET *request)
{
	rbnode_t *node;

	if (!pl || !request) return false;

	node = rbtree_find(pl->tree, &request);
	if (!node) return false;

	rbtree_delete(pl->tree, node);
	return true;
}
Ejemplo n.º 16
0
/*! 
 * Remove an object from the tree [takes O(log n) operations]
 *
 * \param tree The tree
 *
 * \param object The object to be removed
 *
 * \pre The object should be contained in the tree
 */
void rbtree_remove
    (
    rbtree_t * tree, 
    void * object
    )
    {
    /* find the node */
    rbnode_t * node = rbtree_find(tree, object); 

    /* remove the node */

    if (node) 
        rbtree_remove_node(tree, node);
    }
Ejemplo n.º 17
0
    int search(float alt, float vis, TransformInput *ti)
    {
	struct RBitem search_ti = set_alt_vis(alt, vis);
	struct RBitem *found_ti;

	found_ti = (struct RBitem *)rbtree_find(RBTree, &search_ti);
	if (found_ti) {
	    *ti = found_ti->ti;
	    return 1;
	}
	else
	    return 0;

    }
Ejemplo n.º 18
0
static void eaplist_expire(rlm_eap_t *inst, REQUEST *request, time_t timestamp)
{
	int i;
	eap_handler_t *handler;

	/*
	 *	Check the first few handlers in the list, and delete
	 *	them if they're too old.  We don't need to check them
	 *	all, as incoming requests will quickly cause older
	 *	handlers to be deleted.
	 *
	 */
	for (i = 0; i < 3; i++) {
		handler = inst->session_head;
		if (!handler) break;
		
		RDEBUG("Expiring EAP session with state "
		       "0x%02x%02x%02x%02x%02x%02x%02x%02x",
		       handler->state[0], handler->state[1],
		       handler->state[2], handler->state[3],
		       handler->state[4], handler->state[5],
		       handler->state[6], handler->state[7]);

		/*
		 *	Expire entries from the start of the list.
		 *	They should be the oldest ones.
		 */
		if ((timestamp - handler->timestamp) > inst->timer_limit) {
			rbnode_t *node;
			node = rbtree_find(inst->session_tree, handler);
			rad_assert(node != NULL);
			rbtree_delete(inst->session_tree, node);

			/*
			 *	handler == inst->session_head
			 */
			inst->session_head = handler->next;
			if (handler->next) {
				handler->next->prev = NULL;
			} else {
				inst->session_head = NULL;
				inst->session_tail = NULL;
			}
			eap_handler_free(inst, handler);
		} else {
			break;
		}
	}
}
Ejemplo n.º 19
0
static inline void vres_file_delete_file(const char *path)
{
    vres_file_t *file = NULL;
    rbtree_node_t *node = NULL;

    pthread_rwlock_wrlock(&vres_file_flock);
    if (!rbtree_find(&vres_file_ftree, path, &node)) {
        file = tree_entry(node, vres_file_t, f_node);
        rbtree_remove_node(&vres_file_ftree, node);
    }
    pthread_rwlock_unlock(&vres_file_flock);
    if (file)
        free(file);
    log_file_delete_file(path);
}
Ejemplo n.º 20
0
void
rbtree_delete(struct rbtree *tree, struct rbtree_elem *elem)
{
#if 0
  struct rbtree_elem *parent, *succ, *pred, *node;

  //rbtree_inorder_check(tree) ;
  if (!(node = rbtree_find(tree, elem))) {
    //rbtree_inorder_check(tree) ;
    return false;
  }
#endif

  node_delete(tree, elem) ;
  //rbtree_inorder_check(tree) ;
}
Ejemplo n.º 21
0
Archivo: router.c Proyecto: ireader/sdk
int router_add(struct router_t* router, const uint8_t id[N_NODEID], const struct sockaddr_storage* addr, struct node_t** node)
{
	int r;
	struct rbitem_t* item;
	struct rbtree_node_t **link;
	struct rbtree_node_t *parent;

	if (node) *node = NULL;

	item = calloc(1, sizeof(*item));
	if (!item)
		return ENOMEM;
	item->node = node_create2(id, addr);
	if (!item->node)
	{
		free(item->node);
		return ENOMEM;
	}

	locker_lock(&router->locker);
	r = rbtree_find(&router->rbtree, id, &parent);
	if (0 == r)
	{
		if (node)
		{
			*node = (rbtree_entry(parent, struct rbitem_t, link))->node;
			node_addref(*node);
		}
		locker_unlock(&router->locker);
		node_release(item->node);
		free(item);
		return EEXIST;
	}
	link = parent ? (r > 0 ? &parent->left : &parent->right) : NULL;
	assert(!link || !*link);

	rbtree_insert(&router->rbtree, parent, link, &item->link);
	router->count += 1;
	
	if (node)
	{
		node_addref(item->node);
		*node = item->node;
	}
	locker_unlock(&router->locker);
	return 0;
}
Ejemplo n.º 22
0
/**
 * @brief Unregister an xlat function.
 *
 *	We can only have one function to call per name, so the
 *	passing of "func" here is extraneous.
 *
 * @param module xlat to unregister
 * @param func Unused
 * @return Void.
 */
void xlat_unregister(const char *module, RAD_XLAT_FUNC func)
{
	rbnode_t	*node;
	xlat_t		my_xlat;

	func = func;		/* -Wunused */

	if (!module) return;

	strlcpy(my_xlat.module, module, sizeof(my_xlat.module));
	my_xlat.length = strlen(my_xlat.module);

	node = rbtree_find(xlat_root, &my_xlat);
	if (!node) return;

	rbtree_delete(xlat_root, node);
}
Ejemplo n.º 23
0
void *
jumptable2_find(struct rbtree *rb, target_ulong eip_virt)
{
  struct tb_t tb;
  struct rbtree_elem *found;
  tb.eip_virt = eip_virt;
  tb.end_eip = eip_virt;
  if ((found = rbtree_find(rb, &tb.jumptable2_elem))) {
    struct tb_t *ret;
    /*The entries in v->jumptable2 should always be unique. */
    /*ASSERT(   rbtree_next(found) == rbtree_end(&v->jumptable2)
         || tb_less(found, rbtree_next(found), NULL));*/
    ret = rbtree_entry(found, struct tb_t, jumptable2_elem);
    return ret;
  }
  return NULL;
}
Ejemplo n.º 24
0
tb_t *
tb_find(struct rbtree *rb, const void *tc_ptr)
{
  struct tb_t tb;
  uint16_t tc_boundaries[1] = {1};
  struct rbtree_elem *found;
  struct tb_t *ret;

  tb.num_insns = 0;
  tb.tc_boundaries = tc_boundaries;
  tb.tc_ptr = (void *)tc_ptr;
  if (!(found = rbtree_find(rb, &tb.tc_elem))) {
    return NULL;
  }
  ASSERT(   rbtree_next(found) == rbtree_end(rb)
         || tc_less(found, rbtree_next(found), NULL));
  ret = rbtree_entry(found, struct tb_t, tc_elem);
  return ret;
}
Ejemplo n.º 25
0
/*
 *	Look up a particular request, using:
 *
 *	Request Id, request code, source IP, source port,
 *
 *	Note that we do NOT use the request vector to look up requests.
 *
 *	We MUST NOT have two requests with identical (id/code/IP/port), and
 *	different vectors.  This is a serious error!
 */
REQUEST *rl_find_proxy(RADIUS_PACKET *packet)
{
	rbnode_t	*node;
	REQUEST		myrequest, *maybe = NULL;
	RADIUS_PACKET	myproxy;

	/*
	 *	If we use the socket FD as an indicator,
	 *	then that implicitely contains information
	 *	as to our src ipaddr/port, so we don't need
	 *	to use that in the comparisons.
	 */
	myproxy.sockfd = packet->sockfd;
	myproxy.id = packet->id;
	myproxy.dst_ipaddr = packet->src_ipaddr;
	myproxy.dst_port = packet->src_port;

#ifndef NDEBUG
	myrequest.magic = REQUEST_MAGIC;
#endif
	myrequest.proxy = &myproxy;

	pthread_mutex_lock(&proxy_mutex);
        node = rbtree_find(proxy_tree, &myrequest);

	if (node) {
		maybe = rbtree_node2data(proxy_tree, node);
		rad_assert(maybe->proxy_outstanding > 0);
		maybe->proxy_outstanding--;
		
		/*
		 *	Received all of the replies we expect.
		 *	delete it from both trees.
		 */
		if (maybe->proxy_outstanding == 0) {
			rl_delete_proxy(&myrequest, node);
		}
	}
	pthread_mutex_unlock(&proxy_mutex);

	return maybe;
}
Ejemplo n.º 26
0
static struct ffsb_file *choose_file(struct benchfiles *b, randdata_t *rd)
{
	rb_node *cur = NULL;
	int chosen = 0;
	struct ffsb_file temp;
	temp.num = chosen;

	if (b->listsize == 0) {
		fprintf(stderr, "No more files to operate on,"
			  " try making more initial files "
			  "or fewer delete operations\n");
		exit(0);
	}

	while (cur == NULL) {
		chosen = getrandom(rd, b->listsize);
		temp.num = chosen;
		cur = rbtree_find(b->files, &temp);
	}
	return cur->object;
}
Ejemplo n.º 27
0
static void securid_sessionlist_clean_expired(rlm_securid_t *inst, REQUEST *request, time_t timestamp)
{
	int num_sessions;
	SECURID_SESSION *session;

	num_sessions = rbtree_num_elements(inst->session_tree);
	RDEBUG2("There are %d sessions in the tree\n",num_sessions);

	/*
	 *	Delete old sessions from the list
	 *
	 */
       	while((session = inst->session_head)) {
		if ((timestamp - session->timestamp) > inst->timer_limit) {
			rbnode_t *node;
			node = rbtree_find(inst->session_tree, session);
			rad_assert(node != NULL);
			rbtree_delete(inst->session_tree, node);

			/*
			 *	session == inst->session_head
			 */
			inst->session_head = session->next;
			if (session->next) {
				session->next->prev = NULL;
			} else {
				inst->session_head = NULL;
				inst->session_tail = NULL;
			}

			RDEBUG2("Cleaning expired session: identity='%s' state='%s'\n",
					  SAFE_STR(session->identity),session->state);
			securid_session_free(inst,request,session);
		} else {
			/* no need to check all sessions since they are sorted by age */
			break;
		}
	}
}
Ejemplo n.º 28
0
Archivo: router.c Proyecto: ireader/sdk
int router_remove(struct router_t* router, const uint8_t id[N_NODEID])
{
	int r;
	struct rbitem_t* item;
	struct rbtree_node_t* node;

	locker_lock(&router->locker);
	r = rbtree_find(&router->rbtree, id, &node);
	if (0 != r)
	{
		locker_unlock(&router->locker);
		return ENOENT;
	}
	
	router->count -= 1;
	item = rbtree_entry(node, struct rbitem_t, link);
	rbtree_delete(&router->rbtree, node);
	locker_unlock(&router->locker);
	node_release(item->node);
	free(item);
	return 0;
}
Ejemplo n.º 29
0
static eap_handler_t *eaplist_delete(rlm_eap_t *inst, REQUEST *request,
				   eap_handler_t *handler)
{
	rbnode_t *node;

	node = rbtree_find(inst->session_tree, handler);
	if (!node) return NULL;

	handler = rbtree_node2data(inst->session_tree, node);

	RDEBUG("Finished EAP session with state "
	       "0x%02x%02x%02x%02x%02x%02x%02x%02x",
	       handler->state[0], handler->state[1],
	       handler->state[2], handler->state[3],
	       handler->state[4], handler->state[5],
	       handler->state[6], handler->state[7]);
	/*
	 *	Delete old handler from the tree.
	 */
	rbtree_delete(inst->session_tree, node);
	
	/*
	 *	And unsplice it from the linked list.
	 */
	if (handler->prev) {
		handler->prev->next = handler->next;
	} else {
		inst->session_head = handler->next;
	}
	if (handler->next) {
		handler->next->prev = handler->prev;
	} else {
		inst->session_tail = handler->prev;
	}
	handler->prev = handler->next = NULL;

	return handler;
}
Ejemplo n.º 30
0
static inline int vres_file_pop(char *path)
{
    size_t len;
    char *filename;
    char dirname[FILE_PATH_MAX];

    if (vres_file_dirname(path, dirname)) {
        log_err("invalid path, path=%s", path);
        return -1;
    }
    filename = path + strlen(dirname);
    len = strlen(filename);
    if ((len > 0) && (len + filename - path < FILE_PATH_MAX)) {
        vres_file_dir_t *dir = vres_file_lookup_dir(dirname);

        if (!dir)
            return -1;
        pthread_rwlock_wrlock(&dir->d_lock);
        if (dir->d_count > 0) {
            rbtree_node_t *node = NULL;

            if (!rbtree_find(&dir->d_tree, filename, &node)) {
                vres_file_name_t *name = tree_entry(node, vres_file_name_t, node);

                rbtree_remove_node(&dir->d_tree, node);
                dir->d_count--;
                free(name);
            }
        }
        pthread_rwlock_unlock(&dir->d_lock);
    } else {
        log_err("invalid path, path=%s", path);
        return -1;
    }
    return 0;
}