diff options
Diffstat (limited to 'log.c')
-rw-r--r-- | log.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -43,9 +43,9 @@ struct logheader { struct { struct spinlock lock; - struct sleeplock sleeplock; int start; int size; + int intrans; int dev; struct logheader lh; } log; @@ -60,7 +60,6 @@ initlog(void) struct superblock sb; initlock(&log.lock, "log"); - initsleeplock(&log.sleeplock); readsb(ROOTDEV, &sb); log.start = sb.size - sb.nlog; log.size = sb.nlog; @@ -134,7 +133,10 @@ void begin_trans(void) { acquire(&log.lock); - acquire_sleeplock(&log.sleeplock, &log.lock); + while (log.intrans) { + sleep(&log, &log.lock); + } + log.intrans = 1; release(&log.lock); } @@ -147,8 +149,10 @@ commit_trans(void) log.lh.n = 0; write_head(); // Reclaim log } + acquire(&log.lock); - release_sleeplock(&log.sleeplock); + log.intrans = 0; + wakeup(&log); release(&log.lock); } @@ -167,7 +171,7 @@ log_write(struct buf *b) if (log.lh.n >= LOGSIZE || log.lh.n >= log.size - 1) panic("too big a transaction"); - if (!acquired_sleeplock(&log.sleeplock)) + if (!log.intrans) panic("write outside of trans"); // cprintf("log_write: %d %d\n", b->sector, log.lh.n); |