11e4bc969Sminshall /* 2bb8d19bbSbostic * Copyright (c) 1988 Regents of the University of California. 3bb8d19bbSbostic * All rights reserved. 4bb8d19bbSbostic * 5*068cc2b8Sbostic * %sccs.include.redist.c% 6bb8d19bbSbostic * 7*068cc2b8Sbostic * @(#)ring.h 1.9 (Berkeley) 06/01/90 8bb8d19bbSbostic */ 9bb8d19bbSbostic 10bb8d19bbSbostic /* 1158ab6e53Sminshall * This defines a structure for a ring buffer. 121e4bc969Sminshall * 1358ab6e53Sminshall * The circular buffer has two parts: 141e4bc969Sminshall *((( 1558ab6e53Sminshall * full: [consume, supply) 1658ab6e53Sminshall * empty: [supply, consume) 171e4bc969Sminshall *]]] 181e4bc969Sminshall * 191e4bc969Sminshall */ 201e4bc969Sminshall typedef struct { 2158ab6e53Sminshall char *consume, /* where data comes out of */ 2258ab6e53Sminshall *supply, /* where data comes in to */ 231e4bc969Sminshall *bottom, /* lowest address in buffer */ 24cc687d58Sminshall *top, /* highest address+1 in buffer */ 25cc687d58Sminshall *mark; /* marker (user defined) */ 261e4bc969Sminshall int size; /* size in bytes of buffer */ 2758ab6e53Sminshall u_long consumetime, /* help us keep straight full, empty, etc. */ 2858ab6e53Sminshall supplytime; 291e4bc969Sminshall } Ring; 301e4bc969Sminshall 311e4bc969Sminshall /* Here are some functions and macros to deal with the ring buffer */ 321e4bc969Sminshall 331e4bc969Sminshall 341e4bc969Sminshall #if defined(LINT_ARGS) 351e4bc969Sminshall 3601ec75b3Sminshall /* Initialization routine */ 3701ec75b3Sminshall extern int 3801ec75b3Sminshall ring_init(Ring *ring, char *buffer, int count); 3901ec75b3Sminshall 401e4bc969Sminshall /* Data movement routines */ 411e4bc969Sminshall extern void 4258ab6e53Sminshall ring_supply_data(Ring *ring, char *buffer, int count), 4358ab6e53Sminshall ring_consume_data(Ring *ring, char *buffer, int count); 441e4bc969Sminshall 451e4bc969Sminshall /* Buffer state transition routines */ 461e4bc969Sminshall extern void 4758ab6e53Sminshall ring_supplied(Ring *ring, int count), 4858ab6e53Sminshall ring_consumed(Ring *ring, int count); 491e4bc969Sminshall 501e4bc969Sminshall /* Buffer state query routines */ 511e4bc969Sminshall extern int 521e4bc969Sminshall ring_empty_count(Ring *ring), 531e4bc969Sminshall ring_empty_consecutive(Ring *ring), 5458ab6e53Sminshall ring_full_count(Ring *ring), 5558ab6e53Sminshall ring_full_consecutive(Ring *ring); 561e4bc969Sminshall 572686cc61Sminshall #else /* LINT_ARGS */ 582686cc61Sminshall extern int 592686cc61Sminshall ring_init(); 602686cc61Sminshall 612686cc61Sminshall extern void 622686cc61Sminshall ring_supply_data(), 632686cc61Sminshall ring_consume_data(); 642686cc61Sminshall 652686cc61Sminshall extern void 662686cc61Sminshall ring_supplied(), 672686cc61Sminshall ring_consumed(); 682686cc61Sminshall 692686cc61Sminshall extern void 702686cc61Sminshall ring_clear_mark(), 712686cc61Sminshall ring_mark(); 722686cc61Sminshall 732686cc61Sminshall extern int 742686cc61Sminshall ring_empty_count(), 752686cc61Sminshall ring_empty_consecutive(), 762686cc61Sminshall ring_full_count(), 772686cc61Sminshall ring_full_consecutive(); 781e4bc969Sminshall #endif /* defined(LINT_ARGS) */ 79