/** * allocate a work node. * * @param[out] node_out address in which to store new work node * * @return operation status * @retval 0 success * @retval ENOMEM out of memory */ int afs_wq_node_alloc(struct afs_work_queue_node ** node_out) { int ret = 0; struct afs_work_queue_node * node; *node_out = node = (struct afs_work_queue_node *) malloc(sizeof(*node)); if (node == NULL) { ret = ENOMEM; goto error; } queue_NodeInit(&node->node_list); node->qidx = AFS_WQ_NODE_LIST_NONE; node->cbf = NULL; node->rock = node->queue = NULL; node->refcount = 1; node->block_count = 0; node->error_count = 0; MUTEX_INIT(&node->lock, "node", MUTEX_DEFAULT, 0); CV_INIT(&node->state_cv, "node state", CV_DEFAULT, 0); node->state = AFS_WQ_NODE_STATE_INIT; queue_Init(&node->dep_children); error: return ret; }
/** * allocate a thread worker object. * * @param[inout] worker_out address in which to store worker object pointer * * @return operation status * @retval 0 success * @retval ENOMEM out of memory * * @internal */ static int _afs_tp_worker_alloc(struct afs_thread_pool_worker ** worker_out) { int ret = 0; struct afs_thread_pool_worker * worker; *worker_out = worker = malloc(sizeof(*worker)); if (worker == NULL) { ret = ENOMEM; goto error; } queue_NodeInit(&worker->worker_list); error: return ret; }
/** * allocate a dependency node. * * @param[out] node_out address in which to store dep node pointer * * @return operation status * @retval 0 success * @retval ENOMEM out of memory * * @internal */ static int _afs_wq_dep_alloc(struct afs_work_queue_dep_node ** node_out) { int ret = 0; struct afs_work_queue_dep_node * node; node = malloc(sizeof(*node)); if (node == NULL) { ret = ENOMEM; goto error; } queue_NodeInit(&node->parent_list); node->parent = node->child = NULL; *node_out = node; error: return ret; }