Changeset 616

Show
Ignore:
Timestamp:
07/23/05 21:41:37 (3 years ago)
Author:
jajcus
Message:

- user reference counting (simple garbage collection, currently on exit only)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/register.c

    r608 r616  
    410410        session=session_create(user,from,id,q,s,0); 
    411411        if (!session){ 
    412                 user_remove(user); 
    413412                g_warning(N_("Couldn't create session for %s"),from); 
    414413                jabber_iq_send_error(s,from,to,id,500,_("Internal Server Error")); 
     
    618617                session=session_create(user,from,id,q,s,0); 
    619618                if (!session){ 
    620                         user_remove(user); 
    621619                        g_warning(N_("Couldn't create session for %s"),from); 
    622620                        jabber_iq_send_error(s,from,to,id,500,_("Internal Server Error")); 
  • trunk/src/users.c

    r611 r616  
    5454static int user_destroy(User *s); 
    5555 
    56 #if 0 
    57 static gboolean users_hash_func(gpointer key,gpointer value,gpointer udata){ 
    58  
    59         user_destroy((User *)value); 
    60         g_free(key); 
     56static gboolean users_gc_hash_func(gpointer key,gpointer value,gpointer udata){ 
     57User *u=(User *)value; 
     58 
     59        if (u->refcount==0) { 
     60                user_destroy(u); 
     61                g_free(key); 
     62        } 
    6163        return TRUE; 
    6264} 
    63 #endif 
     65 
     66int users_gc(){ 
     67        g_hash_table_foreach_remove(users_jid,users_gc_hash_func,NULL); 
     68        return 0; 
     69
     70 
    6471 
    6572int users_done(){ 
    6673guint s; 
     74         
     75        s=g_hash_table_size(users_jid); 
     76        if (s) g_debug(L_("Before cleanup: %u users in hash table"),s); 
     77        users_gc(); 
    6778        s=g_hash_table_size(users_jid); 
    6879        if (s) g_warning(L_("Still %u users in hash table"),s); 
    69         /*g_hash_table_foreach_remove(users_jid,users_hash_func,NULL);*/ 
    7080        g_hash_table_destroy(users_jid); 
    7181        return 0; 
    7282} 
     83 
     84int user_ref(User *u){ 
     85 
     86        return ++u->refcount; 
     87} 
     88 
     89int user_unref(User *u){ 
     90 
     91        g_assert(u->refcount>0); 
     92        u->refcount--; 
     93        return u->refcount; 
     94} 
     95 
     96int user_free(User *u){ 
     97gpointer key,value; 
     98char *njid; 
     99         
     100        g_assert(u->refcount==0); 
     101        g_assert(users_jid!=NULL); 
     102 
     103        njid=jid_normalized(u->jid,0); 
     104        g_assert(njid!=NULL); 
     105        if (g_hash_table_lookup_extended(users_jid,(gpointer)njid,&key,&value)){ 
     106                g_assert(u==value); 
     107                g_hash_table_remove(users_jid,(gpointer)njid); 
     108                g_free(key); 
     109        } 
     110        else debug(L_("user_remove: user '%s' not found in hash table"),njid); 
     111        g_free(njid); 
     112        return user_destroy(u); 
     113} 
     114 
    73115 
    74116int user_save(User *u){ 
     
    368410        u=(User *)g_hash_table_lookup(users_jid,(gpointer)njid); 
    369411        g_free(njid); 
    370         if (u) return u
    371         return user_load(jid)
     412        if (u==NULL) u=user_load(jid)
     413        return u
    372414} 
    373415 
     
    397439} 
    398440 
    399  
    400 int user_remove(User *u){ 
    401 gpointer key,value; 
    402 char *njid; 
    403  
    404         g_assert(users_jid!=NULL); 
    405  
    406         njid=jid_normalized(u->jid,0); 
    407         g_assert(njid!=NULL); 
    408         if (g_hash_table_lookup_extended(users_jid,(gpointer)njid,&key,&value)){ 
    409                 g_assert(u==value); 
    410                 g_hash_table_remove(users_jid,(gpointer)njid); 
    411                 g_free(key); 
    412         } 
    413         else debug(L_("user_remove: user '%s' not found in hash table"),njid); 
    414         g_free(njid); 
    415         return user_destroy(u); 
    416 } 
    417441 
    418442User *user_create(const char *jid,uin_t uin,const char * password){ 
     
    462486        g_assert(users_jid!=NULL); 
    463487        g_hash_table_insert(users_jid,(gpointer)njid,(gpointer)u); 
     488        u->refcount=0; 
    464489        return u; 
    465490} 
     
    613638        njid=jid_normalized(u->jid,0); 
    614639        g_assert(njid!=NULL); 
    615         r=user_remove(u); 
    616         if (r){ 
    617                 g_free(njid); 
    618                 return r; 
    619         } 
    620640 
    621641        r=unlink(njid); 
  • trunk/src/users.h

    r595 r616  
    6464 
    6565        int confirmed; 
     66        int refcount; 
    6667        GList *contacts; 
    6768}User; 
     
    7172 
    7273User *user_create(const char *jid,uin_t uin,const char * password); 
    73 int user_remove(User *u); 
     74int user_ref(User *u); 
     75int user_unref(User *u); 
    7476int user_delete(User *u); 
    7577