vm: don't keep more than 10 unused contexts around to prevent address space wastage on low-budget operating systems like OpenBSD
							parent
							
								
									e8b1a06dad
								
							
						
					
					
						commit
						a36bd7fbaf
					
				| 
						 | 
					@ -111,8 +111,8 @@ void factor_vm::init_contexts(cell datastack_size_, cell retainstack_size_, cell
 | 
				
			||||||
void factor_vm::delete_contexts()
 | 
					void factor_vm::delete_contexts()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert(!ctx);
 | 
						assert(!ctx);
 | 
				
			||||||
	std::vector<context *>::const_iterator iter = unused_contexts.begin();
 | 
						std::list<context *>::const_iterator iter = unused_contexts.begin();
 | 
				
			||||||
	std::vector<context *>::const_iterator end = unused_contexts.end();
 | 
						std::list<context *>::const_iterator end = unused_contexts.end();
 | 
				
			||||||
	while(iter != end)
 | 
						while(iter != end)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		delete *iter;
 | 
							delete *iter;
 | 
				
			||||||
| 
						 | 
					@ -159,6 +159,13 @@ void factor_vm::delete_context(context *old_context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unused_contexts.push_back(old_context);
 | 
						unused_contexts.push_back(old_context);
 | 
				
			||||||
	active_contexts.erase(old_context);
 | 
						active_contexts.erase(old_context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(unused_contexts.size() > 10)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							context *stale_context = unused_contexts.front();
 | 
				
			||||||
 | 
							unused_contexts.pop_front();
 | 
				
			||||||
 | 
							delete stale_context;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VM_C_API void delete_context(factor_vm *parent, context *old_context)
 | 
					VM_C_API void delete_context(factor_vm *parent, context *old_context)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* C++ headers */
 | 
					/* C++ headers */
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					#include <list>
 | 
				
			||||||
#include <map>
 | 
					#include <map>
 | 
				
			||||||
#include <set>
 | 
					#include <set>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ struct factor_vm
 | 
				
			||||||
	int callback_id;
 | 
						int callback_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Pooling unused contexts to make context allocation cheaper */
 | 
						/* Pooling unused contexts to make context allocation cheaper */
 | 
				
			||||||
	std::vector<context *> unused_contexts;
 | 
						std::list<context *> unused_contexts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Active contexts, for tracing by the GC */
 | 
						/* Active contexts, for tracing by the GC */
 | 
				
			||||||
	std::set<context *> active_contexts;
 | 
						std::set<context *> active_contexts;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue