HelenOS sources
This source file includes following definitions.
- create_dev_node
- delete_dev_node
- dev_add_ref
- dev_del_ref
- dev_wait_stable
- find_dev_node_no_lock
- find_dev_node
- dev_get_functions
#include <errno.h>
#include "dev.h"
#include "devman.h"
dev_node_t *create_dev_node(void)
{
dev_node_t *dev;
dev = calloc(1, sizeof(dev_node_t));
if (dev == NULL)
return NULL;
refcount_init(&dev->refcnt);
list_initialize(&dev->functions);
fibril_mutex_initialize(&dev->state_lock);
fibril_condvar_initialize(&dev->state_cv);
link_initialize(&dev->driver_devices);
return dev;
}
void delete_dev_node(dev_node_t *dev)
{
assert(list_empty(&dev->functions));
assert(dev->pfun == NULL);
assert(dev->drv == NULL);
free(dev);
}
void dev_add_ref(dev_node_t *dev)
{
refcount_up(&dev->refcnt);
}
void dev_del_ref(dev_node_t *dev)
{
if (refcount_down(&dev->refcnt))
delete_dev_node(dev);
}
void dev_wait_stable(dev_node_t *dev)
{
fibril_mutex_lock(&dev->state_lock);
while (dev->state == DEVICE_ATTACHING)
fibril_condvar_wait(&dev->state_cv, &dev->state_lock);
fibril_mutex_unlock(&dev->state_lock);
}
dev_node_t *find_dev_node_no_lock(dev_tree_t *tree, devman_handle_t handle)
{
assert(fibril_rwlock_is_locked(&tree->rwlock));
ht_link_t *link = hash_table_find(&tree->devman_devices, &handle);
if (link == NULL)
return NULL;
return hash_table_get_inst(link, dev_node_t, devman_dev);
}
dev_node_t *find_dev_node(dev_tree_t *tree, devman_handle_t handle)
{
dev_node_t *dev = NULL;
fibril_rwlock_read_lock(&tree->rwlock);
dev = find_dev_node_no_lock(tree, handle);
if (dev != NULL)
dev_add_ref(dev);
fibril_rwlock_read_unlock(&tree->rwlock);
return dev;
}
errno_t dev_get_functions(dev_tree_t *tree, dev_node_t *dev,
devman_handle_t *hdl_buf, size_t buf_size, size_t *act_size)
{
size_t act_cnt;
size_t buf_cnt;
assert(fibril_rwlock_is_locked(&tree->rwlock));
buf_cnt = buf_size / sizeof(devman_handle_t);
act_cnt = list_count(&dev->functions);
*act_size = act_cnt * sizeof(devman_handle_t);
if (buf_size % sizeof(devman_handle_t) != 0)
return EINVAL;
size_t pos = 0;
list_foreach(dev->functions, dev_functions, fun_node_t, fun) {
if (pos < buf_cnt) {
hdl_buf[pos] = fun->handle;
}
pos++;
}
return EOK;
}
HelenOS homepage, sources at GitHub