64 lines
1.3 KiB
C
64 lines
1.3 KiB
C
#include <stdint.h>
|
|
|
|
#define MAX_SEM 100
|
|
#define MAX_NAME 100
|
|
|
|
void enter_region(uint32_t * lock);
|
|
void leave_region(uint32_t * lock);
|
|
static uint32_t semLock;
|
|
|
|
typedef struct sem {
|
|
unsigned int value;
|
|
char name[MAX_NAME];
|
|
// cola FIFO
|
|
} sem_t;
|
|
|
|
// Podemos manejarnos con indices.
|
|
static sem_t semaphores[MAX_SEM];
|
|
/*
|
|
int semOpen(char * name, unsigned int value) {}
|
|
|
|
// int semClose(char * name) {}
|
|
int semClose(char semaphore) {}
|
|
|
|
int semInit(char semaphore, unsigned int value) {}
|
|
|
|
int semWait(char semaphore) {}
|
|
|
|
int semPost(char semaphore) {}
|
|
*/
|
|
|
|
// o pasando la estructura de sem. esta es la q hace posix
|
|
sem_t * semOpen(char * name, unsigned int value) {
|
|
enter_region(&semLock);
|
|
leave_region(&semLock);
|
|
}
|
|
|
|
int semClose(sem_t * semaphore) {
|
|
enter_region(&semLock);
|
|
leave_region(&semLock);
|
|
}
|
|
|
|
int semWait(sem_t * semaphore) {
|
|
enter_region(&semLock);
|
|
|
|
if (semaphore->value > 0) {
|
|
semaphore->value--;
|
|
}
|
|
else {
|
|
// leave_region(&semLock);
|
|
// enter_region(&semLock);
|
|
// semaphore->value--;
|
|
|
|
// mandarlo a noni. es decir bloquearlo y solo despertarlo cuando alguien hace post
|
|
// block(con el pid)
|
|
//
|
|
}
|
|
|
|
leave_region(&semLock);
|
|
}
|
|
|
|
int semPost(sem_t * semaphore) {
|
|
enter_region(&semLock);
|
|
leave_region(&semLock);
|
|
} |