/[LeafOK_CVS]/lbbs/src/user_list.c
ViewVC logotype

Diff of /lbbs/src/user_list.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.17 by sysadm, Thu Oct 23 01:58:05 2025 UTC Revision 1.18 by sysadm, Thu Oct 23 04:09:13 2025 UTC
# Line 19  Line 19 
19  #include "log.h"  #include "log.h"
20  #include "trie_dict.h"  #include "trie_dict.h"
21  #include "user_list.h"  #include "user_list.h"
22    #include "user_stat.h"
23  #include <errno.h>  #include <errno.h>
24  #include <stdlib.h>  #include <stdlib.h>
25  #include <string.h>  #include <string.h>
# Line 53  struct user_list_pool_t Line 54  struct user_list_pool_t
54          USER_ONLINE_LIST user_online_list[2];          USER_ONLINE_LIST user_online_list[2];
55          USER_ONLINE_LIST *p_online_current;          USER_ONLINE_LIST *p_online_current;
56          USER_ONLINE_LIST *p_online_new;          USER_ONLINE_LIST *p_online_new;
57            USER_STAT_MAP user_stat_map;
58  };  };
59  typedef struct user_list_pool_t USER_LIST_POOL;  typedef struct user_list_pool_t USER_LIST_POOL;
60    
# Line 431  int user_list_pool_init(void) Line 433  int user_list_pool_init(void)
433          p_user_list_pool->p_online_current = &(p_user_list_pool->user_online_list[0]);          p_user_list_pool->p_online_current = &(p_user_list_pool->user_online_list[0]);
434          p_user_list_pool->p_online_new = &(p_user_list_pool->user_online_list[1]);          p_user_list_pool->p_online_new = &(p_user_list_pool->user_online_list[1]);
435    
436            user_stat_map_init(&(p_user_list_pool->user_stat_map));
437    
438          return 0;          return 0;
439  }  }
440    
# Line 1061  int query_user_online_info_by_uid(int32_ Line 1065  int query_user_online_info_by_uid(int32_
1065    
1066          return ret;          return ret;
1067  }  }
1068    
1069    int get_user_id_list(int32_t *p_uid_list, int *p_user_cnt, int start_uid)
1070    {
1071            int left;
1072            int right;
1073            int mid;
1074            int ret = 0;
1075            int i;
1076    
1077            if (p_uid_list == NULL || p_user_cnt == NULL)
1078            {
1079                    log_error("NULL pointer error\n");
1080                    return -1;
1081            }
1082    
1083            // acquire lock of user list
1084            if (user_list_rd_lock(p_user_list_pool->semid) < 0)
1085            {
1086                    log_error("user_list_rd_lock() error\n");
1087                    return -2;
1088            }
1089    
1090            left = 0;
1091            right = p_user_list_pool->p_current->user_count - 1;
1092    
1093            while (left < right)
1094            {
1095                    mid = (left + right) / 2;
1096                    if (start_uid < p_user_list_pool->p_current->index_uid[mid].uid)
1097                    {
1098                            right = mid;
1099                    }
1100                    else if (start_uid > p_user_list_pool->p_current->index_uid[mid].uid)
1101                    {
1102                            left = mid + 1;
1103                    }
1104                    else // if (start_uid == p_user_list_pool->p_current->index_uid[mid].uid)
1105                    {
1106                            left = mid;
1107                            break;
1108                    }
1109            }
1110    
1111            for (i = 0; i < *p_user_cnt && left + i < p_user_list_pool->p_current->user_count; i++)
1112            {
1113                    p_uid_list[i] = p_user_list_pool->p_current->index_uid[left + i].uid;
1114            }
1115            *p_user_cnt = i;
1116    
1117            // release lock of user list
1118            if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
1119            {
1120                    log_error("user_list_rd_unlock() error\n");
1121                    ret = -1;
1122            }
1123    
1124            return ret;
1125    }
1126    
1127    int user_stat_update(void)
1128    {
1129            return user_stat_map_update(&(p_user_list_pool->user_stat_map));
1130    }
1131    
1132    int user_stat_get_article_cnt(int32_t uid)
1133    {
1134            const USER_STAT *p_stat;
1135            int ret;
1136    
1137            ret = user_stat_get(&(p_user_list_pool->user_stat_map), uid, &p_stat);
1138            if (ret < 0)
1139            {
1140                    log_error("user_stat_get(uid=%d) error: %d\n", uid, ret);
1141                    return -1;
1142            }
1143            else if (ret == 0) // user not found
1144            {
1145                    return -1;
1146            }
1147    
1148            return p_stat->article_count;
1149    }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1