This is midi_threads.h in view mode; [Download] [Up]
#pragma once
#include "semaphores.h"
#include <sys/time.h>
#include <unistd.h>
#include <task.h>
#include "taskblocks.h"
/* #include <midi.h> */
#include <midiio.h>
#include "MIPortedQueue.h"
typedef struct {
MIPortedQueue *queue;
fd_set fdset;
int nready;
kern_return_t result;
} midi_notifier_block;
typedef struct midi_daemon_block {
MIPortedQueue *queue;
MIevent *event;
fd_set fdset;
int nready;
kern_return_t result;
int i;
BOOL must_close;
BOOL *to_close;
int smpte[4];
BOOL smpteok[8];
struct sembuf *semops;
struct sigaction *act;
struct sigaction *old_act;
sigset_t mask;
sigset_t old_mask; /* Warning: No nested undo_on_signal support */
sigaction_stack *actions;
int retval;
} midi_daemon_block;
extern BOOL send_midi(MIevent_queue *q,MIevent *the_event);
extern void midi_sender_process_request(midi_daemon_block *my);
extern void midi_sender(midi_daemon_block *my);
extern void midi_receiver(midi_daemon_block *my);
extern void midi_receive_callback(midi_daemon_block *my);
extern midi_daemon_block *MTB_new(MIPortedQueue *q);
extern void **taskblocks;
extern volatile int kids;
extern volatile int ntasks;
extern void init_threads();
extern std_task_block *my;
extern int maxtasks;
# if defined(_BSD_COMPAT) || defined(_BSD_SIGNALS)
#define HANDLER_RETURN_TYPE int
#else
#define HANDLER_RETURN_TYPE void
#endif
#define HANDLER_TYPE HANDLER_RETURN_TYPE (*)(int)
#define HANDLER(x) HANDLER_RETURN_TYPE (*x)(int)
#define next_handler(sig) ((* ((HANDLER_TYPE) (SASpop(my->actions)->sa_handler)))(sig))
extern tid_t create_task (char *name, void (*entry)(), void *arg,int sched);
extern HANDLER_RETURN_TYPE sighup_handler (int sig);
#define MASK_ALL ((sigset_t) -1)
extern void init_std_sigaction(struct sigaction *act,int sig,HANDLER_TYPE);
extern int std_sigaction(int sig,HANDLER_TYPE, struct sigaction *act);
#define push_sigaction(sig,act) { \
my->old_act = SASreserve(my->actions); \
for(;sigaction(sig,act,my->old_act); \
sigaction(sig,act,my->old_act)); \
SASpush(my->actions,my->old_act); \
}
#define push_handler(sig,handler) { \
my->act = SASreserve(my->actions); \
init_std_sigaction(my->act,sig,handler); \
push_sigaction(sig,my->act); \
}
#define pop_sigaction(sig,act) { \
my->old_act = SASpop(my->actions); \
for(;sigaction(sig,my->old_act,act); \
sigaction(sig,my->old_act,act)); \
}
#define undo_on_signal_masking(sig,handler,handler_sigmask_var,mask_var,expr) { \
my->act = SASreserve(my->actions); \
my->act->sa_handler = handler; \
my->act->sa_mask = sigmask(sig) || (handler_sigmask_var); \
my->act->sa_flags = 0; \
my->mask = sigmask(sig) || (mask_var); \
for(;sigprocmask(SIG_BLOCK,&(my->mask),&(my->old_mask)); \
sigprocmask(SIG_BLOCK,&(my->mask),&(my->old_mask))) \
perror("Problem with sigprocmask, trying again...\n"); \
expr; \
push_sigaction(sig,my->act) \
for(;sigprocmask(SIG_SETMASK,&(my->old_mask),NULL); \
sigprocmask(SIG_SETMASK,&(my->old_mask),NULL)) \
perror("Problem with sigprocmask, trying again...\n"); \
}
#define undo_on_signal(sig,handler,expr) \
undo_on_signal_masking(sig,handler,0,MASK_ALL,expr)
#define undo_on_sighup(handler,expr) undo_on_signal(SIGHUP,handler,expr);
#define unhandling_signal_masking(sig,mask_var,expr) { \
my->mask = sigmask(sig) || (mask_var); \
for(;sigprocmask(SIG_BLOCK,&(my->mask),&(my->old_mask)); \
sigprocmask(SIG_BLOCK,&(my->mask),&(my->old_mask))) \
perror("Problem with sigprocmask, trying again...\n"); \
expr; \
pop_sigaction(sig,my->act) \
for(;sigprocmask(SIG_SETMASK,&(my->old_mask),NULL); \
sigprocmask(SIG_SETMASK,&(my->old_mask),NULL)) \
perror("Problem with sigprocmask, trying again...\n"); \
SASrecycle(my->actions,my->act); \
}
#define unhandling_signal(sig,expr) unhandling_signal_masking(sig,MASK_ALL,expr)
#define unhandling_sighup(expr) unhandling_signal(SIGHUP,expr)
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.