thread_attr_t thread_attr_new() { thread_attr_t attr = (thread_attr_t)malloc(sizeof(struct _thread_attr)); attr->thread = NULL; thread_attr_init(attr); return attr; }
int thread_context_init(struct netsniff_ng_thread_context * thread_ctx, const cpu_set_t run_on, const int sched_prio, const int sched_policy, const enum netsniff_ng_thread_type thread_type) { int rc; assert(thread_ctx); memset(thread_ctx, 0, sizeof(*thread_ctx)); if ((rc = pthread_attr_init(&thread_ctx->thread_attr)) != 0) { warn("Cannot initialize thread attributes\n"); return (rc); } if ((rc = thread_attr_init(thread_ctx, sched_prio, sched_policy, &run_on)) != 0) { pthread_attr_destroy(&thread_ctx->thread_attr); warn("Cannot set thread attributes\n"); return (rc); } if ((rc = pthread_mutex_init(&thread_ctx->wait_mutex, NULL)) != 0) { pthread_attr_destroy(&thread_ctx->thread_attr); warn("Cannot initialize thread mutex\n"); return (rc); } if ((rc = pthread_cond_init(&thread_ctx->wait_cond, NULL)) != 0) { pthread_mutex_destroy(&thread_ctx->wait_mutex); pthread_attr_destroy(&thread_ctx->thread_attr); warn("Cannot initialize thread condition\n"); return (rc); } if ((rc = pthread_spin_init(&thread_ctx->config_lock, PTHREAD_PROCESS_PRIVATE)) != 0) { pthread_cond_destroy(&thread_ctx->wait_cond); pthread_mutex_destroy(&thread_ctx->wait_mutex); pthread_attr_destroy(&thread_ctx->thread_attr); warn("Cannot initialize thread config lock\n"); return (rc); } thread_ctx->run_on = run_on; thread_ctx->type = thread_type; thread_ctx->status = STOPPED; return(rc); }