log.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
- /*
- * Source file for diva log facility
- *
- * Copyright (C) Eicon Technology Corporation, 2000.
- *
- * Eicon File Revision : 1.5
- *
- * This software may be used and distributed according to the terms
- * of the GNU General Public License, incorporated herein by reference.
- *
- */
- #include "sys.h"
- #include "idi.h"
- #include "divas.h"
- #include "adapter.h"
- #include "divalog.h"
- #include "uxio.h"
- /*Counter to monitor number of messages */
- static int m_count;
-
- #define MAX_BUFFERED_MSGS (1000)
- /* Our Linked List Structure to hold message */
- typedef struct klog_link{
- klog_t klog;
- struct klog_link *next;
- }KNODE;
- /* First & Last structures in list*/
- KNODE *head;
- KNODE *tail;
- /*
- * retrieve message from FIFO buffer
- * returns NULL if buffer empty
- * otherwise returns pointer to entry
- */
- char *DivasLogFifoRead(void)
- {
- KNODE *old_head;
- if(head==NULL)
- {
- /* Buffer Empty - No Messages */
- return NULL;
- }
- m_count--;
- /* Keep track of message to be read & increment to next message*/
- old_head = head;
- head = head->next;
- /*Return ptr to Msg */
- return((char *)old_head);
- }
- /*
- * write message into FIFO buffer
- */
- void DivasLogFifoWrite(char *entry, int length)
- {
- KNODE *new_klog;
- if(head == NULL)
- {
- /* No Entries in Log */
- tail=NULL;
- m_count=0;
- new_klog=UxAlloc(sizeof(KNODE));
- if(new_klog==NULL)
- {
- return;
- }
- m_count++;
- memset(new_klog, 0, sizeof(KNODE));
- /* Set head & tail to point to the new Msg Struct */
- head=tail=new_klog;
- tail->next=NULL;
- }
- else
- {
- new_klog=UxAlloc(sizeof(KNODE));
-
- if(new_klog==NULL)
- {
- return;
- }
- m_count++;
- memset(new_klog, 0, sizeof(KNODE));
- /* Let last Msg Struct point to new Msg Struct & inc tail */
- tail->next=new_klog;
- tail=new_klog;
- tail->next=NULL;
- }
- if (length > sizeof(klog_t))
- {
- length = sizeof(klog_t);
- }
- memcpy(&tail->klog, entry, length);
- return;
- }
- /*
- * DivaslogFifoEmpty:return TRUE if FIFO buffer is empty,otherwise FALSE
- */
- int DivasLogFifoEmpty(void)
- {
- return (m_count == 0);
- }
- /*
- *DivasLogFifoFull:return TRUE if FIFO buffer is full,otherwise FALSE
- */
- int DivasLogFifoFull(void)
- {
- return (m_count == MAX_BUFFERED_MSGS);
- }
- /*
- * generate an IDI log entry
- */
- void DivasLogIdi(card_t *card, ENTITY *e, int request)
- {
- klog_t klog;
- memset(&klog, 0, sizeof(klog));
- klog.time_stamp = UxTimeGet();
- klog.length = sizeof(ENTITY) > sizeof(klog.buffer) ?
- sizeof(klog.buffer) : sizeof(ENTITY);
- klog.card = (int) (card - DivasCards);
- klog.type = request ? KLOG_IDI_REQ : KLOG_IDI_CALLBACK;
- klog.code = 0;
- memcpy(klog.buffer, e, klog.length);
- /* send to the log driver and return */
- DivasLogAdd(&klog, sizeof(klog));
- return;
- }