fifo.c

/* --COPYRIGHT--,BSD
 * Copyright (c) 2010, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * --/COPYRIGHT--*/


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>


#include "fifo.h"


#define MODULE_NAME     "Fifo"


typedef struct Fifo_Object {
    pthread_mutex_t mutex;
    int             numBufs;
    short           flush;
    int             pipes[2];
} Fifo_Object;


const Fifo_Attrs Fifo_Attrs_DEFAULT = {
    0
};


/******************************************************************************
 * Fifo_create
 ******************************************************************************/
Fifo_Handle Fifo_create(Fifo_Attrs *attrs)
{
    Fifo_Handle hFifo;


    if (attrs == NULL) {
        printf("NULL attrs not supported\n");
        return NULL;
    }


    hFifo = calloc(1, sizeof(Fifo_Object));


    if (hFifo == NULL) {
        printf("Failed to allocate space for Fifo Object\n");
        return NULL;
    }


    if (pipe(hFifo->pipes)) {
        free(hFifo);
        return NULL;
    }


    pthread_mutex_init(&hFifo->mutex, NULL);


    return hFifo;
}


/******************************************************************************
 * Fifo_delete
 ******************************************************************************/
int Fifo_delete(Fifo_Handle hFifo)
{
    int ret = FIFO_EOK;


    if (hFifo) {
        if (close(hFifo->pipes[0])) {
            ret = FIFO_EIO;
        }


        if (close(hFifo->pipes[1])) {
            ret = FIFO_EIO;
        }


        pthread_mutex_destroy(&hFifo->mutex);


        free(hFifo);
    }


    return ret;
}


/******************************************************************************
 * Fifo_get
 ******************************************************************************/
int Fifo_get(Fifo_Handle hFifo, void** ptrPtr)
{
    int flush;
    int numBytes;


    //assert(hFifo);
    //assert(ptrPtr);


    pthread_mutex_lock(&hFifo->mutex);
    flush = hFifo->flush;
    pthread_mutex_unlock(&hFifo->mutex);


    if (flush) {
        return FIFO_EFLUSH;
    }


    numBytes = read(hFifo->pipes[0], *ptrPtr, sizeof(void*));


    if (numBytes != sizeof(void*)) {
        pthread_mutex_lock(&hFifo->mutex);
        flush = hFifo->flush;
        if (flush) {
            hFifo->flush = 0;
        }
        pthread_mutex_unlock(&hFifo->mutex);


        if (flush) {
            return FIFO_EFLUSH;
        }
        return FIFO_EIO;
    }


    pthread_mutex_lock(&hFifo->mutex);
    hFifo->numBufs--;
    pthread_mutex_unlock(&hFifo->mutex);


    return FIFO_EOK;
}


/******************************************************************************
 * Fifo_flush
 ******************************************************************************/
int Fifo_flush(Fifo_Handle hFifo)
{
    char ch = 0xff;


    //assert(hFifo);


    pthread_mutex_lock(&hFifo->mutex);
    hFifo->flush = 1;
    pthread_mutex_unlock(&hFifo->mutex);


    /* Make sure any Fifo_get() calls are unblocked */
    if (write(hFifo->pipes[1], &ch, 1) != 1) {
        return FIFO_EIO;
    }


    return FIFO_EOK;
}


/******************************************************************************
 * Fifo_put
 ******************************************************************************/
int Fifo_put(Fifo_Handle hFifo, void* ptr)
{
    //assert(hFifo);
    //assert(ptr);


    pthread_mutex_lock(&hFifo->mutex);
    hFifo->numBufs++;
    pthread_mutex_unlock(&hFifo->mutex);


    if (write(hFifo->pipes[1], &ptr, sizeof(void*)) != sizeof(void*)) {
        return FIFO_EIO;
    }


    return FIFO_EOK;
}


/******************************************************************************
 * Fifo_getNumEntries
 ******************************************************************************/
int Fifo_getNumEntries(Fifo_Handle hFifo)
{
    int numEntries;


    //assert(hFifo);


    pthread_mutex_lock(&hFifo->mutex);
    numEntries = hFifo->numBufs;
    pthread_mutex_unlock(&hFifo->mutex);


    return numEntries;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值