Changeset 781

Show
Ignore:
Timestamp:
07/03/08 19:22:30 (3 months ago)
Author:
Bartosz
Message:

Encapsulated Object's delegate manipulation in monitor.d

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/phobos/internal/monitor.d

    r780 r781  
    1212 
    1313module internal.monitor; 
     14import std.outofmemory; 
    1415 
    1516extern (C) 
     
    1920    void* memcpy(void *, in void *, size_t); 
    2021    void* malloc(size_t); 
     22    void* calloc(size_t, size_t); 
     23    void* realloc(void*, size_t); 
    2124    void free(void*); 
    2225} 
     
    9497} 
    9598 
    96 /** Contains the object monitor and the array of delegates 
     99/** Contains the object's monitor and the array of delegates 
    97100that are used by signals and slots */ 
    98101struct FatLock 
    99102{ 
    100     public  void delegate(Object) [] delegates; 
    101     private OsMutex * mon; 
    102     void setup() { mon = conStruct!(OsMutex)(); } 
    103     void teardown() { deStruct(mon); } 
     103private: 
     104    alias void delegate(Object) delegate_t; 
     105    delegate_t [] _delegates; 
     106    OsMutex * _mutex; 
     107 
     108    void setup() { _mutex = conStruct!(OsMutex)(); } 
     109    void teardown() { deStruct(_mutex); } 
    104110public: 
    105     void lock() { mon.lock; } 
    106     void unlock() { mon.unlock; } 
     111    void lock() { _mutex.lock; } 
     112    void unlock() { _mutex.unlock; } 
     113    bool HasDelegates() { return _delegates.length != 0; } 
     114    void SetDelegate(delegate_t dg) 
     115    { 
     116        foreach (inout x; _delegates) 
     117        { 
     118            if (!x || x == dg) 
     119            {   x = dg; 
     120                return; 
     121            } 
     122        } 
     123 
     124        // Increase size of _delegates[] 
     125        auto len = _delegates.length; 
     126        auto startlen = len; 
     127        if (len == 0) 
     128        { 
     129            len = 4; 
     130            auto p = calloc(delegate_t.sizeof, len); 
     131            if (!p) 
     132                _d_OutOfMemory(); 
     133            _delegates = (cast(delegate_t*)p)[0 .. len]; 
     134        } 
     135        else 
     136        { 
     137            len += len + 4; 
     138            auto p = realloc(_delegates.ptr, delegate_t.sizeof * len); 
     139            if (!p) 
     140                _d_OutOfMemory(); 
     141            _delegates = (cast(delegate_t*)p)[0 .. len]; 
     142            _delegates[startlen .. len] = null; 
     143        } 
     144        _delegates[startlen] = dg; 
     145    } 
     146 
     147    void RemoveDelegate(delegate_t dg) 
     148    { 
     149        foreach (inout x; _delegates) 
     150        { 
     151            if (x == dg) 
     152                x = null; 
     153        } 
     154    } 
     155 
     156    void FinalizeDelegates(Object parent) 
     157    { 
     158        delegate_t[] dgs; 
     159        synchronized (parent) 
     160        { 
     161            dgs = _delegates; 
     162            _delegates = null; 
     163        } 
     164 
     165        foreach (dg; dgs) 
     166        { 
     167            if (dg) 
     168            { 
     169            //printf("calling dg = %llx (%p)\n", dg, parent); 
     170                dg(parent); 
     171            } 
     172        } 
     173 
     174        free(dgs.ptr); 
     175    } 
    107176} 
    108177 
  • trunk/phobos/internal/object.d

    r779 r781  
    3838module object; 
    3939 
    40 import std.outofmemory; 
    4140import internal.monitor; 
    4241 
     
    6665    int memcmp(in void *, in void *, size_t); 
    6766    void* memcpy(void *, in void *, size_t); 
    68     void* calloc(size_t, size_t); 
    69     void* realloc(void*, size_t); 
    70     void free(void*); 
    7167 
    7268    Object _d_newclass(ClassInfo ci); 
     
    151147            FatLock * fatLock = GetFatLock(this); 
    152148            assert(fatLock); 
    153             foreach (inout x; fatLock.delegates) 
    154             { 
    155                 if (!x || x == dg) 
    156                 {   x = dg; 
    157                     return; 
    158                 } 
    159             } 
    160  
    161             // Increase size of delegates[] 
    162             auto len = fatLock.delegates.length; 
    163             auto startlen = len; 
    164             if (len == 0) 
    165             { 
    166                 len = 4; 
    167                 auto p = calloc((void delegate(Object)).sizeof, len); 
    168                 if (!p) 
    169                     _d_OutOfMemory(); 
    170                 fatLock.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 
    171             } 
    172             else 
    173             { 
    174                 len += len + 4; 
    175                 auto p = realloc(fatLock.delegates.ptr, (void delegate(Object)).sizeof * len); 
    176                 if (!p) 
    177                     _d_OutOfMemory(); 
    178                 fatLock.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 
    179                 fatLock.delegates[startlen .. len] = null; 
    180             } 
    181             fatLock.delegates[startlen] = dg; 
     149            fatLock.SetDelegate(dg); 
    182150        } 
    183151    } 
     
    194162            FatLock * fatLock = GetFatLock(this); 
    195163            assert(fatLock); 
    196             foreach (inout x; fatLock.delegates) 
    197             { 
    198                 if (x == dg) 
    199                     x = null; 
    200             } 
     164            fatLock.RemoveDelegate(dg); 
    201165        } 
    202166    } 
     
    225189    FatLock * fatLock = GetFatLock(o); 
    226190    assert(fatLock); 
    227     if (fatLock.delegates.length) 
    228     { 
    229         auto dgs = fatLock.delegates; 
    230         synchronized (o) 
    231         { 
    232             dgs = fatLock.delegates; 
    233             fatLock.delegates = null; 
    234         } 
    235  
    236         foreach (dg; dgs) 
    237         { 
    238             if (dg) 
    239             { 
    240             //printf("calling dg = %llx (%p)\n", dg, o); 
    241                 dg(o); 
    242             } 
    243         } 
    244  
    245         free(dgs.ptr); 
    246     } 
     191    if (fatLock.HasDelegates) 
     192        fatLock.FinalizeDelegates(o); 
    247193} 
    248194