int output_register(struct output_reg_info *reg_info) { pomlog(POMLOG_DEBUG "Registering output %s", reg_info->name); if (reg_info->api_ver != OUTPUT_API_VER) { pomlog(POMLOG_ERR "Cannot register output as API version differ : expected %u got %u", OUTPUT_API_VER, reg_info->api_ver); return POM_ERR; } pom_mutex_lock(&output_lock); struct output_reg *output = malloc(sizeof(struct output_reg)); if (!output) { pom_mutex_unlock(&output_lock); pom_oom(sizeof(struct output_reg)); return POM_ERR; } memset(output, 0, sizeof(struct output_reg)); output->reg_info = reg_info; if (registry_add_instance_type(output_registry_class, reg_info->name) != POM_OK) { pom_mutex_unlock(&output_lock); free(output); return POM_ERR; } output->next = output_reg_head; if (output->next) output->next->prev = output; output_reg_head = output; pom_mutex_unlock(&output_lock); mod_refcount_inc(reg_info->mod); return POM_OK; }
int input_register(struct input_reg_info *reg_info) { pomlog(POMLOG_DEBUG "Registering input %s", reg_info->name); if (reg_info->api_ver != INPUT_API_VER) { pomlog(POMLOG_ERR "API version of input %s does not match : expected %s got %s", reg_info->name, INPUT_API_VER, reg_info->api_ver); return POM_ERR; } struct input_reg *tmp; for (tmp = input_reg_head; tmp && strcmp(tmp->info->name, reg_info->name); tmp = tmp->next); if (tmp) { pomlog(POMLOG_ERR "Input %s already registered", reg_info->name); return POM_ERR; } struct input_reg *reg = malloc(sizeof(struct input_reg)); if(!reg) { pom_oom(sizeof(struct input_reg)); return POM_ERR; } memset(reg, 0, sizeof(struct input_reg)); reg->info = reg_info; if (registry_add_instance_type(input_registry_class, reg_info->name) != POM_OK) { free(reg); return POM_ERR; } mod_refcount_inc(reg_info->mod); reg->next = input_reg_head; input_reg_head = reg; if (reg->next) reg->next->prev = reg; return POM_OK; }