58 if(!restype) { |
58 if(!restype) { |
59 log_ereport(LOG_MISCONFIG, "unknown resource pool type: %s", type.ptr); |
59 log_ereport(LOG_MISCONFIG, "unknown resource pool type: %s", type.ptr); |
60 return 1; |
60 return 1; |
61 } |
61 } |
62 |
62 |
|
63 char *respool_name = cx_strdup_a(cfg->a, name).ptr; |
|
64 if(!respool_name) { |
|
65 log_ereport(LOG_FAILURE, "resourcepool_new: OOM"); |
|
66 return 1; |
|
67 } |
|
68 |
63 // convert ConfigNode to pblock |
69 // convert ConfigNode to pblock |
64 // no sub-objects allowed for this specific ConfigNode, therefore |
70 // no sub-objects allowed for this specific ConfigNode, therefore |
65 // it can be represented as key-value-pairs |
71 // it can be represented as key-value-pairs |
66 pblock *param = config_obj2pblock(cfg->pool, node); |
72 pblock *param = config_obj2pblock(cfg->pool, node); |
67 if(!param) { |
73 if(!param) { |
80 if(!respool_data) { |
86 if(!respool_data) { |
81 log_ereport(LOG_FAILURE, "Cannot create resource pool data: pool: %s type: %s", name.ptr, type.ptr); |
87 log_ereport(LOG_FAILURE, "Cannot create resource pool data: pool: %s type: %s", name.ptr, type.ptr); |
82 return 1; |
88 return 1; |
83 } |
89 } |
84 |
90 |
|
91 respool->name = respool_name; |
85 respool->type = restype; |
92 respool->type = restype; |
86 respool->data = respool_data; |
93 respool->data = respool_data; |
87 respool->min = 4; // TODO: get from node |
94 respool->min = 4; // TODO: get from node |
88 respool->max = RESOURCE_POOL_MAX_DEFAULT; // TODO: get from node |
95 respool->max = RESOURCE_POOL_MAX_DEFAULT; // TODO: get from node |
89 |
96 |
209 ServerConfiguration *cfg = session->config; |
216 ServerConfiguration *cfg = session->config; |
210 return s_resourcepool_lookup(cfg, rq, sn, name, flags); |
217 return s_resourcepool_lookup(cfg, rq, sn, name, flags); |
211 } |
218 } |
212 |
219 |
213 void resourcepool_free(Session *sn, Request *rq, ResourceData *resource) { |
220 void resourcepool_free(Session *sn, Request *rq, ResourceData *resource) { |
|
221 NSAPIRequest *nsapi_rq = (NSAPIRequest *)rq; |
214 ResourceDataPrivate *res = (ResourceDataPrivate*)resource; |
222 ResourceDataPrivate *res = (ResourceDataPrivate*)resource; |
215 ResourcePool *respool = resource->resourcepool; |
223 ResourcePool *respool = resource->resourcepool; |
|
224 |
|
225 if(nsapi_rq && !nsapi_rq->finished) { |
|
226 // request processing still ongoing and SAFs will be executed |
|
227 if(!cxMapRemove(nsapi_rq->resources, cx_hash_key_str(respool->name))) { |
|
228 log_ereport(LOG_FAILURE, "resourcepool_free: cannot remove resource from request: potential double free"); |
|
229 } |
|
230 } |
|
231 // else: safe to ignore nsapi_rq->resources |
216 |
232 |
217 if(respool->type->finish(respool->data, res->resdata)) { |
233 if(respool->type->finish(respool->data, res->resdata)) { |
218 log_ereport(LOG_FAILURE, "resourcepool_free: finish failed"); |
234 log_ereport(LOG_FAILURE, "resourcepool_free: finish failed"); |
219 } |
235 } |
220 |
236 |