|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_COPYRIGHT@
24: *
25: */
26: /*
27: * File: kern/sync_lock.h
28: * Author: Joseph CaraDonna
29: *
30: * Contains RT distributed lock synchronization service definitions.
31: */
32:
33: #ifndef _KERN_SYNC_LOCK_H_
34: #define _KERN_SYNC_LOCK_H_
35:
36: #include <mach/mach_types.h>
37:
38: #ifdef MACH_KERNEL_PRIVATE
39:
40: #include <kern/wait_queue.h>
41: #include <kern/macro_help.h>
42: #include <kern/queue.h>
43: #include <kern/lock.h>
44:
45: typedef struct ulock {
46: queue_chain_t thread_link; /* ulocks owned by a thread */
47: queue_chain_t held_link; /* ulocks held in the lock set */
48: queue_chain_t handoff_link; /* ulocks w/ active handoffs */
49:
50: decl_mutex_data(,lock) /* ulock lock */
51:
52: struct lock_set *lock_set; /* the retaining lock set */
53: thread_act_t holder; /* thread_act that holds the lock */
54: unsigned int /* flags */
55: /* boolean_t */ blocked:1, /* did threads block waiting? */
56: /* boolean_t */ unstable:1, /* unstable? (holder died) */
57: /* boolean_t */ ho_wait:1, /* handoff thread waiting? */
58: /* boolean_t */ accept_wait:1, /* accepting thread waiting? */
59: :0; /* force to long boundary */
60:
61: struct wait_queue wait_queue; /* queue of blocked threads */
62: } Ulock;
63:
64: typedef struct ulock *ulock_t;
65:
66: typedef struct lock_set {
67: queue_chain_t task_link; /* chain of lock sets owned by a task */
68: decl_mutex_data(,lock) /* lock set lock */
69: task_t owner; /* task that owns the lock set */
70: ipc_port_t port; /* lock set port */
71: int ref_count; /* reference count */
72:
73: boolean_t active; /* active status */
74: int n_ulocks; /* number of ulocks in the lock set */
75:
76: struct ulock ulock_list[1]; /* ulock group list place holder */
77: } Lock_Set;
78:
79: #define ULOCK_NULL ((ulock_t) 0)
80:
81: #define ULOCK_FREE 0
82: #define ULOCK_HELD 1
83:
84: #define LOCK_OPERATION_ABORTED(th) ((th)->wait_link.prev != (queue_entry_t) 0)
85: #define LOCK_OPERATION_COMPLETE(th) ((th)->wait_link.prev = (queue_entry_t) 0)
86:
87: /*
88: * Data structure internal lock macros
89: */
90:
91: #define lock_set_lock_init(ls) mutex_init(&(ls)->lock, \
92: ETAP_THREAD_LOCK_SET)
93: #define lock_set_lock(ls) mutex_lock(&(ls)->lock)
94: #define lock_set_unlock(ls) mutex_unlock(&(ls)->lock)
95:
96: #define ulock_lock_init(ul) mutex_init(&(ul)->lock, \
97: ETAP_THREAD_ULOCK)
98: #define ulock_lock(ul) mutex_lock(&(ul)->lock)
99: #define ulock_unlock(ul) mutex_unlock(&(ul)->lock)
100:
101: #endif /* MACH_KERNEL_PRIVATE */
102:
103: /*
104: * Forward Declarations
105: */
106:
107: extern kern_return_t lock_set_create (task_t task,
108: lock_set_t *new_lock_set,
109: int n_ulocks,
110: int policy);
111:
112: extern kern_return_t lock_set_destroy (task_t task,
113: lock_set_t lock_set);
114:
115: extern kern_return_t lock_acquire (lock_set_t lock_set,
116: int lock_id);
117:
118: extern kern_return_t lock_release (lock_set_t lock_set,
119: int lock_id);
120:
121: extern kern_return_t lock_try (lock_set_t lock_set,
122: int lock_id);
123:
124: extern kern_return_t lock_make_stable (lock_set_t lock_set,
125: int lock_id);
126:
127: extern kern_return_t lock_make_unstable (ulock_t ulock,
128: thread_act_t thr_act);
129:
130: extern kern_return_t lock_release_internal (ulock_t ulock,
131: thread_act_t thr_act);
132:
133: extern kern_return_t lock_handoff (lock_set_t lock_set,
134: int lock_id);
135:
136: extern kern_return_t lock_handoff_accept (lock_set_t lock_set,
137: int lock_id);
138:
139: extern void lock_set_reference (lock_set_t lock_set);
140: extern void lock_set_dereference (lock_set_t lock_set);
141:
142: #endif /* _KERN_SYNC_LOCK_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.