This is midibuffer.c in view mode; [Download] [Up]
#include "midibuffer.h" #include <stdio.h> MIevent_list MIcdr(MIevent_list list) { if (list) return list->next; } MIevent *MIcar(MIevent_list list) { if (list) return list->event; else { perror("Attempt to take the CAR of NIL\n"); exit(-1); } } MIevent *MIcons(MIevent *msg,MIevent_list list) { MIevent_list result; result = MIlist_alloc(); result->event = msg; result->next = list; return result; } MIevent *MIQhead(MIevent_queue *q) { if (q->first_event) { #ifdef DEBUG0 fprintf(stderr,"MIQhead: %ld\n", q->first_event->event); #endif return q->first_event->event; } } void MIfree (MIevent *event) { if ((event->t == MISYSEX) && SYSEX_MESSAGE(*event)) free(SYSEX_MESSAGE(*event)); free(event); } MIevent *MIQpop(MIevent_queue *q) { MIevent_list fe,next,last; MIevent *ev; #ifdef DEBUG0 fprintf(stderr,"IN MIQpop - length: %d\n",MIQlength(q)); #endif fe = q->first_event; if (fe) { if (fe == q->last_event) { #ifdef DEBUG0 fprintf(stderr,"Popped event was the only one\n"); #endif q->first_event = (MIevent_list) NULL; q->last_event = (MIevent_list) NULL; } else q->first_event = fe->next; fe->next = q->first_free; q->first_free = fe; ev = fe->event; fe->event = (MIevent *) NULL; q->length--; } #ifdef DEBUG0 fprintf(stderr,"OUT MIQpop - length: %d\n",MIQlength(q)); #endif #ifdef DEBUG_BUFFER fprintf(stderr,"MIQpop: %ld\n", fe); #endif if (fe) return ev; else return (MIevent *) NULL; } void MIQpopfree(MIevent_queue *q) { MIevent_list fe,next,last; MIevent *recycle; #ifdef DEBUG0 fprintf(stderr,"IN MIQpopfree - length: %d\n",MIQlength(q)); #endif fe = q->first_event; if (fe) { if (fe == q->last_event) { #ifdef DEBUG0 fprintf(stderr,"Popped event was the only one\n"); #endif q->first_event = (MIevent_list) NULL; q->last_event = (MIevent_list) NULL; } else q->first_event = fe->next; fe->next = q->first_recyclable; q->first_recyclable = fe; recycle = fe->event; if (recycle->t == MISYSEX && SYSEX_MESSAGE(*recycle)) free(SYSEX_MESSAGE(*recycle)); q->length--; } #ifdef DEBUG0 fprintf(stderr,"OUT MIQpopfree - length: %d\n",MIQlength(q)); #endif } MIevent_list MIlist_alloc() { MIevent_list result; result = (MIevent_list) malloc(sizeof(MIevent_cell)); /*result->event = (MIevent *) malloc(MSGBUFFERSIZE); */ /*result->next = (MIevent_list) NULL;*/ } MIevent_list MIQextend(MIevent_queue *q) { MIevent_list next; next = MIlist_alloc(); next->next = q->first_free; q->first_free = next; /*q->last_event->next = next for moebius */ return next; } MIevent_list MIQrecycle(MIevent_queue *q, MIevent* event) { MIevent_list recycle_cell; recycle_cell = q->first_free; if (recycle_cell) { recycle_cell->event = event; q->first_free = recycle_cell->next; recycle_cell->next = q->first_recyclable; q->first_recyclable = recycle_cell; if ((event->t == MISYSEX) && SYSEX_MESSAGE(*event)) free(SYSEX_MESSAGE(*event)); } else MIfree(event); return recycle_cell; } MIevent *MIQreserve(MIevent_queue *q) { MIevent *recycle; MIevent_list recycle_cell; #ifdef DEBUG fprintf(stderr,"IN MIQreserve - length: %d\n",MIQlength(q)); #endif recycle_cell = q->first_recyclable; if (recycle_cell) { recycle = recycle_cell->event; q->first_recyclable = recycle_cell->next; recycle_cell->next = q->first_free; q->first_free = recycle_cell; } else recycle = (MIevent *) malloc(sizeof(MIevent)); #ifdef DEBUG_BUFFER fprintf(stderr,"OUT MIQreserve - length: %d buffer: %ld\n",MIQlength(q), recycle); #endif return recycle; } int MIQlength(MIevent_queue *q) { int i = 0; MIevent_list cell; for(cell = q->first_event;cell; cell= cell->next) i++; return i; } MIevent_list MIQpush(MIevent_queue *q, MIevent* event) { MIevent_list fe,newfirst,oldlast; #ifdef DEBUG fprintf(stderr,"IN MIQpush - length: %d\n",MIQlength(q)); #endif fe = q->first_free; if (fe) q->first_free = fe->next; else fe = MIlist_alloc(); /* fe->next = (MIevent_list) NULL;*/ fe->event = event; oldlast = q->last_event; if (oldlast) oldlast->next = fe; else q->first_event = fe; q->last_event = fe; q->length++; #ifdef DEBUG fprintf(stderr,"OUT MIQpush - length: %d\n",MIQlength(q)); #endif return fe; } /* MIevent_list MIQalloc(MIevent_queue *q) { MIevent_list fe; fe = q->first_event; if (fe) { if (fe->next == q->first_free) q->first_event = (MIevent_list) NULL; else q->first_event = fe->next; return q->first_event->event; } } */ void MIQrelease(MIevent_queue *q) { MIevent_list nextcell,cell; for(cell=q->first_free;cell;cell=nextcell) { nextcell = cell->next; free(cell); } for(cell=q->first_recyclable;cell;cell=nextcell) { nextcell = cell->next; MIfree(cell->event); free(cell); } q->first_free = (MIevent_list) NULL; q->first_recyclable = (MIevent_list) NULL; } static struct sembuf lock_op = { 0, -1, 0}; static struct sembuf unlock_op = { 0, 1, 0}; MIevent_queue *MIQnew(int size, BOOL shared) { MIevent_list prevcell,nextcell = (MIevent_list) NULL; MIevent_queue *result; int i; static short lock_initial_state = 1; result = (MIevent_queue *) malloc(sizeof(MIevent_queue)); result->name = ""; result->first_event = (MIevent_list) NULL; result->last_event = (MIevent_list) NULL; result->first_recyclable = (MIevent_list) NULL; prevcell = MIlist_alloc(); result->first_free = prevcell; /* result->last_free = prevcell;*/ for(i=1;i<size;i++) { nextcell = MIlist_alloc(); prevcell->next = nextcell; prevcell = nextcell; } prevcell->next = (MIevent_list) NULL; if (shared) { if ((result->MIq_lock = semget (IPC_PRIVATE, 1, (SEM_A | SEM_R))) == -1) { perror ("Could not create a lock for a MIQueue "); MIQrelease(result); free(result); return (MIevent_queue *) 0; } if (semctl (result->MIq_lock, 0, SETALL, (ushort *) &lock_initial_state) == -1) { perror ("Could not set the initial value of a MIQueue lock "); MIQrelease(result); free(result); return (MIevent_queue *) 0; } } MIQclose_done(result); return result; } char * MIQname(MIevent_queue *q) { return q->name; } void MIQset_name(MIevent_queue *q, char *name) { q->name = name; } BOOL MIQlock(MIevent_queue *q) { #ifdef DEBUG int opresult; fprintf(stderr,"Locking MIQueue %s(%ld)\n", q->name, q); if ((opresult = semop (q->MIq_lock, &lock_op, 1)) == -1) { #else if (semop (q->MIq_lock, &lock_op, 1) == -1) { #endif fprintf(stderr,"Could not lock MIQueue %s(%ld)\n", q->name,q); return -1; } #ifdef DEBUG_WAIT else fprintf(stderr,"Lock of MIQueue %s(%ld) suceeded\n", q->name, q); #endif return KERN_SUCCESS; } BOOL MIQunlock(MIevent_queue *q) { #ifdef DEBUG int opresult; fprintf(stderr,"Unlocking MIQueue %s(%ld)\n", q->name, q); if ((opresult = semop (q->MIq_lock, &unlock_op, 1)) == -1) { #else if (semop (q->MIq_lock, &unlock_op, 1) == -1) { #endif fprintf(stderr,"Could not unlock MIQueue %s(%ld)\n", q->name,q); return -1; } #ifdef DEBUG_WAIT else fprintf(stderr,"Unlock of MIQueue %s(%ld) suceeded\n", q->name, q); #endif return KERN_SUCCESS; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.