if((tws->table_ele[0] = (tws_hash_ptr_t)
kalloc(sizeof(struct tws_hash_ptr) * lines * rows))
== NULL) {
- kfree((vm_offset_t)tws->table[0], sizeof(tws_hash_ele_t)
+ kfree((vm_offset_t)tws->table[0], sizeof(tws_hash_ptr_t)
* lines * rows);
kfree((vm_offset_t)tws, sizeof(struct tws_hash));
return (tws_hash_t)NULL;
&& (dump_pmap == 1)) {
pmap_remove_some_phys((pmap_t)
vm_map_pmap(
- hash_ele->map),
- p->phys_addr);
+ current_map()),
+ p->phys_page);
}
}
local_off += PAGE_SIZE_64;
ask_for_startup_cache_release = 1;
}
}
- if((tws->startup_name != NULL) && (tws->mod == 0)) {
- /* Ensure as good a working set as possible */
- pmap_remove(map->pmap, 0, GLOBAL_SHARED_TEXT_SEGMENT);
- pmap_remove(map->pmap,
- GLOBAL_SHARED_DATA_SEGMENT
- + SHARED_DATA_REGION_SIZE, 0xFFFFF000);
- }
-
/* This next bit of code, the and alternate hash */
/* are all made necessary because of IPC COW */
tws_unlock(tws);
return KERN_NO_SPACE;
}
+ /* object persistence is guaranteed by */
+ /* an elevated paging or object */
+ /* reference count in the caller. */
+ vm_object_unlock(object);
if((tws->table[set] = (tws_hash_ptr_t *)
kalloc(sizeof(tws_hash_ptr_t)
* tws->number_of_lines
* tws->number_of_lines
* tws->number_of_elements))
== NULL) {
- kfree((vm_offset_t)tws->table_ele[set],
- sizeof(tws_hash_ptr_t)
+ kfree((vm_offset_t)tws->table_ele[set],
+ sizeof(struct tws_hash_ptr)
* tws->number_of_lines
* tws->number_of_elements);
kfree((vm_offset_t)tws->table[set],
- sizeof(struct tws_hash_ptr)
+ sizeof(tws_hash_ptr_t)
* tws->number_of_lines
* tws->number_of_elements);
tws->table[set] = NULL;
(struct tws_hash_line)
* tws->number_of_lines))
== NULL) {
- kfree((vm_offset_t)tws->table[set],
- sizeof(tws_hash_ptr_t)
+ kfree((vm_offset_t)tws->alt_ele[set],
+ sizeof(struct tws_hash_ptr)
* tws->number_of_lines
* tws->number_of_elements);
- kfree((vm_offset_t)tws->table_ele[set],
+ kfree((vm_offset_t)tws->table_ele[set],
sizeof(struct tws_hash_ptr)
* tws->number_of_lines
* tws->number_of_elements);
- kfree((vm_offset_t)tws->alt_ele[set],
- sizeof(struct tws_hash_ptr)
+ kfree((vm_offset_t)tws->table[set],
+ sizeof(tws_hash_ptr_t)
* tws->number_of_lines
* tws->number_of_elements);
tws->table[set] = NULL;
sizeof(struct tws_hash_line)
* tws->number_of_lines);
}
+ vm_object_lock(object);
} else {
int age_of_cache;
age_of_cache =
int age_of_cache;
int pre_heat_size;
unsigned int ele_cache;
- unsigned int end_cache = NULL;
- unsigned int start_cache = NULL;
+ unsigned int end_cache = 0;
+ unsigned int start_cache = 0;
if((object->private) || !(object->pager))
return;
*start = *start & TWS_HASH_OFF_MASK;
*end = *start + (32 * PAGE_SIZE_64);
if(*end > object_size) {
- *end = trunc_page(object_size);
+ *end = trunc_page_64(object_size);
max_length = 0;
if(before >= *end) {
*end = after;
*end = after +
(32 * PAGE_SIZE_64);
if(*end > object_size) {
- *end = trunc_page(object_size);
+ *end = trunc_page_64(object_size);
max_length = 0;
if(*start >= *end) {
*end = after;
break;
}
- if(start_cache != NULL) {
+ if(start_cache != 0) {
unsigned int mask;
for (mask = 1; mask != 0; mask = mask << 1) {
break;
}
}
- if(end_cache != NULL) {
+ if(end_cache != 0) {
unsigned int mask;
for (mask = 0x80000000;
}
if (vm_page_lookup(object, after) != VM_PAGE_NULL) {
- /* we can bridge resident pages */
- after += PAGE_SIZE_64;
- length += PAGE_SIZE;
- continue;
+ /*
+ * don't bridge resident pages
+ */
+ break;
}
if (object->internal) {
}
if (vm_page_lookup(object, before) != VM_PAGE_NULL) {
- /* we can bridge resident pages */
- *start -= PAGE_SIZE_64;
- length += PAGE_SIZE;
- continue;
+ /*
+ * don't bridge resident pages
+ */
+ break;
}
if (object->internal) {
return KERN_SUCCESS;
}
*new_info = TRUE;
+
error = tws_write_startup_file(task,
fid, mod, app_name, uid);
if(error)
return error;
- /* use the mod in the write case as an init */
- /* flag */
- mod = 0;
} else {
error = tws_read_startup_file(task,
/* just in case their not, make sure we dealloc correctly */
startup->tws_hash_size = cache_size;
-
tws->startup_cache = startup;
tws_unlock(tws);
return KERN_SUCCESS;