104 * the current reference.
105 */
106 ts_label_t *
107 labeldup(const ts_label_t *val, int flag)
108 {
109 ts_label_t *lab = kmem_cache_alloc(tslabel_cache, flag);
110
111 if (lab != NULL) {
112 bcopy(val, lab, sizeof (ts_label_t));
113 lab->tsl_ref = 1;
114 }
115 return (lab);
116 }
117
118 /*
119 * Put a hold on a label structure.
120 */
121 void
122 label_hold(ts_label_t *lab)
123 {
124 atomic_add_32(&lab->tsl_ref, 1);
125 }
126
127 /*
128 * Release previous hold on a label structure. Free it if refcnt == 0.
129 */
130 void
131 label_rele(ts_label_t *lab)
132 {
133 if (atomic_add_32_nv(&lab->tsl_ref, -1) == 0)
134 kmem_cache_free(tslabel_cache, lab);
135 }
136
137 bslabel_t *
138 label2bslabel(ts_label_t *lab)
139 {
140 return (&lab->tsl_label);
141 }
142
143
144 uint32_t
145 label2doi(ts_label_t *lab)
146 {
147 return (lab->tsl_doi);
148 }
149
150 /*
151 * Compare labels. Return 1 if equal, 0 otherwise.
152 */
153 boolean_t
|
104 * the current reference.
105 */
106 ts_label_t *
107 labeldup(const ts_label_t *val, int flag)
108 {
109 ts_label_t *lab = kmem_cache_alloc(tslabel_cache, flag);
110
111 if (lab != NULL) {
112 bcopy(val, lab, sizeof (ts_label_t));
113 lab->tsl_ref = 1;
114 }
115 return (lab);
116 }
117
118 /*
119 * Put a hold on a label structure.
120 */
121 void
122 label_hold(ts_label_t *lab)
123 {
124 atomic_inc_32(&lab->tsl_ref);
125 }
126
127 /*
128 * Release previous hold on a label structure. Free it if refcnt == 0.
129 */
130 void
131 label_rele(ts_label_t *lab)
132 {
133 if (atomic_dec_32_nv(&lab->tsl_ref) == 0)
134 kmem_cache_free(tslabel_cache, lab);
135 }
136
137 bslabel_t *
138 label2bslabel(ts_label_t *lab)
139 {
140 return (&lab->tsl_label);
141 }
142
143
144 uint32_t
145 label2doi(ts_label_t *lab)
146 {
147 return (lab->tsl_doi);
148 }
149
150 /*
151 * Compare labels. Return 1 if equal, 0 otherwise.
152 */
153 boolean_t
|