4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Copyright 2018 Joyent, Inc.
25 */
26
27 /*
28 * restarter.c - service manipulation
29 *
30 * This component manages services whose restarter is svc.startd, the standard
31 * restarter. It translates restarter protocol events from the graph engine
32 * into actions on processes, as a delegated restarter would do.
33 *
34 * The master restarter manages a number of always-running threads:
35 * - restarter event thread: events from the graph engine
36 * - timeout thread: thread to fire queued timeouts
37 * - contract thread: thread to handle contract events
38 * - wait thread: thread to handle wait-based services
39 *
40 * The other threads are created as-needed:
41 * - per-instance method threads
42 * - per-instance event processing threads
43 *
44 * The interaction of all threads must result in the following conditions
2073 */
2074 fmri = safe_strdup(e->rpe_inst);
2075 rip->ri_queue_thread = startd_thread_create(
2076 restarter_process_events, (void *)fmri);
2077 } else {
2078 /*
2079 * Signal the existing thread that there's
2080 * a new event.
2081 */
2082 (void) pthread_cond_broadcast(
2083 &rip->ri_queue_cv);
2084 }
2085
2086 MUTEX_UNLOCK(&rip->ri_queue_lock);
2087 nolookup:
2088 restarter_event_release(e);
2089
2090 MUTEX_LOCK(&ru->restarter_update_lock);
2091 }
2092 }
2093
2094 /*
2095 * Unreachable for now -- there's currently no graceful cleanup
2096 * called on exit().
2097 */
2098 (void) scf_handle_unbind(h);
2099 scf_handle_destroy(h);
2100 return (NULL);
2101 }
2102
2103 static restarter_inst_t *
2104 contract_to_inst(ctid_t ctid)
2105 {
2106 restarter_inst_t *inst;
2107 int id;
2108
2109 id = lookup_inst_by_contract(ctid);
2110 if (id == -1)
2111 return (NULL);
2112
2113 inst = inst_lookup_by_id(id);
2114 if (inst != NULL) {
2115 /*
2116 * Since ri_lock isn't held by the contract id lookup, this
2117 * instance may have been restarted and now be in a new
2118 * contract, making the old contract no longer valid for this
2119 * instance.
2120 */
|
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Copyright 2019 Joyent, Inc.
25 */
26
27 /*
28 * restarter.c - service manipulation
29 *
30 * This component manages services whose restarter is svc.startd, the standard
31 * restarter. It translates restarter protocol events from the graph engine
32 * into actions on processes, as a delegated restarter would do.
33 *
34 * The master restarter manages a number of always-running threads:
35 * - restarter event thread: events from the graph engine
36 * - timeout thread: thread to fire queued timeouts
37 * - contract thread: thread to handle contract events
38 * - wait thread: thread to handle wait-based services
39 *
40 * The other threads are created as-needed:
41 * - per-instance method threads
42 * - per-instance event processing threads
43 *
44 * The interaction of all threads must result in the following conditions
2073 */
2074 fmri = safe_strdup(e->rpe_inst);
2075 rip->ri_queue_thread = startd_thread_create(
2076 restarter_process_events, (void *)fmri);
2077 } else {
2078 /*
2079 * Signal the existing thread that there's
2080 * a new event.
2081 */
2082 (void) pthread_cond_broadcast(
2083 &rip->ri_queue_cv);
2084 }
2085
2086 MUTEX_UNLOCK(&rip->ri_queue_lock);
2087 nolookup:
2088 restarter_event_release(e);
2089
2090 MUTEX_LOCK(&ru->restarter_update_lock);
2091 }
2092 }
2093 }
2094
2095 static restarter_inst_t *
2096 contract_to_inst(ctid_t ctid)
2097 {
2098 restarter_inst_t *inst;
2099 int id;
2100
2101 id = lookup_inst_by_contract(ctid);
2102 if (id == -1)
2103 return (NULL);
2104
2105 inst = inst_lookup_by_id(id);
2106 if (inst != NULL) {
2107 /*
2108 * Since ri_lock isn't held by the contract id lookup, this
2109 * instance may have been restarted and now be in a new
2110 * contract, making the old contract no longer valid for this
2111 * instance.
2112 */
|