XINU
Functions
rdswrite.c File Reference
#include <xinu.h>
Include dependency graph for rdswrite.c:

Go to the source code of this file.

Functions

devcall rdswrite (struct dentry *devptr, char *buff, int32 blk)
 

Function Documentation

◆ rdswrite()

devcall rdswrite ( struct dentry devptr,
char *  buff,
int32  blk 
)

Definition at line 9 of file rdswrite.c.

References dentry::dvminor, FALSE, getpid(), memcpy(), OK, rdscblk::rd_availsem, rdbuff::rd_blknum, RD_BLKSIZ, rdbuff::rd_block, rdscblk::rd_chnext, rdscblk::rd_comproc, rdscblk::rd_comruns, rdscblk::rd_ctnext, rdbuff::rd_next, rdbuff::rd_op, RD_OP_WRITE, RD_OPEN, rdbuff::rd_pid, rdbuff::rd_prev, rdbuff::rd_refcnt, rdscblk::rd_reqsem, rdscblk::rd_rhnext, rdscblk::rd_rtnext, rdscblk::rd_rtprev, rdscblk::rd_state, rdbuff::rd_status, RD_VALID, rdsbufalloc(), rdstab, resume(), semcount(), semreset(), signal(), SYSERR, and TRUE.

14 {
15  struct rdscblk *rdptr; /* Pointer to control block */
16  struct rdbuff *bptr; /* Pointer to buffer on a list */
17  struct rdbuff *pptr; /* Ptr to previous buff on list */
18  struct rdbuff *nptr; /* Ptr to next buffer on list */
19  bool8 found; /* Was buff found during search?*/
20 
21  /* If device not currently in use, report an error */
22 
23  rdptr = &rdstab[devptr->dvminor];
24  if (rdptr->rd_state != RD_OPEN) {
25  return SYSERR;
26  }
27 
28  /* Ensure rdsprocess is runnning */
29 
30  if ( ! rdptr->rd_comruns ) {
31  rdptr->rd_comruns = TRUE;
32  resume(rdptr->rd_comproc);
33  }
34 
35  /* If request queue already contains a write request */
36  /* for the block, replace the contents */
37 
38  bptr = rdptr->rd_rhnext;
39  while (bptr != (struct rdbuff *)&rdptr->rd_rtnext) {
40  if ( (bptr->rd_blknum == blk) &&
41  (bptr->rd_op == RD_OP_WRITE) ) {
42  memcpy(bptr->rd_block, buff, RD_BLKSIZ);
43  return OK;
44  }
45  bptr = bptr->rd_next;
46  }
47 
48  /* Search cache for cached copy of block */
49 
50  bptr = rdptr->rd_chnext;
51  found = FALSE;
52  while (bptr != (struct rdbuff *)&rdptr->rd_ctnext) {
53  if (bptr->rd_blknum == blk) {
54  if (bptr->rd_refcnt <= 0) {
55  pptr = bptr->rd_prev;
56  nptr = bptr->rd_next;
57 
58  /* Unlink node from cache list and reset*/
59  /* the available semaphore accordingly*/
60 
61  pptr->rd_next = bptr->rd_next;
62  nptr->rd_prev = bptr->rd_prev;
63  semreset(rdptr->rd_availsem,
64  semcount(rdptr->rd_availsem) - 1);
65  found = TRUE;
66  }
67  break;
68  }
69  bptr = bptr->rd_next;
70  }
71 
72  if ( !found ) {
73  bptr = rdsbufalloc(rdptr);
74  }
75 
76  /* Create a write request */
77 
78  memcpy(bptr->rd_block, buff, RD_BLKSIZ);
79  bptr->rd_op = RD_OP_WRITE;
80  bptr->rd_refcnt = 0;
81  bptr->rd_blknum = blk;
82  bptr->rd_status = RD_VALID;
83  bptr->rd_pid = getpid();
84 
85  /* Insert new request into list just before tail */
86 
87  pptr = rdptr->rd_rtprev;
88  rdptr->rd_rtprev = bptr;
89  bptr->rd_next = pptr->rd_next;
90  bptr->rd_prev = pptr;
91  pptr->rd_next = bptr;
92 
93  /* Signal semaphore to start communication process */
94 
95  signal(rdptr->rd_reqsem);
96  return OK;
97 }
#define RD_OP_WRITE
Definition: rdisksys.h:43
syscall semcount(sid32)
セマフォのカウント値を返す。
Definition: semcount.c:18
#define RD_OPEN
Definition: rdisksys.h:37
#define RD_VALID
Definition: rdisksys.h:48
#define RD_BLKSIZ
Definition: rdisksys.h:9
sid32 rd_reqsem
Definition: rdisksys.h:92
int32 rd_op
Definition: rdisksys.h:58
int32 dvminor
Definition: conf.h:8
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
struct rdbuff * rd_rtnext
Definition: rdisksys.h:75
int32 rd_status
Definition: rdisksys.h:62
#define OK
処理が成功した場合
Definition: kernel.h:77
sid32 rd_availsem
Definition: rdisksys.h:91
byte bool8
Boolean値
Definition: kernel.h:36
pid32 rd_comproc
Definition: rdisksys.h:89
bool8 rd_comruns
Definition: rdisksys.h:90
struct rdbuff * rd_prev
Definition: rdisksys.h:57
#define FALSE
Boolean False(0)
Definition: kernel.h:63
struct rdbuff * rd_rhnext
Definition: rdisksys.h:73
#define TRUE
Boolean True(1)
Definition: kernel.h:65
struct rdscblk rdstab[]
Definition: rdsinit.c:11
int32 rd_refcnt
Definition: rdisksys.h:59
struct rdbuff * rd_next
Definition: rdisksys.h:56
pri16 resume(pid32)
プロセスを休止状態(サスペンド)からREADY状態に遷移させる。
Definition: resume.c:20
pid32 getpid(void)
現在実行中のプロセスIDを返す。
Definition: getpid.c:11
pid32 rd_pid
Definition: rdisksys.h:63
syscall semreset(sid32, int32)
セマフォカウントをリセットし、待機中のプロセスを全て解放する。
Definition: semreset.c:25
struct rdbuff * rdsbufalloc(struct rdscblk *)
Definition: rdsbufalloc.c:9
struct rdbuff * rd_rtprev
Definition: rdisksys.h:76
struct rdbuff * rd_ctnext
Definition: rdisksys.h:82
struct rdbuff * rd_chnext
Definition: rdisksys.h:80
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition: signal.c:18
int32 rd_state
Definition: rdisksys.h:69
char rd_block[RD_BLKSIZ]
Definition: rdisksys.h:65
uint32 rd_blknum
Definition: rdisksys.h:61
void * memcpy(void *, const void *, int32)
メモリAの領域(source)からメモリBの領域(Destination)にN Byteコピーする。
Definition: memcpy.c:13
Here is the call graph for this function: