Skip to content

Instantly share code, notes, and snippets.

@piscisaureus
Created October 2, 2012 00:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save piscisaureus/3815525 to your computer and use it in GitHub Desktop.
Save piscisaureus/3815525 to your computer and use it in GitHub Desktop.
typedef struct {
int fds[2];
} lamelock_t;
void lamelock_release(lamelock_t* lock);
int lamelock_init(lamelock_t* lock) {
char data = 42;
if (pipe(&lock->fds) < 0)
return -1;
if (lamelock_release(lock) < 0) {
close(lock->fds[0]);
close(lock->fds[1]);
return -1;
}
return 0;
}
void lamelock_destroy(lamelock_t* lock) {
close(lock->fds[0]);
close(lock->fds[1]);
}
void lamelock_acquire(lamelock_t* lock) {
int r;
char data;
do {
r = read(lock->fds[1], &data, sizeof data);
} (while r < 0 && errno == EINTR);
if (r < 0)
return -1;
return 0;
}
void lamelock_release(lamelock_t* lock) {
char data = 42;
int r;
do {
r = write(lock->fds[0], &data, sizeof data);
} while (r < 0 && errno == EINTR);
if (r < 0)
return -1;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment