include-afsconfig-before-param-h-20010712
[openafs.git] / src / bucoord / status.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 RCSID("$Header$");
14
15 #include <afs/stds.h>
16 #include <sys/types.h>
17 #include <stdio.h>
18 #ifdef AFS_NT40_ENV
19 #include <winsock2.h>
20 #else
21 #include <strings.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <netdb.h>
25 #include <sys/time.h>
26 #endif
27 #include <afs/com_err.h>
28 #include <afs/bubasics.h>
29 #include "bc.h"
30 #include "error_macros.h"
31
32
33 extern dlqlinkT statusHead;             /* chain of status blocks */
34 extern struct Lock statusQueueLock;     /* access control for status chain */
35 extern struct Lock cmdLineLock;         /* lock on the cmdLine */
36
37 /* task status management
38  *
39  * These routines are common the backup coordinator and tape coordinator
40  */
41
42 initStatus()
43 {
44     dlqInit(&statusHead);
45     Lock_Init(&statusQueueLock);
46     Lock_Init(&cmdLineLock);
47 }
48
49 /* lock managment */
50
51 lock_Status()
52 {
53     ObtainWriteLock(&statusQueueLock);
54 }
55
56 unlock_Status()
57 {
58     ReleaseWriteLock(&statusQueueLock);
59 }
60
61 lock_cmdLine()
62 {
63     ObtainWriteLock(&cmdLineLock);
64 }
65
66 unlock_cmdLine()
67 {
68     ReleaseWriteLock(&cmdLineLock);
69 }
70
71 /* general */
72
73 clearStatus(taskId, flags)
74      afs_uint32 taskId;
75      afs_uint32 flags;
76 {
77      statusP ptr;
78
79      extern statusP findStatus();
80
81      ObtainWriteLock(&statusQueueLock);
82      ptr = findStatus(taskId);
83      if ( ptr == 0 )
84      {
85          ReleaseWriteLock(&statusQueueLock);
86          return;
87      }
88
89      ptr->flags &= ~flags;
90      ReleaseWriteLock(&statusQueueLock);
91  }
92
93 statusP
94 createStatusNode()
95 {
96     statusP ptr;
97
98     ptr = (statusP) malloc(sizeof(*ptr));
99     if ( ptr == 0 )
100     {
101         return(0);
102     }
103     bzero(ptr, sizeof(*ptr));
104
105     /* link it onto the chain of status entries */
106     ObtainWriteLock(&statusQueueLock);
107     dlqLinkb(&statusHead, (dlqlinkP) ptr);
108     ptr->flags = STARTING;
109     ReleaseWriteLock(&statusQueueLock);
110
111     return(ptr);
112 }
113
114 deleteStatusNode(ptr)
115      statusP ptr;
116 {
117     ObtainWriteLock(&statusQueueLock);
118     dlqUnlink( (dlqlinkP) ptr);
119
120     if (ptr->cmdLine)
121         free(ptr->cmdLine);
122     free(ptr);
123     ReleaseWriteLock(&statusQueueLock);
124 }
125
126 statusP
127 findStatus(taskId)
128      afs_uint32 taskId;
129 {
130     statusP ptr = 0;
131     dlqlinkP dlqPtr;
132
133     dlqPtr = statusHead.dlq_next;
134     while ( dlqPtr != &statusHead )
135     {
136         if ( ((statusP) dlqPtr)->taskId == taskId )
137         {
138             ptr = (statusP) dlqPtr;
139             break;
140         }
141         dlqPtr = dlqPtr->dlq_next;
142     }
143
144     return(ptr);
145 }
146
147 setStatus(taskId, flags)
148      afs_uint32 taskId;
149      afs_uint32 flags;
150 {
151      statusP ptr;
152
153      ObtainWriteLock(&statusQueueLock);
154      ptr = findStatus(taskId);
155      if ( ptr == 0 )
156      {
157          ReleaseWriteLock(&statusQueueLock);
158          return;
159      }
160
161      ptr->flags |= flags;
162      ReleaseWriteLock(&statusQueueLock);
163 }
164