int main(int argc, char *argv[]) { sem_t *mutex; int i=1; pid_t pid = fork(); if(pid) { while(i<10) { printf("waiting [%d]......\n", getpid()); try_lock(&mutex); // printf("get mutex, process:%s, pid:%d, i:%d\n", argv[0], getpid(), i); printf("lock [%d]......\n", getpid()); sleep(1); i++; printf("unlock [%d]......\n", getpid()); try_unlock(mutex); } } else { while(i<10) { printf("waiting [%d]......\n", getpid()); try_lock(&mutex); // printf("get mutex, process:%s, pid:%d, i:%d\n", argv[0], getpid(), i); printf("lock [%d]......\n", getpid()); sleep(1); i++; printf("unlock [%d]......\n", getpid()); try_unlock(mutex); } } return 0; }
error_code sys_mutex_unlock(ppu_thread& ppu, u32 mutex_id) { sys_mutex.trace("sys_mutex_unlock(mutex_id=0x%x)", mutex_id); const auto mutex = idm::check<lv2_obj, lv2_mutex>(mutex_id, [&](lv2_mutex& mutex) { return mutex.try_unlock(ppu.id); }); if (!mutex) { return CELL_ESRCH; } if (mutex.ret == CELL_EBUSY) { std::lock_guard lock(mutex->mutex); if (auto cpu = mutex->reown<ppu_thread>()) { mutex->awake(*cpu); } } else if (mutex.ret) { return mutex.ret; } return CELL_OK; }
static BOOL test_one(struct smbcli_state *cli[NSERVERS][NCONNECTIONS], char *nfs[NSERVERS], int fnum[NSERVERS][NUMFSTYPES][NCONNECTIONS][NFILES], struct record *rec) { uint_t conn = rec->conn; uint_t f = rec->f; uint_t fstype = rec->fstype; uint_t start = rec->start; uint_t len = rec->len; uint_t r1 = rec->r1; uint_t r2 = rec->r2; enum brl_type op; int server; BOOL ret[NSERVERS]; if (r1 < READ_PCT) { op = READ_LOCK; } else { op = WRITE_LOCK; } if (r2 < LOCK_PCT) { /* set a lock */ for (server=0;server<NSERVERS;server++) { ret[server] = try_lock(cli[server][conn], fstype, fnum[server][fstype][conn][f], start, len, op); } if (showall || ret[0] != ret[1]) { printf("lock conn=%u fstype=%u f=%u range=%u:%u(%u) op=%s -> %u:%u\n", conn, fstype, f, start, start+len-1, len, op==READ_LOCK?"READ_LOCK":"WRITE_LOCK", ret[0], ret[1]); } if (ret[0] != ret[1]) return False; } else if (r2 < LOCK_PCT+UNLOCK_PCT) { /* unset a lock */ for (server=0;server<NSERVERS;server++) { ret[server] = try_unlock(cli[server][conn], fstype, fnum[server][fstype][conn][f], start, len); } if (showall || (!hide_unlock_fails && (ret[0] != ret[1]))) { printf("unlock conn=%u fstype=%u f=%u range=%u:%u(%u) -> %u:%u\n", conn, fstype, f, start, start+len-1, len, ret[0], ret[1]); } if (!hide_unlock_fails && ret[0] != ret[1]) return False; } else { /* reopen the file */ for (server=0;server<NSERVERS;server++) { try_close(cli[server][conn], fstype, fnum[server][fstype][conn][f]); fnum[server][fstype][conn][f] = try_open(cli[server][conn], nfs[server], fstype, FILENAME, O_RDWR|O_CREAT); if (fnum[server][fstype][conn][f] == -1) { printf("failed to reopen on share1\n"); return False; } } if (showall) { printf("reopen conn=%u fstype=%u f=%u\n", conn, fstype, f); } } return True; }