cms_client cms_serviceLookupClient( cms_service cms, struct soap* soap, const c_char* uri) { int i; cms_client client; cms_client result; result = NULL; os_mutexLock(&cms->clientMutex); for(i=0; i<c_iterLength(cms->clients) && result == NULL; i++) { client = cms_client(c_iterObject(cms->clients, i)); if(client->ip == soap->ip) { if(cms_thread(client)->terminate == FALSE) { result = client; } } } if( (result == NULL) && (((c_ulong)c_iterLength(cms->clients)) < cms->configuration->maxClients)) { result = cms_clientNew(soap->ip, cms, uri); cms->clients = c_iterInsert(cms->clients, result); cms_clientStart(result); cms_serviceUpdateStatistics(cms); if(cms->configuration->verbosity >= 4) { OS_REPORT_4(OS_INFO, CMS_CONTEXT, 0, "Client thread started for IP: %d.%d.%d.%d", (int)(result->ip>>24)&0xFF, (int)(result->ip>>16)&0xFF, (int)(result->ip>>8)&0xFF, (int)(result->ip&0xFF)); }
cms_client cms_clientNew( unsigned long ip, cms_service service, const c_char* uri) { cms_client client; os_result osr; os_mutexAttr attr; os_condAttr condAttr; client = cms_client(os_malloc(C_SIZEOF(cms_client))); cms_threadInit(cms_thread(client), "cms_client", &service->configuration->clientScheduling); if(client != NULL){ cms_object(client)->kind = CMS_CLIENT; cms_thread(client)->uri = os_strdup(uri); client->ip = ip; client->initCount = 0; client->service = service; client->internalFree = FALSE; osr = os_mutexAttrInit(&attr); if(osr == os_resultSuccess){ attr.scopeAttr = OS_SCOPE_PRIVATE; osr = os_mutexInit(&client->soapMutex, &attr); client->soapEnvs = c_iterNew(NULL); if(osr == os_resultSuccess){ osr = os_condAttrInit(&condAttr); if(osr == os_resultSuccess){ osr = os_mutexInit(&client->conditionMutex, &attr); if(osr == os_resultSuccess){ condAttr.scopeAttr = OS_SCOPE_PRIVATE; osr = os_condInit(&client->condition, &client->conditionMutex, &condAttr ); if(osr == os_resultSuccess){ osr = os_mutexInit(&client->threadMutex, &attr); if(osr == os_resultSuccess){ client->threads = c_iterNew(NULL); } else { cms_clientFree(client); } } } else { cms_clientFree(client); } } else { cms_clientFree(client); } } else { cms_clientFree(client); } } else { cms_clientFree(client); } } if(client == NULL){ if(service->configuration->verbosity >= 1){ OS_REPORT(OS_ERROR, CMS_CONTEXT, 0, "cms_clientNew: client could not be initialized."); } } return client; }
void cms_serviceFree( cms_service cms) { cms_client client; c_iter clientCopy; c_ulong i, size; if(cms != NULL) { if(cms->configuration != NULL) { if(cms->configuration->verbosity >= 2) { OS_REPORT(OS_INFO, CMS_CONTEXT, 0, "Terminating CMSOAP service..."); } } if(cms->uservice != NULL) { u_serviceChangeState(cms->uservice, STATE_TERMINATING); } cms->terminate = TRUE; if(cms->leaseThread != NULL) { cms_threadFree(cms->leaseThread); } if(cms->garbageCollector != NULL) { cms_threadFree(cms->garbageCollector); } if(cms->soap != NULL) { cms->soap->attributes = NULL; soap_destroy(cms->soap); soap_end(cms->soap); soap_done(cms->soap); free(cms->soap); } if(cms->clients != NULL) { os_mutexLock(&cms->clientMutex); clientCopy = c_iterCopy(cms->clients); os_mutexUnlock(&cms->clientMutex); if(c_iterLength(cms->clients) > 0) { if(cms->configuration->verbosity >= 2) { OS_REPORT_1(OS_WARNING, CMS_CONTEXT, 0, "Terminating CMSOAPService, but %d client(s) is/are still connected.", c_iterLength(cms->clients)); } } size = c_iterLength(clientCopy); for(i=0; i<size; i++) { client = cms_client(c_iterObject(clientCopy, i)); cms_thread(client)->terminate = TRUE; } for(i=0; i<size; i++) { client = cms_client(c_iterObject(clientCopy, i)); cms_clientFree(client); } c_iterFree(clientCopy); os_mutexLock(&cms->clientMutex); c_iterFree(cms->clients); os_mutexUnlock(&cms->clientMutex); os_mutexDestroy(&cms->clientMutex); } if(cms->configuration != NULL) { if(cms->configuration->verbosity >= 4) { OS_REPORT(OS_INFO, CMS_CONTEXT, 0, "CMSOAP service terminated."); } } cms_configurationFree(cms->configuration); if(cms->uservice != NULL) { cmx_deregisterAllEntities(); u_serviceChangeState(cms->uservice, STATE_TERMINATED); u_serviceFree(cms->uservice); } cmx_detach(); os_free(cms); } }