| 46 void resource_pool_cleanup(void) { |
46 void resource_pool_cleanup(void) { |
| 47 cxMapFree(resource_pool_types); |
47 cxMapFree(resource_pool_types); |
| 48 } |
48 } |
| 49 |
49 |
| 50 int resourcepool_register_type(const char *type_name, ResourceType *type_info) { |
50 int resourcepool_register_type(const char *type_name, ResourceType *type_info) { |
| 51 if(cxMapPut(resource_pool_types, cx_hash_key_str(type_name), type_info)) { |
51 if(cxMapPut(resource_pool_types, type_name, type_info)) { |
| 52 log_ereport(LOG_CATASTROPHE, "resourcepool_register_type: OOM"); |
52 log_ereport(LOG_CATASTROPHE, "resourcepool_register_type: OOM"); |
| 53 return 1; |
53 return 1; |
| 54 } |
54 } |
| 55 return 0; |
55 return 0; |
| 56 } |
56 } |
| 130 NSAPISession *session = (NSAPISession*)opt_sn; |
130 NSAPISession *session = (NSAPISession*)opt_sn; |
| 131 ResourceDataPrivate *resource = NULL; |
131 ResourceDataPrivate *resource = NULL; |
| 132 |
132 |
| 133 // was this resource already used by this request? |
133 // was this resource already used by this request? |
| 134 if(request && request->resources) { |
134 if(request && request->resources) { |
| 135 resource = cxMapGet(request->resources, cx_hash_key_str(name)); |
135 resource = cxMapGet(request->resources, name); |
| 136 if(resource) { |
136 if(resource) { |
| 137 return &resource->data; |
137 return &resource->data; |
| 138 } |
138 } |
| 139 } |
139 } |
| 140 |
140 |
| 141 ResourcePool *respool = cxMapGet(cfg->resources, cx_hash_key_str(name)); |
141 ResourcePool *respool = cxMapGet(cfg->resources, name); |
| 142 if(!respool) return NULL; |
142 if(!respool) return NULL; |
| 143 |
143 |
| 144 |
144 |
| 145 pthread_mutex_lock(&respool->lock); |
145 pthread_mutex_lock(&respool->lock); |
| 146 WSBool createResource = FALSE; |
146 WSBool createResource = FALSE; |
| 185 if(!request->resources) { |
185 if(!request->resources) { |
| 186 request->resources = cxHashMapCreate(pool_allocator(session->sn.pool), CX_STORE_POINTERS, 8); |
186 request->resources = cxHashMapCreate(pool_allocator(session->sn.pool), CX_STORE_POINTERS, 8); |
| 187 } |
187 } |
| 188 |
188 |
| 189 if(request->resources) { |
189 if(request->resources) { |
| 190 if(cxMapPut(request->resources, cx_hash_key_str(name), resource)) { |
190 if(cxMapPut(request->resources, name, resource)) { |
| 191 err = 1; |
191 err = 1; |
| 192 } |
192 } |
| 193 } else { |
193 } else { |
| 194 err = 1; |
194 err = 1; |
| 195 } |
195 } |
| 227 ResourceDataPrivate *res = (ResourceDataPrivate*)resource; |
227 ResourceDataPrivate *res = (ResourceDataPrivate*)resource; |
| 228 ResourcePool *respool = resource->resourcepool; |
228 ResourcePool *respool = resource->resourcepool; |
| 229 |
229 |
| 230 if(nsapi_rq && !nsapi_rq->finished) { |
230 if(nsapi_rq && !nsapi_rq->finished) { |
| 231 // request processing still ongoing and SAFs will be executed |
231 // request processing still ongoing and SAFs will be executed |
| 232 if(cxMapRemove(nsapi_rq->resources, cx_hash_key_str(respool->name))) { |
232 if(cxMapRemove(nsapi_rq->resources, respool->name)) { |
| 233 log_ereport(LOG_FAILURE, "resourcepool_free: cannot remove resource from request: potential double free"); |
233 log_ereport(LOG_FAILURE, "resourcepool_free: cannot remove resource from request: potential double free"); |
| 234 } |
234 } |
| 235 } |
235 } |
| 236 // else: safe to ignore nsapi_rq->resources |
236 // else: safe to ignore nsapi_rq->resources |
| 237 |
237 |