diff options
author | Rickard Green <[email protected]> | 2010-08-30 12:09:27 +0200 |
---|---|---|
committer | Rickard Green <[email protected]> | 2010-08-30 12:09:27 +0200 |
commit | 4f100fff5844f7af08b1d9be23e990e4a48b27de (patch) | |
tree | cc3ce0245cfb7d57bc68ec648631ddf3c2329faf /erts/emulator/beam/erl_process.c | |
parent | c4e5b4fe014cdfdddee8a37e2cee98677a6ec5ac (diff) | |
parent | d389ff6f96cbd855e95a7455407b6140f1601d0f (diff) | |
download | otp-4f100fff5844f7af08b1d9be23e990e4a48b27de.tar.gz otp-4f100fff5844f7af08b1d9be23e990e4a48b27de.tar.bz2 otp-4f100fff5844f7af08b1d9be23e990e4a48b27de.zip |
Merge branch 'rickard/cpu-info/OTP-8765' into dev
* rickard/cpu-info/OTP-8765:
Initialize environment functionality after thread lib
Fix faulty assertions
Implement automatic detection of CPU topology on Windows
Make it possible to reread and update detected CPU information
Diffstat (limited to 'erts/emulator/beam/erl_process.c')
-rw-r--r-- | erts/emulator/beam/erl_process.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index d52e1f493c..0e78727316 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -3970,7 +3970,7 @@ check_cpu_bind(ErtsSchedulerData *esdp) goto unbind; } } - else if (cpu_id < 0 && scheduler2cpu_map[esdp->no].bound_id >= 0) { + else if (cpu_id < 0) /* && scheduler2cpu_map[esdp->no].bound_id >= 0) */ { unbind: /* Get rid of old binding */ res = erts_unbind_from_cpu(erts_cpuinfo); @@ -5529,6 +5529,39 @@ late_cpu_bind_init(void) } } +int +erts_update_cpu_info(void) +{ + int changed; + erts_smp_rwmtx_rwlock(&erts_cpu_bind_rwmtx); + changed = erts_cpu_info_update(erts_cpuinfo); + if (changed) { + erts_cpu_topology_t *cpudata; + int cpudata_size; + erts_free(ERTS_ALC_T_CPUDATA, system_cpudata); + + system_cpudata_size = erts_get_cpu_topology_size(erts_cpuinfo); + system_cpudata = erts_alloc(ERTS_ALC_T_CPUDATA, + (sizeof(erts_cpu_topology_t) + * system_cpudata_size)); + + if (!erts_get_cpu_topology(erts_cpuinfo, system_cpudata) + || ERTS_INIT_CPU_TOPOLOGY_OK != verify_topology(system_cpudata, + system_cpudata_size)) { + erts_free(ERTS_ALC_T_CPUDATA, system_cpudata); + system_cpudata = NULL; + system_cpudata_size = 0; + } + + create_tmp_cpu_topology_copy(&cpudata, &cpudata_size); + ASSERT(cpudata); + signal_schedulers_bind_change(cpudata, cpudata_size); + destroy_tmp_cpu_topology_copy(cpudata); + } + erts_smp_rwmtx_rwunlock(&erts_cpu_bind_rwmtx); + return changed; +} + #ifdef ERTS_SMP static void |