If you have pool_size defined can you tell me if putting pool_size=0 in 
your DAL solves this problem?

Anyway I got really interested in this, for some unknown to me reason, and 
decided to create a *VERY CRUDE* decorator to memory check your controller 
functions for leaks, I guess with time we could refine this if there's a 
desire to have a memory leak checker for controller functions in web2py. I 
hope it helps, if it doesn't at least it was fun to code.

 
def memcheck(f):
    """
    A crude decorator to memory check your web2py controller's functions.


    False positives are possible if your controller function returns less 
than
    common stuff.


    Put it in your models and then decorate your controller functions.


    example:


    @memcheck
    def index():
        response.flash = T("Welcome to web2py!")
        return dict(message=T('Hello World'))


    BEERWARE - You should try to buy Leonel Câmara beers!
    """
    from functools import wraps
    from collections import Counter, Mapping, Iterable
    from gluon.languages import lazyT
    from gc import get_objects


    def get_value_objects(v):
        """
        Generate an object for each value in a value including itself.
        """
        if isinstance(v, basestring):
            yield v
        elif isinstance(v, lazyT):
            yield v
            yield v.s # Check lazyT symbols dict
            for i in v.s:  
                for new_v in get_value_objects(i):
                    yield new_v
        elif isinstance(v, Mapping):
            yield v
            for i in v.values():
                for new_v in get_value_objects(i):
                    yield new_v
        elif isinstance(v, Iterable):
            yield v
            for i in v:
                for new_v in get_value_objects(i):
                    yield new_v
        else:
            yield v


    @wraps(f)
    def wrapper(*args, **kwargs):
        before = Counter(type(obj) for obj in get_objects())
        result = f(*args, **kwargs)
        after = Counter(type(obj) for obj in get_objects())
        result_objs = Counter(type(obj) for obj in get_value_objects(result
))
        count = after - before - result_objs - Counter([Counter])
        # This and other stuff put in the response or session is not a 
memory
        # leak.
        # So false positives may appear for what's not accounted here.
        if response.flash: 
            count -= Counter(type(obj) for obj in get_value_objects(response
.flash))
        if response.js: 
            count -= Counter(type(obj) for obj in get_value_objects(response
.js))
        
        # Finally we are ready to report what we have found.
        for k in count:
            print 'LEAKED: %d of type %s' % (count[k], k)
        return result


    return wrapper



-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to