struct _raw_pool *expend_raw_pool(struct _raw_pool *ptr, int n) { struct _raw_pool *pool = init_raw_pool(n); ptr->next = pool; pool->prev = ptr; return pool; }
subuser *addsubuser(ape_socket *client, const char *channel, USERS *user, acetables *g_ape) { subuser *sub = NULL; FIRE_EVENT(addsubuser, sub, g_ape); if (getsubuser(user, channel) != NULL || strlen(channel) > MAX_HOST_LENGTH) { return NULL; } sub = xmalloc(sizeof(*sub)); sub->client = client; sub->state = ADIED; sub->user = user; memcpy(sub->channel, channel, strlen(channel)+1); sub->next = user->subuser; sub->nraw = 0; sub->wait_for_free = 0; sub->properties = NULL; sub->headers.sent = 0; sub->headers.content = NULL; sub->burn_after_writing = 0; sub->idle = time(NULL); sub->need_update = 0; sub->current_chl = 0; sub->raw_pools.nraw = 0; /* Pre-allocate a pool of raw to reduce the number of malloc calls */ /* Low priority raws */ sub->raw_pools.low.nraw = 0; sub->raw_pools.low.size = 32; sub->raw_pools.low.rawhead = init_raw_pool(sub->raw_pools.low.size); sub->raw_pools.low.rawfoot = sub->raw_pools.low.rawhead; /* High priority raws */ sub->raw_pools.high.nraw = 0; sub->raw_pools.high.size = 8; sub->raw_pools.high.rawhead = init_raw_pool(sub->raw_pools.high.size); sub->raw_pools.high.rawfoot = sub->raw_pools.high.rawhead; (user->nsub)++; user->subuser = sub; /* if the previous subuser have some messages in queue, copy them to the new subuser */ if (sub->next != NULL && sub->next->raw_pools.low.nraw) { struct _raw_pool *rTmp; for (rTmp = sub->next->raw_pools.low.rawhead; rTmp->raw != NULL; rTmp = rTmp->next) { post_raw_sub(rTmp->raw, sub, g_ape); } } HOOK_EVENT(addsubuser, sub, g_ape); return sub; }