[launchd-changes] [23168] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Thu Mar 22 09:18:32 PDT 2007
Revision: 23168
http://trac.macosforge.org/projects/launchd/changeset/23168
Author: zarzycki at apple.com
Date: 2007-03-22 09:18:32 -0700 (Thu, 22 Mar 2007)
Log Message:
-----------
Even more hashed lookups.
Modified Paths:
--------------
trunk/launchd/src/launchd_core_logic.c
trunk/launchd/src/launchd_core_logic.h
trunk/launchd/src/launchd_runtime.c
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2007-03-22 04:06:04 UTC (rev 23167)
+++ trunk/launchd/src/launchd_core_logic.c 2007-03-22 16:18:32 UTC (rev 23168)
@@ -94,19 +94,27 @@
#define LAUNCHD_DEFAULT_EXIT_TIMEOUT 20
#define LAUNCHD_SIGKILL_TIMER 5
+#define IS_POWER_OF_TWO(v) (!(v & (v - 1)) && v)
+
extern char **environ;
mach_port_t inherited_bootstrap_port;
struct machservice {
SLIST_ENTRY(machservice) sle;
- SLIST_ENTRY(machservice) hash_sle;
+ SLIST_ENTRY(machservice) name_hash_sle;
+ SLIST_ENTRY(machservice) port_hash_sle;
job_t job;
mach_port_name_t port;
unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, must_match_uid:1, debug_on_close:1, per_pid:1;
const char name[0];
};
+#define PORT_HASH_SIZE 32
+#define HASH_PORT(x) (IS_POWER_OF_TWO(PORT_HASH_SIZE) ? (MACH_PORT_INDEX(x) & (PORT_HASH_SIZE - 1)) : (MACH_PORT_INDEX(x) % PORT_HASH_SIZE))
+
+SLIST_HEAD(, machservice) port_hash[PORT_HASH_SIZE];
+
static void machservice_setup(launch_data_t obj, const char *key, void *context);
static void machservice_setup_options(launch_data_t obj, const char *key, void *context);
static void machservice_resetport(job_t j, struct machservice *ms);
@@ -194,7 +202,6 @@
static void semaphoreitem_watch(job_t j, struct semaphoreitem *si);
static void semaphoreitem_ignore(job_t j, struct semaphoreitem *si);
-#define IS_POWER_OF_TWO(v) (!(v & (v - 1)) && v)
#define ACTIVE_JOB_HASH_SIZE 32
#define ACTIVE_JOB_HASH(x) (IS_POWER_OF_TWO(ACTIVE_JOB_HASH_SIZE) ? (x & (ACTIVE_JOB_HASH_SIZE - 1)) : (x % ACTIVE_JOB_HASH_SIZE))
#define MACHSERVICE_HASH_SIZE 37
@@ -1614,26 +1621,16 @@
}
job_t
-jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p)
+job_find_by_service_port(mach_port_t p)
{
struct machservice *ms;
- jobmgr_t jmi;
- job_t ji, jr;
- SLIST_FOREACH(jmi, &jm->submgrs, sle) {
- if ((jr = jobmgr_find_by_service_port(jmi, p))) {
- return jr;
+ SLIST_FOREACH(ms, &port_hash[HASH_PORT(p)], port_hash_sle) {
+ if (ms->port == p) {
+ return ms->job;
}
}
- SLIST_FOREACH(ji, &jm->jobs, sle) {
- SLIST_FOREACH(ms, &ji->machservices, sle) {
- if (ms->port == p) {
- return ji;
- }
- }
- }
-
return NULL;
}
@@ -3203,10 +3200,12 @@
void
machservice_resetport(job_t j, struct machservice *ms)
{
+ SLIST_REMOVE(&port_hash[HASH_PORT(ms->port)], ms, machservice, port_hash_sle);
job_assumes(j, launchd_mport_close_recv(ms->port) == KERN_SUCCESS);
job_assumes(j, launchd_mport_deallocate(ms->port) == KERN_SUCCESS);
job_assumes(j, launchd_mport_create_recv(&ms->port) == KERN_SUCCESS);
job_assumes(j, launchd_mport_make_send(ms->port) == KERN_SUCCESS);
+ SLIST_INSERT_HEAD(&port_hash[HASH_PORT(ms->port)], ms, port_hash_sle);
}
struct machservice *
@@ -3238,7 +3237,8 @@
}
SLIST_INSERT_HEAD(&j->machservices, ms, sle);
- SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(ms->name)], ms, hash_sle);
+ SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(ms->name)], ms, name_hash_sle);
+ SLIST_INSERT_HEAD(&port_hash[HASH_PORT(ms->port)], ms, port_hash_sle);
job_log(j, LOG_INFO, "Mach service added: %s", name);
@@ -3619,7 +3619,6 @@
{
struct machservice *ms, *next_ms;
jobmgr_t jmi, jmn;
- job_t ji, jn;
/* Mach ports, unlike Unix descriptors, are reference counted. In other
* words, when some program hands us a second or subsequent send right
@@ -3631,18 +3630,18 @@
* to use.
*/
- SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
- jobmgr_delete_anything_with_port(jmi, port);
- }
-
- SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
- SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) {
+ if (jm == root_jobmgr) {
+ SLIST_FOREACH_SAFE(ms, &port_hash[HASH_PORT(port)], port_hash_sle, next_ms) {
if (ms->port == port) {
- machservice_delete(ji, ms);
+ machservice_delete(ms->job, ms);
}
}
}
+ SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
+ jobmgr_delete_anything_with_port(jmi, port);
+ }
+
if (jm->req_port == port) {
return jobmgr_shutdown(jm);
}
@@ -3659,7 +3658,7 @@
jobmgr_assumes(jm, !check_parent);
}
- SLIST_FOREACH(ms, &jm->ms_hash[hash_ms(name)], hash_sle) {
+ SLIST_FOREACH(ms, &jm->ms_hash[hash_ms(name)], name_hash_sle) {
if ((target_pid && ms->per_pid && ms->job->p == target_pid) || (!target_pid && !ms->per_pid)) {
if (strcmp(name, ms->name) == 0) {
return ms;
@@ -3725,7 +3724,8 @@
job_log(j, LOG_INFO, "Mach service deleted: %s", ms->name);
SLIST_REMOVE(&j->machservices, ms, machservice, sle);
- SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(ms->name)], ms, machservice, hash_sle);
+ SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(ms->name)], ms, machservice, name_hash_sle);
+ SLIST_REMOVE(&port_hash[HASH_PORT(ms->port)], ms, machservice, port_hash_sle);
free(ms);
}
@@ -3805,38 +3805,29 @@
}
bool
-jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p)
+job_ack_port_destruction(mach_port_t p)
{
- struct machservice *ms = NULL;
- jobmgr_t jmi;
- job_t ji;
+ struct machservice *ms;
- SLIST_FOREACH(jmi, &jm->submgrs, sle) {
- if (jobmgr_ack_port_destruction(jmi, p)) {
- return true;
+ SLIST_FOREACH(ms, &port_hash[HASH_PORT(p)], port_hash_sle) {
+ if (ms->port == p) {
+ break;
}
}
- /* We don't need the _SAFE version because we return after the job_dispatch() */
- SLIST_FOREACH(ji, &jm->jobs, sle) {
- SLIST_FOREACH(ms, &ji->machservices, sle) {
- if (ms->port != p) {
- continue;
- }
+ if (!ms) {
+ return false;
+ }
- ms->isActive = false;
+ ms->isActive = false;
- if (ms->reset) {
- machservice_resetport(ji, ms);
- }
-
- job_log(ji, LOG_DEBUG, "Receive right returned to us: %s", ms->name);
- job_dispatch(ji, false);
- return true;
- }
+ if (ms->reset) {
+ machservice_resetport(ms->job, ms);
}
- return false;
+ job_log(ms->job, LOG_DEBUG, "Receive right returned to us: %s", ms->name);
+ job_dispatch(ms->job, false);
+ return true;
}
void
@@ -4713,7 +4704,7 @@
struct machservice *msi;
SLIST_FOREACH(msi, &j->machservices, sle) {
- SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(msi->name)], msi, machservice, hash_sle);
+ SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(msi->name)], msi, machservice, name_hash_sle);
}
SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
@@ -4721,7 +4712,7 @@
j->mgr = jmi;
SLIST_FOREACH(msi, &j->machservices, sle) {
- SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(msi->name)], msi, hash_sle);
+ SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(msi->name)], msi, name_hash_sle);
}
}
}
Modified: trunk/launchd/src/launchd_core_logic.h
===================================================================
--- trunk/launchd/src/launchd_core_logic.h 2007-03-22 04:06:04 UTC (rev 23167)
+++ trunk/launchd/src/launchd_core_logic.h 2007-03-22 16:18:32 UTC (rev 23168)
@@ -32,13 +32,13 @@
jobmgr_t jobmgr_shutdown(jobmgr_t jm);
void jobmgr_dispatch_all_semaphores(jobmgr_t jm);
jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port);
-bool jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p);
-job_t jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p);
launch_data_t job_export_all(void);
job_t job_dispatch(job_t j, bool kickstart); /* returns j on success, NULL on job removal */
job_t job_find(const char *label);
+job_t job_find_by_service_port(mach_port_t p);
+bool job_ack_port_destruction(mach_port_t p);
bool job_active(job_t j);
bool job_is_anonymous(job_t j);
launch_data_t job_export(job_t j);
Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c 2007-03-22 04:06:04 UTC (rev 23167)
+++ trunk/launchd/src/launchd_runtime.c 2007-03-22 16:18:32 UTC (rev 23168)
@@ -419,7 +419,7 @@
continue;
}
if (status.mps_msgcount) {
- EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, jobmgr_find_by_service_port(root_jobmgr, members[i]));
+ EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, job_find_by_service_port(members[i]));
#if 0
if (launchd_assumes(kev.udata != NULL)) {
#endif
@@ -709,7 +709,7 @@
{
/* This message is sent to us when a receive right is returned to us. */
- if (!jobmgr_ack_port_destruction(root_jobmgr, rights)) {
+ if (!launchd_assumes(job_ack_port_destruction(rights))) {
launchd_assumes(launchd_mport_close_recv(rights) == KERN_SUCCESS);
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070322/9137f4c4/attachment.html
More information about the launchd-changes
mailing list