Changeset 4747

Show
Ignore:
Timestamp:
05/11/07 01:45:25 (1 year ago)
Author:
morris
Message:

Use recursive locks

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wired/trunk/wired/chats.c

    r4740 r4747  
    4242        wi_array_t                                              *clients; 
    4343         
    44         wi_rwlock_t                                           *lock; 
     44        wi_recursive_lock_t                           *lock; 
    4545}; 
    4646 
     
    183183static wd_chat_t * wd_chat_init(wd_chat_t *chat) { 
    184184        chat->clients = wi_array_init(wi_array_alloc()); 
    185         chat->lock = wi_rwlock_init(wi_rwlock_alloc()); 
     185        chat->lock = wi_recursive_lock_init(wi_recursive_lock_alloc()); 
    186186         
    187187        return chat; 
     
    384384 
    385385void wd_chat_set_topic(wd_chat_t *chat, wd_topic_t *topic) { 
    386         wi_rwlock_wrlock(chat->lock); 
     386        wi_recursive_lock_lock(chat->lock); 
    387387        wi_retain(topic); 
    388388        wi_release(chat->topic); 
    389389        chat->topic = topic; 
    390         wi_rwlock_unlock(chat->lock); 
     390        wi_recursive_lock_unlock(chat->lock); 
    391391} 
    392392 
     
    396396        wd_topic_t              *topic; 
    397397         
    398         wi_rwlock_rdlock(chat->lock); 
     398        wi_recursive_lock_lock(chat->lock); 
    399399        topic = wi_autorelease(wi_retain(chat->topic)); 
    400         wi_rwlock_unlock(chat->lock); 
     400        wi_recursive_lock_unlock(chat->lock); 
    401401         
    402402        return topic; 
  • wired/trunk/wired/clients.c

    r4740 r4747  
    4747#define WD_CLIENT_SET_VALUE(dst, src)                                   \ 
    4848        WI_STMT_START                                                                           \ 
    49                 wi_rwlock_wrlock(client->client_lock);                \ 
     49                wi_recursive_lock_lock(client->client_lock);  \ 
    5050                (dst) = (src);                                                                  \ 
    51                 wi_rwlock_unlock(client->client_lock);                \ 
     51                wi_recursive_lock_unlock(client->client_lock);        \ 
    5252        WI_STMT_END 
    5353 
    5454#define WD_CLIENT_SET_OBJECT(dst, src)                                  \ 
    5555        WI_STMT_START                                                                           \ 
    56                 wi_rwlock_wrlock(client->client_lock);                \ 
     56                wi_recursive_lock_lock(client->client_lock);  \ 
    5757                wi_retain((src));                                                               \ 
    5858                wi_release((dst));                                                              \ 
    5959                (dst) = (src);                                                                  \ 
    60                 wi_rwlock_unlock(client->client_lock);                \ 
     60                wi_recursive_lock_unlock(client->client_lock);        \ 
    6161        WI_STMT_END 
    6262 
     
    6565                typeof(src)             _value;                                                 \ 
    6666                                                                                                                \ 
    67                 wi_rwlock_rdlock(client->client_lock);                \ 
     67                wi_recursive_lock_lock(client->client_lock);  \ 
    6868                _value = (src);                                                                 \ 
    69                 wi_rwlock_unlock(client->client_lock);                \ 
     69                wi_recursive_lock_unlock(client->client_lock);        \ 
    7070                                                                                                                \ 
    7171                return _value;                                                                  \ 
     
    7676                typeof(src)             _object;                                                \ 
    7777                                                                                                                \ 
    78                 wi_rwlock_rdlock(client->client_lock);                \ 
     78                wi_recursive_lock_lock(client->client_lock);  \ 
    7979                _object = wi_autorelease(wi_retain((src)));             \ 
    80                 wi_rwlock_unlock(client->client_lock);                \ 
     80                wi_recursive_lock_unlock(client->client_lock);        \ 
    8181                                                                                                                \ 
    8282                return _object;                                                                 \ 
     
    8888        wi_runtime_base_t                                       base; 
    8989         
    90         wi_rwlock_t                                                   *client_lock; 
     90        wi_recursive_lock_t                                   *client_lock; 
    9191        wi_lock_t                                                       *socket_lock; 
    9292         
     
    179179                 
    180180                while((client = wi_enumerator_next_data(enumerator))) { 
    181                         wi_rwlock_wrlock(client->client_lock); 
     181                        wi_recursive_lock_lock(client->client_lock); 
    182182                         
    183183                        if(client->state == WD_CLIENT_STATE_LOGGED_IN && 
     
    189189                        } 
    190190 
    191                         wi_rwlock_unlock(client->client_lock); 
     191                        wi_recursive_lock_unlock(client->client_lock); 
    192192                } 
    193193        } 
     
    202202void wd_clients_add_client(wd_client_t *client) { 
    203203        wi_hash_wrlock(wd_clients); 
    204         wi_hash_set_data_for_key(wd_clients, client, wi_number_with_int32(client->uid)); 
     204        wi_hash_set_data_for_key(wd_clients, client, wi_number_with_int32(wd_client_uid(client))); 
    205205        wi_hash_unlock(wd_clients); 
    206206} 
     
    213213         
    214214        wi_hash_wrlock(wd_clients); 
    215         wi_hash_remove_data_for_key(wd_clients, wi_number_with_int32(client->uid)); 
     215        wi_hash_remove_data_for_key(wd_clients, wi_number_with_int32(wd_client_uid(client))); 
    216216        wi_hash_unlock(wd_clients); 
    217217} 
     
    286286        client->host                    = wi_retain(wi_address_hostname(address)); 
    287287         
    288         client->client_lock             = wi_rwlock_init(wi_rwlock_alloc()); 
     288        client->client_lock             = wi_recursive_lock_init(wi_recursive_lock_alloc()); 
    289289        client->socket_lock             = wi_lock_init(wi_lock_alloc()); 
    290290         
     
    357357void wd_client_broadcast_status(wd_client_t *client) { 
    358358        wd_broadcast(wd_public_chat, 304, WI_STR("%u%c%u%c%u%c%u%c%#@%c%#@"), 
    359                                  client->uid,         WD_FIELD_SEPARATOR, 
    360                                  client->idle,                WD_FIELD_SEPARATOR, 
    361                                  client->admin,               WD_FIELD_SEPARATOR, 
    362                                  client->icon,                WD_FIELD_SEPARATOR, 
    363                                  client->nick,                WD_FIELD_SEPARATOR, 
    364                                  client->status); 
     359                                 wd_client_uid(client),                       WD_FIELD_SEPARATOR, 
     360                                 wd_client_is_idle(client),           WD_FIELD_SEPARATOR, 
     361                                 wd_client_is_admin(client),  WD_FIELD_SEPARATOR, 
     362                                 wd_client_icon(client),              WD_FIELD_SEPARATOR, 
     363                                 wd_client_nick(client),              WD_FIELD_SEPARATOR, 
     364                                 wd_client_status(client)); 
    365365} 
    366366 
     
    567567        wi_string_t             *identifier; 
    568568         
    569         wi_rwlock_rdlock(client->client_lock); 
     569        wi_recursive_lock_lock(client->client_lock); 
    570570        identifier = wi_string_with_format(WI_STR("%@/%@/%@"), client->nick, client->login, client->ip); 
    571         wi_rwlock_unlock(client->client_lock); 
     571        wi_recursive_lock_unlock(client->client_lock); 
    572572         
    573573        return identifier; 
  • wired/trunk/wired/commands.c

    r4740 r4747  
    13861386        wi_string_t             *password; 
    13871387        wd_account_t    *account; 
    1388         wd_chat_t               *chat; 
    13891388 
    13901389        if(wd_client_state(client) != WD_CLIENT_STATE_GAVE_USER)