| void showlockqueue(struct prioritylock* lk) { | |
| acquire(&lk->lk); | |
| cprintf("["); | |
| for (int i = 0; i < lk->inqueue; i++) { | |
| cprintf("%d", lk->lockreq[i]); | |
| if (i != lk->inqueue - 1) | |
| cprintf(", "); | |
| } | |
| cprintf("]\n"); | |
| release(&lk->lk); | |
| } | |
| void enqueue(struct prioritylock* lk, int pid) { | |
| if (lk->inqueue == NPROC) | |
| return; | |
| int pos = 0; | |
| while (lk->lockreq[pos] > pid) | |
| pos++; | |
| for (int i = lk->inqueue; i > pos; i--) { | |
| lk->lockreq[i] = lk->lockreq[i - 1]; | |
| } | |
| lk->lockreq[pos] = pid; | |
| lk->inqueue++; | |
| } | |
| int isprior(struct prioritylock* lk) { | |
| if (lk->inqueue == 0 || lk->lockreq[0] != myproc()->pid) { | |
| return 0; | |
| } | |
| for (int i = 0; i < lk->inqueue - 1; i++) { | |
| lk->lockreq[i] = lk->lockreq[i + 1]; | |
| } | |
| lk->lockreq[lk->inqueue - 1] = 0; | |
| lk->inqueue--; | |
| return 1; | |
| } | |
| void initprioritylock(struct prioritylock* lk, char* name) { | |
| initlock(&lk->lk, "p_s_lock"); | |
| lk->name = name; | |
| lk->locked = 0; | |
| lk->pid = 0; | |
| memset(lk->lockreq, 0, NPROC); | |
| } | |
| void acquirepriority(struct prioritylock* lk) { | |
| enqueue(lk, myproc()->pid); | |
| while (1) { | |
| acquire(&lk->lk); | |
| if (lk->locked == 1 || !isprior(lk)) { | |
| release(&lk->lk); | |
| continue; | |
| } | |
| else | |
| break; | |
| } | |
| lk->locked = 1; | |
| lk->pid = myproc()->pid; | |
| release(&lk->lk); | |
| } | |
| void releasepriority(struct prioritylock* lk) { | |
| acquire(&lk->lk); | |
| lk->locked = 0; | |
| lk->pid = 0; | |
| release(&lk->lk); | |
| } | |
| int isprioritylocked(struct prioritylock* lk) { | |
| int r; | |
| acquire(&lk->lk); | |
| r = lk->locked; | |
| release(&lk->lk); | |
| return r; | |
| } | |
| int isholdingpriority(struct prioritylock* lk) { | |
| int r; | |
| acquire(&lk->lk); | |
| r = lk->locked && (lk->pid == myproc()->pid); | |
| release(&lk->lk); | |
| return r; | |
| } | |
Xet Storage Details
- Size:
- 2.05 kB
- Xet hash:
- e5f7f34154fcdc918bd684b7f4fe52bec2e97252fd45273e9da7794b23f2c468
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.