int tup_lock_init(void) { sh_lock = openat(tup_top_fd(), TUP_SHARED_LOCK, O_RDWR); if(sh_lock < 0) { perror(TUP_SHARED_LOCK); return -1; } if(tup_flock(sh_lock) < 0) { return -1; } obj_lock = openat(tup_top_fd(), TUP_OBJECT_LOCK, O_RDWR); if(obj_lock < 0) { perror(TUP_OBJECT_LOCK); return -1; } if(tup_flock(obj_lock) < 0) { return -1; } tri_lock = openat(tup_top_fd(), TUP_TRI_LOCK, O_RDWR); if(tri_lock < 0) { perror(TUP_TRI_LOCK); return -1; } return 0; }
void tup_lock_exit(void) { tup_unflock(obj_lock); close(obj_lock); /* Wait for the monitor to pick up the object lock */ tup_flock(tri_lock); tup_unflock(tri_lock); close(tri_lock); tup_unflock(sh_lock); close(sh_lock); }
int tup_lock_init(void) { int ret; if(tup_lock_open(TUP_SHARED_LOCK, &sh_lock) < 0) return -1; ret = tup_try_flock(sh_lock); if(ret > 0) { printf("Waiting for another tup process (or an autoupdate) to finish...\n"); ret = tup_flock(sh_lock); } if(ret < 0) { return -1; } if(tup_lock_open(TUP_OBJECT_LOCK, &obj_lock) < 0) return -1; if(tup_flock(obj_lock) < 0) return -1; if(tup_lock_open(TUP_TRI_LOCK, &tri_lock) < 0) return -1; return 0; }