Ejemplo n.º 1
0
cms_client
cms_clientNew(
    unsigned long ip,
    cms_service service)
{
    cms_client client;
    os_result osr;

    client = os_malloc(sizeof *client);
    if(client != NULL){
        if (cms_threadInit(cms_thread(client), "cms_client", &service->configuration->clientScheduling)) {
            cms_object(client)->kind = CMS_CLIENT;
            cms_thread(client)->did = service->did;
            cms_thread(client)->uri = os_strdup(service->uri);
            client->ip = ip;
            client->initCount = 0;
            client->service = service;
            client->internalFree = FALSE;
            osr = os_mutexInit(&client->soapMutex, NULL);
            client->soapEnvs = c_iterNew(NULL);

            if(osr == os_resultSuccess){
                osr = os_mutexInit(&client->conditionMutex, NULL);
                if(osr == os_resultSuccess){
                    osr = os_condInit(&client->condition, &client->conditionMutex, NULL );
                    if(osr == os_resultSuccess){
                        osr = os_mutexInit(&client->threadMutex, NULL);

                        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);
            client = NULL;
        }
    }

    if(client == NULL){
        if(service->configuration->verbosity >= 1){
            OS_REPORT(OS_ERROR, CMS_CONTEXT, 0,
            "cms_clientNew: client could not be initialized.");
        }
    }
    return client;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
    }
}