UMOCK_C_LOCK_HANDLE umock_lock_factory_create_lock()

in src/umock_lock_factory_pthread.c [112:152]


UMOCK_C_LOCK_HANDLE umock_lock_factory_create_lock(void* params)
{
    (void)params;

    UMOCK_C_LOCK_HANDLE result;
    /* Codes_SRS_UMOCK_LOCK_FACTORY_PTHREAD_01_001: [ umock_lock_factory_create_lock shall allocate memory for the lock. ]*/
    UMOCK_C_LOCK_PTHREAD* rw_lock_pthreads = umockalloc_malloc(sizeof(UMOCK_C_LOCK_PTHREAD));
    if (rw_lock_pthreads == NULL)
    {
        /* Codes_SRS_UMOCK_LOCK_FACTORY_PTHREAD_01_004: [ If any error occurs, umock_lock_factory_create_lock shall fail and return NULL. ]*/
        UMOCK_LOG("umockalloc_malloc(%zu) failed", sizeof(UMOCK_C_LOCK_PTHREAD));
    }
    else
    {
        /* Codes_SRS_UMOCK_LOCK_FACTORY_PTHREAD_01_003: [ umock_lock_factory_create_lock shall return a lock handle that has the function pointers set to umock_lock_pthread_acquire_shared, umock_lock_pthread_release_shared, umock_lock_pthread_acquire_exclusive, umock_lock_pthread_release_exclusive and umock_lock_pthread_destroy. ]*/
        rw_lock_pthreads->lock_if.acquire_shared = umock_lock_pthreads_acquire_shared;
        rw_lock_pthreads->lock_if.release_shared = umock_lock_pthreads_release_shared;
        rw_lock_pthreads->lock_if.acquire_exclusive = umock_lock_pthreads_acquire_exclusive;
        rw_lock_pthreads->lock_if.release_exclusive = umock_lock_pthreads_release_exclusive;
        rw_lock_pthreads->lock_if.destroy = umock_lock_pthreads_destroy;

        /* Codes_SRS_UMOCK_LOCK_FACTORY_PTHREAD_01_002: [] umock_lock_factory_create_lock shall initialize a pthread RW lock that is encapsulated by the new UMOCK_C_LOCK_HANDLE. ]*/
        if (pthread_rwlock_init(&rw_lock_pthreads->rw_lock, NULL) != 0)
        {
            /* Codes_SRS_UMOCK_LOCK_FACTORY_PTHREAD_01_004: [ If any error occurs, umock_lock_factory_create_lock shall fail and return NULL. ]*/
            UMOCK_LOG("pthread_rwlock_init failed");
        }
        else
        {
            result = &rw_lock_pthreads->lock_if;
            goto all_ok;
        }

        umockalloc_free(rw_lock_pthreads);
    }

    result = NULL;

all_ok:
    return result;
}