src/server/daemon/resourcepool.c

changeset 460
b9a447b02046
parent 415
d938228c382e
child 463
4fd523fff13b
equal deleted inserted replaced
459:f21b4ff81c01 460:b9a447b02046
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

mercurial