Some doc path fixes from Anders
[pkg-k5-afs_openafs.git] / src / bucoord / status.c
blob979b60574599ae5861548d26015857e32f80fdcc
1 /*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
8 */
10 #include <afsconfig.h>
11 #include <afs/param.h>
12 #include <afs/stds.h>
14 #include <roken.h>
16 #include <afs/cmd.h>
17 #include <afs/opr.h>
18 #include <afs/com_err.h>
19 #include <afs/bubasics.h>
21 #include "bc.h"
22 #include "error_macros.h"
23 #include "bucoord_internal.h"
24 #include "bucoord_prototypes.h"
26 extern dlqlinkT statusHead; /* chain of status blocks */
27 extern struct Lock statusQueueLock; /* access control for status chain */
28 extern struct Lock cmdLineLock; /* lock on the cmdLine */
30 /* task status management
32 * These routines are common the backup coordinator and tape coordinator
35 void
36 initStatus(void)
38 dlqInit(&statusHead);
39 Lock_Init(&statusQueueLock);
40 Lock_Init(&cmdLineLock);
43 /* lock managment */
45 void
46 lock_Status(void)
48 ObtainWriteLock(&statusQueueLock);
51 void
52 unlock_Status(void)
54 ReleaseWriteLock(&statusQueueLock);
57 void
58 lock_cmdLine(void)
60 ObtainWriteLock(&cmdLineLock);
62 void
63 unlock_cmdLine(void)
65 ReleaseWriteLock(&cmdLineLock);
68 /* general */
70 void
71 clearStatus(afs_uint32 taskId, afs_uint32 flags)
73 statusP ptr;
75 ObtainWriteLock(&statusQueueLock);
76 ptr = findStatus(taskId);
77 if (ptr == 0) {
78 ReleaseWriteLock(&statusQueueLock);
79 return;
82 ptr->flags &= ~flags;
83 ReleaseWriteLock(&statusQueueLock);
86 statusP
87 createStatusNode(void)
89 statusP ptr;
91 ptr = calloc(1, sizeof(*ptr));
92 if (ptr == 0) {
93 return (0);
96 /* link it onto the chain of status entries */
97 ObtainWriteLock(&statusQueueLock);
98 dlqLinkb(&statusHead, (dlqlinkP) ptr);
99 ptr->flags = STARTING;
100 ReleaseWriteLock(&statusQueueLock);
102 return (ptr);
105 void
106 deleteStatusNode(statusP ptr)
108 ObtainWriteLock(&statusQueueLock);
109 dlqUnlink((dlqlinkP) ptr);
111 if (ptr->cmdLine)
112 free(ptr->cmdLine);
113 free(ptr);
114 ReleaseWriteLock(&statusQueueLock);
117 statusP
118 findStatus(afs_uint32 taskId)
120 statusP ptr = 0;
121 dlqlinkP dlqPtr;
123 dlqPtr = statusHead.dlq_next;
124 while (dlqPtr != &statusHead) {
125 if (((statusP) dlqPtr)->taskId == taskId) {
126 ptr = (statusP) dlqPtr;
127 break;
129 dlqPtr = dlqPtr->dlq_next;
132 return (ptr);
135 void
136 setStatus(afs_uint32 taskId, afs_uint32 flags)
138 statusP ptr;
140 ObtainWriteLock(&statusQueueLock);
141 ptr = findStatus(taskId);
142 if (ptr == 0) {
143 ReleaseWriteLock(&statusQueueLock);
144 return;
147 ptr->flags |= flags;
148 ReleaseWriteLock(&statusQueueLock);