Move GLOCK initialisation to platform directories
[openafs.git] / src / afs / DARWIN / osi_machdep.h
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  *
11  * MACOS OSI header file. Extends afs_osi.h.
12  *
13  * afs_osi.h includes this file, which is the only way this file should
14  * be included in a source file. This file can redefine macros declared in
15  * afs_osi.h.
16  */
17
18 #ifndef _OSI_MACHDEP_H_
19 #define _OSI_MACHDEP_H_
20
21 #ifdef XAFS_DARWIN_ENV
22 #ifndef _MACH_ETAP_H_
23 #define _MACH_ETAP_H_
24 typedef unsigned short etap_event_t;
25 #endif
26 #endif
27
28 #ifdef AFS_DARWIN80_ENV
29 #include <kern/locks.h>
30 #include <sys/mount.h>
31 #include <h/vnode.h>
32 #else
33 #include <sys/lock.h>
34 #include <sys/user.h>
35 #include <sys/vnode.h>
36 #endif
37 #include <kern/thread.h>
38
39 #ifdef AFS_DARWIN80_ENV
40 #define vop_proc vfs_context_proc(ap->a_context)
41 #define vop_cred vfs_context_ucred(ap->a_context)
42 #define cn_proc(cnp) vfs_context_proc(ap->a_context)
43 #define cn_cred(cnp) vfs_context_ucred(ap->a_context)
44 #define vop_cn_proc vfs_context_proc(ap->a_context)
45 #define vop_cn_cred vfs_context_ucred(ap->a_context)
46 #define getpid()                proc_selfpid()
47 #define getppid()               proc_selfppid()
48 #else
49 #define vop_proc ap->a_p
50 #define vop_cred ap->a_cred
51 #define cn_proc(cnp) (cnp)->cn_proc
52 #define cn_cred(cnp) (cnp)->cn_cred
53 #define vop_cn_proc cn_proc(ap->a_cnp)
54 #define vop_cn_cred cn_cred(ap->a_cnp)
55 #define getpid()                current_proc()->p_pid
56 #define getppid()               current_proc()->p_pptr->p_pid
57 #endif
58 #undef gop_lookupname
59 #define gop_lookupname osi_lookupname
60 #undef gop_lookupname_user
61 #define gop_lookupname_user osi_lookupname_user
62
63 #define FTRUNC 0
64
65 /* vcexcl - used only by afs_create */
66 enum vcexcl { EXCL, NONEXCL };
67
68 #ifndef AFS_DARWIN80_ENV
69 #define vnode_clearfsnode(x) ((x)->v_data = 0)
70 #define vnode_fsnode(x) (x)->v_data
71 #define vnode_lock(x) vn_lock(x, LK_EXCLUSIVE | LK_RETRY, current_proc());
72 #define vnode_isvroot(x) (((x)->v_flag & VROOT)?1:0)
73 #define vnode_vtype(x) (x)->v_type
74 #define vnode_isdir(x) ((x)->v_type == VDIR)
75
76 #define vfs_flags(x) (x)->v_flags
77 #define vfs_setflags(x, y) (x)->mnt_flag |= (y)
78 #define vfs_clearflags(x, y) (x)->mnt_flag &= (~(y))
79 #define vfs_isupdate(x) ((x)->mnt_flag & MNT_UPDATE)
80 #define vfs_fsprivate(x) (x)->mnt_data
81 #define vfs_setfsprivate(x,y) (x)->mnt_data = (y)
82 #define vfs_typenum(x) (x)->mnt_vfc->vfc_typenum
83 #endif
84
85 #ifdef AFS_DARWIN80_ENV
86 #define vrele vnode_rele
87 #define vput vnode_rele
88 #define vref vnode_ref
89 #define vattr vnode_attr
90 #if 0
91 #define vn_lock(v, unused1, unused2) vnode_get((v))
92 #define VOP_LOCK(v, unused1, unused2) vnode_get((v))
93 #define VOP_UNLOCK(v, unused1, unused2) vnode_put((v))
94 #endif
95
96 #define va_size va_data_size
97 #define va_atime va_access_time
98 #define va_mtime va_modify_time
99 #define va_ctime va_change_time
100 #define va_bytes va_total_alloc 
101 #define va_blocksize va_iosize
102 #define va_nodeid va_fileid
103
104 #define crref kauth_cred_get_with_ref
105 #define crhold kauth_cred_ref
106 #ifdef AFS_DARWIN100_ENV
107 #define crfree(X) kauth_cred_unref(&X)
108 #else
109 #define crfree kauth_cred_rele
110 #endif
111 #define crdup kauth_cred_dup
112 #ifdef AFS_DARWIN100_ENV
113 #define ubc_msync_range(X,Y,Z,A) ubc_msync(X,Y,Z,NULL,A)
114 #else
115 #define ubc_msync_range(X,Y,Z,A) ubc_sync_range(X,Y,Z,A)
116 #endif
117 extern vfs_context_t afs_osi_ctxtp;
118 extern int afs_osi_ctxtp_initialized;
119 #endif
120
121 /* 
122  * Time related macros
123  */
124 #ifndef AFS_DARWIN60_ENV
125 extern struct timeval time;
126 #endif
127 #ifdef AFS_DARWIN80_ENV
128 static inline time_t osi_Time(void) {
129     struct timeval _now;
130     microtime(&_now);
131     return _now.tv_sec;
132 }
133 #else
134 #define osi_Time() (time.tv_sec)
135 #endif
136 #define afs_hz      hz
137 #ifdef AFS_DARWIN80_ENV
138 extern int hz;
139 #endif
140
141 typedef struct ucred afs_ucred_t;
142 typedef struct proc afs_proc_t;
143
144 #define osi_vnhold(avc,r)       VN_HOLD(AFSTOV(avc))
145 #define VN_HOLD(vp) darwin_vn_hold(vp)
146 #define VN_RELE(vp) vrele(vp);
147
148 void darwin_vn_hold(struct vnode *vp);
149 #ifdef AFS_DARWIN80_ENV
150 void darwin_vn_rele(struct vnode *vp);
151 #endif
152
153 #define gop_rdwr(rw,gp,base,len,offset,segflg,unit,cred,aresid) \
154   vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(unit),(cred),(aresid),current_proc())
155
156 #undef afs_suser
157
158 #ifdef KERNEL
159 extern thread_t afs_global_owner;
160 /* simple locks cannot be used since sleep can happen at any time */
161 #ifdef AFS_DARWIN80_ENV
162 /* mach locks still don't have an exported try, but we are forced to use them */
163 extern lck_mtx_t  *afs_global_lock;
164 #define AFS_GLOCK() \
165     do { \
166         osi_Assert(afs_global_owner != current_thread()); \
167         lck_mtx_lock(afs_global_lock); \
168         osi_Assert(afs_global_owner == 0); \
169         afs_global_owner = current_thread(); \
170     } while (0)
171 #define AFS_GUNLOCK() \
172     do { \
173         osi_Assert(afs_global_owner == current_thread()); \
174         afs_global_owner = 0; \
175         lck_mtx_unlock(afs_global_lock); \
176     } while(0)
177 #define osi_InitGlock() \
178     do { \
179         afs_global_owner = 0; \
180     } while (0)
181 #else
182 /* Should probably use mach locks rather than bsd locks, since we use the
183    mach thread control api's elsewhere (mach locks not used for consistency
184    with rx, since rx needs lock_write_try() in order to use mach locks
185  */
186 extern struct lock__bsd__ afs_global_lock;
187 #define AFS_GLOCK() \
188     do { \
189         lockmgr(&afs_global_lock, LK_EXCLUSIVE, 0, current_proc()); \
190         osi_Assert(afs_global_owner == 0); \
191         afs_global_owner = current_thread(); \
192     } while (0)
193 #define AFS_GUNLOCK() \
194     do { \
195         osi_Assert(afs_global_owner == current_thread()); \
196         afs_global_owner = 0; \
197         lockmgr(&afs_global_lock, LK_RELEASE, 0, current_proc()); \
198     } while(0)
199 #define osi_InitGlock() \
200     do { \
201         lockinit(&afs_global_lock, PLOCK, "afs global lock", 0, 0); \
202         afs_global_owner = 0; \
203     } while (0)
204 #endif
205 #define ISAFS_GLOCK() (afs_global_owner == current_thread())
206
207 #define SPLVAR
208 #define NETPRI
209 #define USERPRI
210 #if 0
211 #undef SPLVAR
212 #define SPLVAR int x;
213 #undef NETPRI
214 #define NETPRI x=splnet();
215 #undef USERPRI
216 #define USERPRI splx(x);
217 #endif
218
219 #define AFS_APPL_UFS_CACHE 1
220 #define AFS_APPL_HFS_CACHE 2
221
222 extern ino_t VnodeToIno(vnode_t avp);
223 extern dev_t VnodeToDev(vnode_t vp);
224 extern int igetinode(mount_t vfsp, dev_t dev , ino_t inode, vnode_t *vpp,
225               struct vattr *va, int *perror);
226
227 #define osi_curproc() current_proc()
228
229 /* FIXME */
230 #define osi_curcred() &afs_osi_cred 
231
232 #ifdef AFS_DARWIN80_ENV
233 uio_t afsio_darwin_partialcopy(uio_t auio, int size);
234
235 #define uprintf printf
236 #endif
237
238 #ifndef AFS_DARWIN80_ENV
239 #define ifaddr_address_family(x) (x)->ifa_addr->sa_family
240 #define ifaddr_address(x, y, z) memcpy(y, (x)->ifa_addr, z)
241 #define ifaddr_netmask(x, y, z) memcpy(y, (x)->ifa_netmask, z)
242 #define ifaddr_dstaddress(x, y, z) memcpy(y, (x)->ifa_dstaddr, z)
243 #define ifaddr_ifnet(x) (x?(x)->ifa_ifp:0)
244 #define ifnet_flags(x) (x?(x)->if_flags:0)
245 #define ifnet_metric(x) (x?(x)->if_data.ifi_metric:0)
246 /*#define ifnet_mtu(x) (x)->if_mtu*/
247 #define ifaddr_withnet(x) ifa_ifwithnet(x)
248 #endif
249
250 /* Vnode related macros */
251
252 #if defined(AFS_DARWIN80_ENV)
253 extern int afs_vfs_typenum;
254 # define vType(vc)               vnode_vtype(AFSTOV(vc))
255 # define vSetVfsp(vc, vfsp)
256 # define vSetType(vc, type)      (vc)->f.m.Type = (type)
257 # define SetAfsVnode(vn)         /* nothing; done in getnewvnode() */
258 # define IsAfsVnode(v) (vfs_typenum(vnode_mount((v))) == afs_vfs_typenum)
259 #else
260 extern int (**afs_vnodeop_p) ();
261 # define vType(vc)               AFSTOV(vc)->v_type
262 # define vSetVfsp(vc, vfsp)      AFSTOV(vc)->v_mount = (vfsp)
263 # define vSetType(vc, type)      AFSTOV(vc)->v_type = (type)
264 # define IsAfsVnode(v)      ((v)->v_op == afs_vnodeop_p)
265 # define SetAfsVnode(v)     /* nothing; done in getnewvnode() */
266 #endif
267
268 #endif /* KERNEL */
269
270 #endif /* _OSI_MACHDEP_H_ */