| #define MALLOC_SEM   1  /* Semaphore No. for malloc */ #define STRTOK_SEM   2  /* Semaphore No. for strtok */ #define FILE_TBL_SEM 3  /* Semaphore No. for fopen  */ #define MBRLEN_SEM   4  /* Semaphore No. for mbrlen */ #define FPSWREG_SEM  5  /* Semaphore No. for FPSW register */ #define FILES_SEM    6  /* Semaphore No. for _Files */ #define SEMSIZE     26  /* FILES_SEM + _nfiles (assumed _nfiles=20) */   #define TRUE 1 #define FALSE 0 #define OK 1 #define NG 0 extern long *errno_addr(void); extern long wait_sem(long); extern long signal_sem(long); static long sem_errno; static int force_fail_signal_sem = FALSE; static int semaphore[SEMSIZE];   /******************************************************************************/ /*                  errno_addr: Acquisition of errno address                  */ /*                        Return value: errno address                         */ /******************************************************************************/ long *errno_addr(void) {    /* Return the errno address of the current task */     return (&sem_errno); }   /******************************************************************************/ /*           wait_sem: Defines the specified numbers of semaphores            */ /*                       Return value: OK(=1) (Normal)                        */ /*                                     NG(=0) (Error)                         */ /******************************************************************************/ long wait_sem(long semnum) /* Semaphore ID */ {    if((0 < semnum) && (semnum < SEMSIZE)) {        if(semaphore[semnum] == FALSE) {            semaphore[semnum] = TRUE;             return(OK);         }     }     return(NG); }   /******************************************************************************/ /*          signal_sem: Releases the specified numbers of semaphores          */ /*                       Return value: OK(=1) (Normal)                        */ /*                                     NG(=0) (Error)                         */ /******************************************************************************/ long signal_sem(long semnum) /* Semaphore ID */ {    if(!force_fail_signal_sem) {        if((0 <= semnum) && (semnum < SEMSIZE)) {            if( semaphore[semnum] == TRUE ) {                semaphore[semnum] = FALSE;                 return(OK);             }         }     }     return(NG); } |