/[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.39 by sysadm, Thu Nov 20 01:54:18 2025 UTC Revision 1.48 by sysadm, Sat Jan 3 10:27:14 2026 UTC
# Line 3  Line 3 
3   * user_list   * user_list
4   *   - data model and basic operations of (online) user list   *   - data model and basic operations of (online) user list
5   *   *
6   * Copyright (C) 2004-2025  Leaflet <leaflet@leafok.com>   * Copyright (C) 2004-2026  Leaflet <leaflet@leafok.com>
7   */   */
8    
9  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
# Line 23  Line 23 
23  #include <time.h>  #include <time.h>
24  #include <sys/mman.h>  #include <sys/mman.h>
25  #include <sys/param.h>  #include <sys/param.h>
 #include <sys/sem.h>  
26  #include <sys/stat.h>  #include <sys/stat.h>
27    
28  #if defined(_SEM_SEMUN_UNDEFINED) || defined(__CYGWIN__)  #ifdef HAVE_SYSTEM_V
29    #include <sys/sem.h>
30    
31    #ifdef _SEM_SEMUN_UNDEFINED
32  union semun  union semun
33  {  {
34          int val;                           /* Value for SETVAL */          int val;                           /* Value for SETVAL */
35          struct semid_ds *buf;  /* Buffer for IPC_STAT, IPC_SET */          struct semid_ds *buf;  /* Buffer for IPC_STAT, IPC_SET */
36          unsigned short *array; /* Array for GETALL, SETALL */          unsigned short *array; /* Array for GETALL, SETALL */
37          struct seminfo *__buf; /* Buffer for IPC_INFO          struct seminfo *__buf; /* Buffer for IPC_INFO
38                                                            (Linux-specific) */                                                          (Linux-specific) */
39  };  };
40  #endif // #if defined(_SEM_SEMUN_UNDEFINED)  #endif // #ifdef _SEM_SEMUN_UNDEFINED
41    
42    #else
43    #include <semaphore.h>
44    #endif
45    
46  enum _user_list_constant_t  enum _user_list_constant_t
47  {  {
48          USER_LIST_TRY_LOCK_WAIT_TIME = 1, // second          USER_LIST_TRY_LOCK_WAIT_TIME = 1, // second
49          USER_LIST_TRY_LOCK_TIMES = 10,          USER_LIST_TRY_LOCK_TIMES = 10,
50            USER_LIST_DEAD_LOCK_TIMEOUT = 15, // second
51  };  };
52    
53  struct user_list_pool_t  struct user_list_pool_t
54  {  {
55          size_t shm_size;          size_t shm_size;
56    #ifndef HAVE_SYSTEM_V
57            sem_t sem;
58            uint16_t read_lock_count;
59            uint16_t write_lock_count;
60    #else
61          int semid;          int semid;
62    #endif
63          USER_LIST user_list[2];          USER_LIST user_list[2];
64          int user_list_index_current;          int user_list_index_current;
65          int user_list_index_new;          int user_list_index_new;
# Line 58  struct user_list_pool_t Line 71  struct user_list_pool_t
71  };  };
72  typedef struct user_list_pool_t USER_LIST_POOL;  typedef struct user_list_pool_t USER_LIST_POOL;
73    
74  static char user_list_shm_name[FILE_PATH_LEN];  static char user_list_shm_name[FILE_NAME_LEN];
75  static USER_LIST_POOL *p_user_list_pool = NULL;  static USER_LIST_POOL *p_user_list_pool = NULL;
76  static TRIE_NODE *p_trie_action_dict = NULL;  static TRIE_NODE *p_trie_action_dict = NULL;
77    
# Line 78  const USER_ACTION_MAP user_action_map[] Line 91  const USER_ACTION_MAP user_action_map[]
91                  {"MENU", "菜单选择"},                  {"MENU", "菜单选择"},
92                  {"POST_ARTICLE", "撰写文章"},                  {"POST_ARTICLE", "撰写文章"},
93                  {"REPLY_ARTICLE", "回复文章"},                  {"REPLY_ARTICLE", "回复文章"},
94                    {"TOP10_MENU", "十大热门"},
95                  {"USER_LIST", "查花名册"},                  {"USER_LIST", "查花名册"},
96                  {"USER_ONLINE", "环顾四周"},                  {"USER_ONLINE", "环顾四周"},
97                  {"VIEW_ARTICLE", "阅读文章"},                  {"VIEW_ARTICLE", "阅读文章"},
# Line 92  static int user_list_rd_unlock(void); Line 106  static int user_list_rd_unlock(void);
106  static int user_list_rw_unlock(void);  static int user_list_rw_unlock(void);
107  static int user_list_rd_lock(void);  static int user_list_rd_lock(void);
108  static int user_list_rw_lock(void);  static int user_list_rw_lock(void);
109    #ifndef HAVE_SYSTEM_V
110    static int user_list_reset_lock(void);
111    #endif
112    
113  static int user_list_load(MYSQL *db, USER_LIST *p_list);  static int user_list_load(MYSQL *db, USER_LIST *p_list);
114  static int user_online_list_load(MYSQL *db, USER_ONLINE_LIST *p_online_list);  static int user_online_list_load(MYSQL *db, USER_ONLINE_LIST *p_online_list);
# Line 135  int user_list_load(MYSQL *db, USER_LIST Line 152  int user_list_load(MYSQL *db, USER_LIST
152    
153          if (db == NULL || p_list == NULL)          if (db == NULL || p_list == NULL)
154          {          {
155                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
156                  return -1;                  return -1;
157          }          }
158    
# Line 158  int user_list_load(MYSQL *db, USER_LIST Line 175  int user_list_load(MYSQL *db, USER_LIST
175    
176          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
177          {          {
178                  log_error("Query user info error: %s\n", mysql_error(db));                  log_error("Query user info error: %s", mysql_error(db));
179                  ret = -1;                  ret = -1;
180                  goto cleanup;                  goto cleanup;
181          }          }
182    
183          if ((rs = mysql_use_result(db)) == NULL)          if ((rs = mysql_use_result(db)) == NULL)
184          {          {
185                  log_error("Get user info data failed\n");                  log_error("Get user info data failed");
186                  ret = -1;                  ret = -1;
187                  goto cleanup;                  goto cleanup;
188          }          }
# Line 193  int user_list_load(MYSQL *db, USER_LIST Line 210  int user_list_load(MYSQL *db, USER_LIST
210                  intro_len = strlen((row[12] == NULL ? "" : row[12]));                  intro_len = strlen((row[12] == NULL ? "" : row[12]));
211                  if (intro_len >= sizeof(p_list->user_intro_buf) - 1 - intro_buf_offset)                  if (intro_len >= sizeof(p_list->user_intro_buf) - 1 - intro_buf_offset)
212                  {                  {
213                          log_error("OOM for user introduction: len=%d, i=%d\n", intro_len, i);                          log_error("OOM for user introduction: len=%d, i=%d", intro_len, i);
214                          break;                          break;
215                  }                  }
216                  memcpy(p_list->user_intro_buf + intro_buf_offset,                  memcpy(p_list->user_intro_buf + intro_buf_offset,
# Line 205  int user_list_load(MYSQL *db, USER_LIST Line 222  int user_list_load(MYSQL *db, USER_LIST
222                  i++;                  i++;
223                  if (i >= BBS_max_user_count)                  if (i >= BBS_max_user_count)
224                  {                  {
225                          log_error("Too many users, exceed limit %d\n", BBS_max_user_count);                          log_error("Too many users, exceed limit %d", BBS_max_user_count);
226                          break;                          break;
227                  }                  }
228          }          }
# Line 223  int user_list_load(MYSQL *db, USER_LIST Line 240  int user_list_load(MYSQL *db, USER_LIST
240    
241                  qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);                  qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);
242    
243  #ifdef _DEBUG                  log_debug("Rebuild index of %d users, last_uid=%d", i, p_list->users[i - 1].uid);
                 log_error("Rebuild index of %d users, last_uid=%d\n", i, p_list->users[i - 1].uid);  
 #endif  
244          }          }
245    
246          p_list->user_count = i;          p_list->user_count = i;
247    
248  #ifdef _DEBUG          log_debug("Loaded %d users", p_list->user_count);
         log_error("Loaded %d users\n", p_list->user_count);  
 #endif  
249    
250  cleanup:  cleanup:
251          mysql_free_result(rs);          mysql_free_result(rs);
# Line 253  int user_online_list_load(MYSQL *db, USE Line 266  int user_online_list_load(MYSQL *db, USE
266    
267          if (db == NULL || p_online_list == NULL)          if (db == NULL || p_online_list == NULL)
268          {          {
269                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
270                  return -1;                  return -1;
271          }          }
272    
# Line 266  int user_online_list_load(MYSQL *db, USE Line 279  int user_online_list_load(MYSQL *db, USE
279    
280          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
281          {          {
282                  log_error("Query user online error: %s\n", mysql_error(db));                  log_error("Query user online error: %s", mysql_error(db));
283                  ret = -1;                  ret = -1;
284                  goto cleanup;                  goto cleanup;
285          }          }
286    
287          if ((rs = mysql_use_result(db)) == NULL)          if ((rs = mysql_use_result(db)) == NULL)
288          {          {
289                  log_error("Get user online data failed\n");                  log_error("Get user online data failed");
290                  ret = -1;                  ret = -1;
291                  goto cleanup;                  goto cleanup;
292          }          }
# Line 299  int user_online_list_load(MYSQL *db, USE Line 312  int user_online_list_load(MYSQL *db, USE
312    
313                  if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_online_list->users[i].user_info), NULL, 0)) <= 0)                  if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_online_list->users[i].user_info), NULL, 0)) <= 0)
314                  {                  {
315                          log_error("query_user_info_by_uid(%d) error\n", atoi(row[1]));                          log_error("query_user_info_by_uid(%d) error", atoi(row[1]));
316                          continue;                          continue;
317                  }                  }
318    
# Line 315  int user_online_list_load(MYSQL *db, USE Line 328  int user_online_list_load(MYSQL *db, USE
328                  }                  }
329                  else if (trie_dict_get(p_trie_action_dict, p_online_list->users[i].current_action, (int64_t *)(&(p_online_list->users[i].current_action_title))) < 0)                  else if (trie_dict_get(p_trie_action_dict, p_online_list->users[i].current_action, (int64_t *)(&(p_online_list->users[i].current_action_title))) < 0)
330                  {                  {
331                          log_error("trie_dict_get(p_trie_action_dict, %s) error on session_id=%s\n",                          log_error("trie_dict_get(p_trie_action_dict, %s) error on session_id=%s",
332                                            p_online_list->users[i].current_action, p_online_list->users[i].session_id);                                            p_online_list->users[i].current_action, p_online_list->users[i].session_id);
333                          continue;                          continue;
334                  }                  }
# Line 326  int user_online_list_load(MYSQL *db, USE Line 339  int user_online_list_load(MYSQL *db, USE
339                  i++;                  i++;
340                  if (i >= BBS_max_user_online_count)                  if (i >= BBS_max_user_online_count)
341                  {                  {
342                          log_error("Too many online users, exceed limit %d\n", BBS_max_user_online_count);                          log_error("Too many online users, exceed limit %d", BBS_max_user_online_count);
343                          break;                          break;
344                  }                  }
345          }          }
# Line 362  int user_login_count_load(MYSQL *db) Line 375  int user_login_count_load(MYSQL *db)
375    
376          if (db == NULL)          if (db == NULL)
377          {          {
378                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
379                  return -1;                  return -1;
380          }          }
381    
# Line 370  int user_login_count_load(MYSQL *db) Line 383  int user_login_count_load(MYSQL *db)
383                           "SELECT ID FROM user_login_log ORDER BY ID DESC LIMIT 1");                           "SELECT ID FROM user_login_log ORDER BY ID DESC LIMIT 1");
384          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
385          {          {
386                  log_error("Query user_login_log error: %s\n", mysql_error(db));                  log_error("Query user_login_log error: %s", mysql_error(db));
387                  return -2;                  return -2;
388          }          }
389          if ((rs = mysql_store_result(db)) == NULL)          if ((rs = mysql_store_result(db)) == NULL)
390          {          {
391                  log_error("Get user_login_log data failed\n");                  log_error("Get user_login_log data failed");
392                  return -2;                  return -2;
393          }          }
394          if ((row = mysql_fetch_row(rs)))          if ((row = mysql_fetch_row(rs)))
# Line 393  int user_list_pool_init(const char *file Line 406  int user_list_pool_init(const char *file
406          int fd;          int fd;
407          size_t size;          size_t size;
408          void *p_shm;          void *p_shm;
409    #ifdef HAVE_SYSTEM_V
410          int proj_id;          int proj_id;
411          key_t key;          key_t key;
412          int semid;          int semid;
413          union semun arg;          union semun arg;
414    #endif
415          int i;          int i;
416    
417          if (p_user_list_pool != NULL || p_trie_action_dict != NULL)          if (p_user_list_pool != NULL || p_trie_action_dict != NULL)
418          {          {
419                  log_error("p_user_list_pool already initialized\n");                  log_error("p_user_list_pool already initialized");
420                  return -1;                  return -1;
421          }          }
422    
423          p_trie_action_dict = trie_dict_create();          p_trie_action_dict = trie_dict_create();
424          if (p_trie_action_dict == NULL)          if (p_trie_action_dict == NULL)
425          {          {
426                  log_error("trie_dict_create() error\n");                  log_error("trie_dict_create() error");
427                  return -1;                  return -1;
428          }          }
429    
# Line 416  int user_list_pool_init(const char *file Line 431  int user_list_pool_init(const char *file
431          {          {
432                  if (trie_dict_set(p_trie_action_dict, user_action_map[i].name, (int64_t)(user_action_map[i].title)) < 0)                  if (trie_dict_set(p_trie_action_dict, user_action_map[i].name, (int64_t)(user_action_map[i].title)) < 0)
433                  {                  {
434                          log_error("trie_dict_set(p_trie_action_dict, %s) error\n", user_action_map[i].name);                          log_error("trie_dict_set(p_trie_action_dict, %s) error", user_action_map[i].name);
435                  }                  }
436          }          }
437    
# Line 429  int user_list_pool_init(const char *file Line 444  int user_list_pool_init(const char *file
444    
445          if (shm_unlink(user_list_shm_name) == -1 && errno != ENOENT)          if (shm_unlink(user_list_shm_name) == -1 && errno != ENOENT)
446          {          {
447                  log_error("shm_unlink(%s) error (%d)\n", user_list_shm_name, errno);                  log_error("shm_unlink(%s) error (%d)", user_list_shm_name, errno);
448                  return -2;                  return -2;
449          }          }
450    
451          if ((fd = shm_open(user_list_shm_name, O_CREAT | O_EXCL | O_RDWR, 0600)) == -1)          if ((fd = shm_open(user_list_shm_name, O_CREAT | O_EXCL | O_RDWR, 0600)) == -1)
452          {          {
453                  log_error("shm_open(%s) error (%d)\n", user_list_shm_name, errno);                  log_error("shm_open(%s) error (%d)", user_list_shm_name, errno);
454                  return -2;                  return -2;
455          }          }
456          if (ftruncate(fd, (off_t)size) == -1)          if (ftruncate(fd, (off_t)size) == -1)
457          {          {
458                  log_error("ftruncate(size=%d) error (%d)\n", size, errno);                  log_error("ftruncate(size=%d) error (%d)", size, errno);
459                  close(fd);                  close(fd);
460                  return -2;                  return -2;
461          }          }
# Line 448  int user_list_pool_init(const char *file Line 463  int user_list_pool_init(const char *file
463          p_shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0L);          p_shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0L);
464          if (p_shm == MAP_FAILED)          if (p_shm == MAP_FAILED)
465          {          {
466                  log_error("mmap() error (%d)\n", errno);                  log_error("mmap() error (%d)", errno);
467                  close(fd);                  close(fd);
468                  return -2;                  return -2;
469          }          }
470    
471          if (close(fd) < 0)          if (close(fd) < 0)
472          {          {
473                  log_error("close(fd) error (%d)\n", errno);                  log_error("close(fd) error (%d)", errno);
474                  return -1;                  return -1;
475          }          }
476    
# Line 463  int user_list_pool_init(const char *file Line 478  int user_list_pool_init(const char *file
478          p_user_list_pool->shm_size = size;          p_user_list_pool->shm_size = size;
479    
480          // Allocate semaphore as user list pool lock          // Allocate semaphore as user list pool lock
481    #ifndef HAVE_SYSTEM_V
482            if (sem_init(&(p_user_list_pool->sem), 1, 1) == -1)
483            {
484                    log_error("sem_init() error (%d)", errno);
485                    return -3;
486            }
487    
488            p_user_list_pool->read_lock_count = 0;
489            p_user_list_pool->write_lock_count = 0;
490    #else
491          proj_id = (int)(time(NULL) % getpid());          proj_id = (int)(time(NULL) % getpid());
492          key = ftok(filename, proj_id);          key = ftok(filename, proj_id);
493          if (key == -1)          if (key == -1)
494          {          {
495                  log_error("ftok(%s %d) error (%d)\n", filename, proj_id, errno);                  log_error("ftok(%s %d) error (%d)", filename, proj_id, errno);
496                  return -2;                  return -2;
497          }          }
498    
# Line 475  int user_list_pool_init(const char *file Line 500  int user_list_pool_init(const char *file
500          semid = semget(key, (int)size, IPC_CREAT | IPC_EXCL | 0600);          semid = semget(key, (int)size, IPC_CREAT | IPC_EXCL | 0600);
501          if (semid == -1)          if (semid == -1)
502          {          {
503                  log_error("semget(user_list_pool_sem, size = %d) error (%d)\n", size, errno);                  log_error("semget(user_list_pool_sem, size = %d) error (%d)", size, errno);
504                  return -3;                  return -3;
505          }          }
506    
# Line 485  int user_list_pool_init(const char *file Line 510  int user_list_pool_init(const char *file
510          {          {
511                  if (semctl(semid, i, SETVAL, arg) == -1)                  if (semctl(semid, i, SETVAL, arg) == -1)
512                  {                  {
513                          log_error("semctl(user_list_pool_sem, SETVAL) error (%d)\n", errno);                          log_error("semctl(user_list_pool_sem, SETVAL) error (%d)", errno);
514                          return -3;                          return -3;
515                  }                  }
516          }          }
517    
518          p_user_list_pool->semid = semid;          p_user_list_pool->semid = semid;
519    #endif
520    
521          // Set user counts to 0          // Set user counts to 0
522          p_user_list_pool->user_list[0].user_count = 0;          p_user_list_pool->user_list[0].user_count = 0;
# Line 507  int user_list_pool_init(const char *file Line 533  int user_list_pool_init(const char *file
533          return 0;          return 0;
534  }  }
535    
536  int user_list_pool_cleanup(void)  void user_list_pool_cleanup(void)
537  {  {
538          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
539          {          {
540                  return -1;                  return;
541          }          }
542    
543    #ifdef HAVE_SYSTEM_V
544            if (semctl(p_user_list_pool->semid, 0, IPC_RMID) == -1)
545            {
546                    log_error("semctl(semid = %d, IPC_RMID) error (%d)", p_user_list_pool->semid, errno);
547            }
548    #else
549            if (sem_destroy(&(p_user_list_pool->sem)) == -1)
550            {
551                    log_error("sem_destroy() error (%d)", errno);
552            }
553    #endif
554    
555          detach_user_list_pool_shm();          detach_user_list_pool_shm();
556    
557          if (shm_unlink(user_list_shm_name) == -1 && errno != ENOENT)          if (shm_unlink(user_list_shm_name) == -1 && errno != ENOENT)
558          {          {
559                  log_error("shm_unlink(%s) error (%d)\n", user_list_shm_name, errno);                  log_error("shm_unlink(%s) error (%d)", user_list_shm_name, errno);
                 return -2;  
560          }          }
561    
562          user_list_shm_name[0] = '\0';          user_list_shm_name[0] = '\0';
# Line 530  int user_list_pool_cleanup(void) Line 567  int user_list_pool_cleanup(void)
567    
568                  p_trie_action_dict = NULL;                  p_trie_action_dict = NULL;
569          }          }
   
         return 0;  
570  }  }
571    
572  int set_user_list_pool_shm_readonly(void)  int set_user_list_pool_shm_readonly(void)
573  {  {
574          if (p_user_list_pool != NULL && mprotect(p_user_list_pool, p_user_list_pool->shm_size, PROT_READ) < 0)          if (p_user_list_pool != NULL && mprotect(p_user_list_pool, p_user_list_pool->shm_size, PROT_READ) < 0)
575          {          {
576                  log_error("mprotect() error (%d)\n", errno);                  log_error("mprotect() error (%d)", errno);
577                  return -1;                  return -1;
578          }          }
579    
# Line 549  int detach_user_list_pool_shm(void) Line 584  int detach_user_list_pool_shm(void)
584  {  {
585          if (p_user_list_pool != NULL && munmap(p_user_list_pool, p_user_list_pool->shm_size) < 0)          if (p_user_list_pool != NULL && munmap(p_user_list_pool, p_user_list_pool->shm_size) < 0)
586          {          {
587                  log_error("munmap() error (%d)\n", errno);                  log_error("munmap() error (%d)", errno);
588                  return -1;                  return -1;
589          }          }
590    
# Line 566  int user_list_pool_reload(int online_use Line 601  int user_list_pool_reload(int online_use
601    
602          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
603          {          {
604                  log_error("p_user_list_pool not initialized\n");                  log_error("p_user_list_pool not initialized");
605                  return -1;                  return -1;
606          }          }
607    
608          db = db_open();          db = db_open();
609          if (db == NULL)          if (db == NULL)
610          {          {
611                  log_error("db_open() error: %s\n", mysql_error(db));                  log_error("db_open() error: %s", mysql_error(db));
612                  return -1;                  return -1;
613          }          }
614    
# Line 581  int user_list_pool_reload(int online_use Line 616  int user_list_pool_reload(int online_use
616          {          {
617                  if (user_online_list_load(db, &(p_user_list_pool->user_online_list[p_user_list_pool->user_online_list_index_new])) < 0)                  if (user_online_list_load(db, &(p_user_list_pool->user_online_list[p_user_list_pool->user_online_list_index_new])) < 0)
618                  {                  {
619                          log_error("user_online_list_load() error\n");                          log_error("user_online_list_load() error");
620                          ret = -2;                          ret = -2;
621                          goto cleanup;                          goto cleanup;
622                  }                  }
623    
624                  if (user_login_count_load(db) < 0)                  if (user_login_count_load(db) < 0)
625                  {                  {
626                          log_error("user_login_count_load() error\n");                          log_error("user_login_count_load() error");
627                          ret = -2;                          ret = -2;
628                          goto cleanup;                          goto cleanup;
629                  }                  }
# Line 597  int user_list_pool_reload(int online_use Line 632  int user_list_pool_reload(int online_use
632          {          {
633                  if (user_list_load(db, &(p_user_list_pool->user_list[p_user_list_pool->user_list_index_new])) < 0)                  if (user_list_load(db, &(p_user_list_pool->user_list[p_user_list_pool->user_list_index_new])) < 0)
634                  {                  {
635                          log_error("user_list_load() error\n");                          log_error("user_list_load() error");
636                          ret = -2;                          ret = -2;
637                          goto cleanup;                          goto cleanup;
638                  }                  }
# Line 608  int user_list_pool_reload(int online_use Line 643  int user_list_pool_reload(int online_use
643    
644          if (user_list_rw_lock() < 0)          if (user_list_rw_lock() < 0)
645          {          {
646                  log_error("user_list_rw_lock() error\n");                  log_error("user_list_rw_lock() error");
647                  ret = -3;                  ret = -3;
648                  goto cleanup;                  goto cleanup;
649          }          }
# Line 630  int user_list_pool_reload(int online_use Line 665  int user_list_pool_reload(int online_use
665    
666          if (user_list_rw_unlock() < 0)          if (user_list_rw_unlock() < 0)
667          {          {
668                  log_error("user_list_rw_unlock() error\n");                  log_error("user_list_rw_unlock() error");
669                  ret = -3;                  ret = -3;
670                  goto cleanup;                  goto cleanup;
671          }          }
# Line 643  cleanup: Line 678  cleanup:
678    
679  int user_list_try_rd_lock(int wait_sec)  int user_list_try_rd_lock(int wait_sec)
680  {  {
681    #ifdef HAVE_SYSTEM_V
682          struct sembuf sops[2];          struct sembuf sops[2];
 #ifndef __CYGWIN__  
         struct timespec timeout;  
683  #endif  #endif
684          int ret;          struct timespec timeout;
685            int ret = 0;
686    
687          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
688          {          {
689                  log_error("p_user_list_pool not initialized\n");                  log_error("p_user_list_pool not initialized");
690                  return -1;                  return -1;
691          }          }
692    
693            timeout.tv_sec = wait_sec;
694            timeout.tv_nsec = 0;
695    
696    #ifdef HAVE_SYSTEM_V
697          sops[0].sem_num = 1; // w_sem          sops[0].sem_num = 1; // w_sem
698          sops[0].sem_op = 0;      // wait until unlocked          sops[0].sem_op = 0;      // wait until unlocked
699          sops[0].sem_flg = 0;          sops[0].sem_flg = 0;
# Line 663  int user_list_try_rd_lock(int wait_sec) Line 702  int user_list_try_rd_lock(int wait_sec)
702          sops[1].sem_op = 1;                     // lock          sops[1].sem_op = 1;                     // lock
703          sops[1].sem_flg = SEM_UNDO; // undo on terminate          sops[1].sem_flg = SEM_UNDO; // undo on terminate
704    
 #ifdef __CYGWIN__  
         ret = semop(p_user_list_pool->semid, sops, 2);  
 #else  
         timeout.tv_sec = wait_sec;  
         timeout.tv_nsec = 0;  
   
705          ret = semtimedop(p_user_list_pool->semid, sops, 2, &timeout);          ret = semtimedop(p_user_list_pool->semid, sops, 2, &timeout);
 #endif  
706          if (ret == -1 && errno != EAGAIN && errno != EINTR)          if (ret == -1 && errno != EAGAIN && errno != EINTR)
707          {          {
708                  log_error("semop(lock read) error %d\n", errno);                  log_error("semop(lock read) error %d", errno);
709            }
710    #else
711            if (sem_timedwait(&(p_user_list_pool->sem), &timeout) == -1)
712            {
713                    if (errno != ETIMEDOUT && errno != EAGAIN && errno != EINTR)
714                    {
715                            log_error("sem_timedwait() error %d", errno);
716                    }
717                    return -1;
718            }
719    
720            if (p_user_list_pool->write_lock_count == 0)
721            {
722                    p_user_list_pool->read_lock_count++;
723            }
724            else
725            {
726                    errno = EAGAIN;
727                    ret = -1;
728            }
729    
730            if (sem_post(&(p_user_list_pool->sem)) == -1)
731            {
732                    log_error("sem_post() error %d", errno);
733                    return -1;
734          }          }
735    #endif
736    
737          return ret;          return ret;
738  }  }
739    
740  int user_list_try_rw_lock(int wait_sec)  int user_list_try_rw_lock(int wait_sec)
741  {  {
742    #ifdef HAVE_SYSTEM_V
743          struct sembuf sops[3];          struct sembuf sops[3];
 #ifndef __CYGWIN__  
         struct timespec timeout;  
744  #endif  #endif
745          int ret;          struct timespec timeout;
746            int ret = 0;
747    
748          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
749          {          {
750                  log_error("p_user_list_pool not initialized\n");                  log_error("p_user_list_pool not initialized");
751                  return -1;                  return -1;
752          }          }
753    
754            timeout.tv_sec = wait_sec;
755            timeout.tv_nsec = 0;
756    
757    #ifdef HAVE_SYSTEM_V
758          sops[0].sem_num = 1; // w_sem          sops[0].sem_num = 1; // w_sem
759          sops[0].sem_op = 0;      // wait until unlocked          sops[0].sem_op = 0;      // wait until unlocked
760          sops[0].sem_flg = 0;          sops[0].sem_flg = 0;
# Line 705  int user_list_try_rw_lock(int wait_sec) Line 767  int user_list_try_rw_lock(int wait_sec)
767          sops[2].sem_op = 0;      // wait until unlocked          sops[2].sem_op = 0;      // wait until unlocked
768          sops[2].sem_flg = 0;          sops[2].sem_flg = 0;
769    
 #ifdef __CYGWIN__  
         ret = semop(p_user_list_pool->semid, sops, 3);  
 #else  
         timeout.tv_sec = wait_sec;  
         timeout.tv_nsec = 0;  
   
770          ret = semtimedop(p_user_list_pool->semid, sops, 3, &timeout);          ret = semtimedop(p_user_list_pool->semid, sops, 3, &timeout);
 #endif  
771          if (ret == -1 && errno != EAGAIN && errno != EINTR)          if (ret == -1 && errno != EAGAIN && errno != EINTR)
772          {          {
773                  log_error("semop(lock write) error %d\n", errno);                  log_error("semop(lock write) error %d", errno);
774            }
775    #else
776            if (sem_timedwait(&(p_user_list_pool->sem), &timeout) == -1)
777            {
778                    if (errno != ETIMEDOUT && errno != EAGAIN && errno != EINTR)
779                    {
780                            log_error("sem_timedwait() error %d", errno);
781                    }
782                    return -1;
783          }          }
784    
785            if (p_user_list_pool->read_lock_count == 0 && p_user_list_pool->write_lock_count == 0)
786            {
787                    p_user_list_pool->write_lock_count++;
788            }
789            else
790            {
791                    errno = EAGAIN;
792                    ret = -1;
793            }
794    
795            if (sem_post(&(p_user_list_pool->sem)) == -1)
796            {
797                    log_error("sem_post() error %d", errno);
798                    return -1;
799            }
800    #endif
801    
802          return ret;          return ret;
803  }  }
804    
805  int user_list_rd_unlock(void)  int user_list_rd_unlock(void)
806  {  {
807    #ifdef HAVE_SYSTEM_V
808          struct sembuf sops[2];          struct sembuf sops[2];
809          int ret;  #endif
810            int ret = 0;
811    
812          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
813          {          {
814                  log_error("p_user_list_pool not initialized\n");                  log_error("p_user_list_pool not initialized");
815                  return -1;                  return -1;
816          }          }
817    
818    #ifdef HAVE_SYSTEM_V
819          sops[0].sem_num = 0;                                     // r_sem          sops[0].sem_num = 0;                                     // r_sem
820          sops[0].sem_op = -1;                                     // unlock          sops[0].sem_op = -1;                                     // unlock
821          sops[0].sem_flg = IPC_NOWAIT | SEM_UNDO; // no wait          sops[0].sem_flg = IPC_NOWAIT | SEM_UNDO; // no wait
# Line 739  int user_list_rd_unlock(void) Line 823  int user_list_rd_unlock(void)
823          ret = semop(p_user_list_pool->semid, sops, 1);          ret = semop(p_user_list_pool->semid, sops, 1);
824          if (ret == -1 && errno != EAGAIN && errno != EINTR)          if (ret == -1 && errno != EAGAIN && errno != EINTR)
825          {          {
826                  log_error("semop(unlock read) error %d\n", errno);                  log_error("semop(unlock read) error %d", errno);
827            }
828    #else
829            if (sem_wait(&(p_user_list_pool->sem)) == -1)
830            {
831                    if (errno != ETIMEDOUT && errno != EAGAIN && errno != EINTR)
832                    {
833                            log_error("sem_wait() error %d", errno);
834                    }
835                    return -1;
836            }
837    
838            if (p_user_list_pool->read_lock_count > 0)
839            {
840                    p_user_list_pool->read_lock_count--;
841            }
842            else
843            {
844                    log_error("read_lock_count already 0");
845          }          }
846    
847            if (sem_post(&(p_user_list_pool->sem)) == -1)
848            {
849                    log_error("sem_post() error %d", errno);
850                    return -1;
851            }
852    #endif
853    
854          return ret;          return ret;
855  }  }
856    
857  int user_list_rw_unlock(void)  int user_list_rw_unlock(void)
858  {  {
859    #ifdef HAVE_SYSTEM_V
860          struct sembuf sops[1];          struct sembuf sops[1];
861          int ret;  #endif
862            int ret = 0;
863    
864          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
865          {          {
866                  log_error("p_user_list_pool not initialized\n");                  log_error("p_user_list_pool not initialized");
867                  return -1;                  return -1;
868          }          }
869    
870    #ifdef HAVE_SYSTEM_V
871          sops[0].sem_num = 1;                                     // w_sem          sops[0].sem_num = 1;                                     // w_sem
872          sops[0].sem_op = -1;                                     // unlock          sops[0].sem_op = -1;                                     // unlock
873          sops[0].sem_flg = IPC_NOWAIT | SEM_UNDO; // no wait          sops[0].sem_flg = IPC_NOWAIT | SEM_UNDO; // no wait
# Line 763  int user_list_rw_unlock(void) Line 875  int user_list_rw_unlock(void)
875          ret = semop(p_user_list_pool->semid, sops, 1);          ret = semop(p_user_list_pool->semid, sops, 1);
876          if (ret == -1 && errno != EAGAIN && errno != EINTR)          if (ret == -1 && errno != EAGAIN && errno != EINTR)
877          {          {
878                  log_error("semop(unlock write) error %d\n", errno);                  log_error("semop(unlock write) error %d", errno);
879            }
880    #else
881            if (sem_wait(&(p_user_list_pool->sem)) == -1)
882            {
883                    if (errno != ETIMEDOUT && errno != EAGAIN && errno != EINTR)
884                    {
885                            log_error("sem_wait() error %d", errno);
886                    }
887                    return -1;
888            }
889    
890            if (p_user_list_pool->write_lock_count > 0)
891            {
892                    p_user_list_pool->write_lock_count--;
893            }
894            else
895            {
896                    log_error("write_lock_count already 0");
897          }          }
898    
899            if (sem_post(&(p_user_list_pool->sem)) == -1)
900            {
901                    log_error("sem_post() error %d", errno);
902                    return -1;
903            }
904    #endif
905    
906          return ret;          return ret;
907  }  }
908    
# Line 773  int user_list_rd_lock(void) Line 910  int user_list_rd_lock(void)
910  {  {
911          int timer = 0;          int timer = 0;
912          int ret = -1;          int ret = -1;
913            time_t tm_first_failure = 0;
914    
915          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
916          {          {
917                  log_error("p_user_list_pool not initialized\n");                  log_error("p_user_list_pool not initialized");
918                  return -1;                  return -1;
919          }          }
920    
# Line 792  int user_list_rd_lock(void) Line 930  int user_list_rd_lock(void)
930                          timer++;                          timer++;
931                          if (timer % USER_LIST_TRY_LOCK_TIMES == 0)                          if (timer % USER_LIST_TRY_LOCK_TIMES == 0)
932                          {                          {
933                                  log_error("user_list_try_rd_lock() tried %d times\n", timer);                                  log_error("user_list_try_rd_lock() tried %d times", timer);
934    
935                                    if (time(NULL) - tm_first_failure >= USER_LIST_DEAD_LOCK_TIMEOUT)
936                                    {
937                                            log_error("Unable to acquire rw_lock for %d seconds", time(NULL) - tm_first_failure);
938    #ifndef HAVE_SYSTEM_V
939                                            user_list_reset_lock();
940                                            log_error("Reset POSIX semaphore to resolve dead lock");
941    #endif
942                                            break;
943                                    }
944                          }                          }
945                            usleep(100 * 1000); // 0.1 second
946                  }                  }
947                  else // failed                  else // failed
948                  {                  {
949                          log_error("user_list_try_rd_lock() failed\n");                          log_error("user_list_try_rd_lock() failed");
950                          break;                          break;
951                  }                  }
952          }          }
# Line 809  int user_list_rw_lock(void) Line 958  int user_list_rw_lock(void)
958  {  {
959          int timer = 0;          int timer = 0;
960          int ret = -1;          int ret = -1;
961            time_t tm_first_failure = 0;
962    
963          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
964          {          {
965                  log_error("p_user_list_pool not initialized\n");                  log_error("p_user_list_pool not initialized");
966                  return -1;                  return -1;
967          }          }
968    
# Line 828  int user_list_rw_lock(void) Line 978  int user_list_rw_lock(void)
978                          timer++;                          timer++;
979                          if (timer % USER_LIST_TRY_LOCK_TIMES == 0)                          if (timer % USER_LIST_TRY_LOCK_TIMES == 0)
980                          {                          {
981                                  log_error("user_list_try_rw_lock() tried %d times\n", timer);                                  log_error("user_list_try_rw_lock() tried %d times", timer);
982    
983                                    if (time(NULL) - tm_first_failure >= USER_LIST_DEAD_LOCK_TIMEOUT)
984                                    {
985                                            log_error("Unable to acquire rw_lock for %d seconds", time(NULL) - tm_first_failure);
986    #ifndef HAVE_SYSTEM_V
987                                            user_list_reset_lock();
988                                            log_error("Reset POSIX semaphore to resolve dead lock");
989    #endif
990                                            break;
991                                    }
992                          }                          }
993                            usleep(100 * 1000); // 0.1 second
994                  }                  }
995                  else // failed                  else // failed
996                  {                  {
997                          log_error("user_list_try_rw_lock() failed\n");                          log_error("user_list_try_rw_lock() failed");
998                          break;                          break;
999                  }                  }
1000          }          }
# Line 841  int user_list_rw_lock(void) Line 1002  int user_list_rw_lock(void)
1002          return ret;          return ret;
1003  }  }
1004    
1005    #ifndef HAVE_SYSTEM_V
1006    int user_list_reset_lock(void)
1007    {
1008            if (p_user_list_pool == NULL)
1009            {
1010                    log_error("p_user_list_pool not initialized");
1011                    return -1;
1012            }
1013    
1014            if (sem_destroy(&(p_user_list_pool->sem)) == -1)
1015            {
1016                    log_error("sem_destroy() error (%d)", errno);
1017            }
1018    
1019            p_user_list_pool->read_lock_count = 0;
1020            p_user_list_pool->write_lock_count = 0;
1021    
1022            if (sem_init(&(p_user_list_pool->sem), 1, 1) == -1)
1023            {
1024                    log_error("sem_init() error (%d)", errno);
1025            }
1026    
1027            return 0;
1028    }
1029    #endif
1030    
1031  int query_user_list(int page_id, USER_INFO *p_users, int *p_user_count, int *p_page_count)  int query_user_list(int page_id, USER_INFO *p_users, int *p_user_count, int *p_page_count)
1032  {  {
1033          int ret = 0;          int ret = 0;
1034    
1035          if (p_users == NULL || p_user_count == NULL || p_page_count == NULL)          if (p_users == NULL || p_user_count == NULL || p_page_count == NULL)
1036          {          {
1037                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1038                  return -1;                  return -1;
1039          }          }
1040    
# Line 857  int query_user_list(int page_id, USER_IN Line 1044  int query_user_list(int page_id, USER_IN
1044          // acquire lock of user list          // acquire lock of user list
1045          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1046          {          {
1047                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1048                  return -2;                  return -2;
1049          }          }
1050    
# Line 873  int query_user_list(int page_id, USER_IN Line 1060  int query_user_list(int page_id, USER_IN
1060    
1061          if (page_id < 0 || page_id >= *p_page_count)          if (page_id < 0 || page_id >= *p_page_count)
1062          {          {
1063                  log_error("Invalid page_id = %d, not in range [0, %d)\n", page_id, *p_page_count);                  log_error("Invalid page_id = %d, not in range [0, %d)", page_id, *p_page_count);
1064                  ret = -3;                  ret = -3;
1065                  goto cleanup;                  goto cleanup;
1066          }          }
# Line 890  cleanup: Line 1077  cleanup:
1077          // release lock of user list          // release lock of user list
1078          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1079          {          {
1080                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1081                  ret = -1;                  ret = -1;
1082          }          }
1083    
# Line 903  int query_user_online_list(int page_id, Line 1090  int query_user_online_list(int page_id,
1090    
1091          if (p_online_users == NULL || p_user_count == NULL || p_page_count == NULL)          if (p_online_users == NULL || p_user_count == NULL || p_page_count == NULL)
1092          {          {
1093                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1094                  return -1;                  return -1;
1095          }          }
1096    
# Line 913  int query_user_online_list(int page_id, Line 1100  int query_user_online_list(int page_id,
1100          // acquire lock of user list          // acquire lock of user list
1101          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1102          {          {
1103                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1104                  return -2;                  return -2;
1105          }          }
1106    
# Line 928  int query_user_online_list(int page_id, Line 1115  int query_user_online_list(int page_id,
1115    
1116          if (page_id < 0 || page_id >= *p_page_count)          if (page_id < 0 || page_id >= *p_page_count)
1117          {          {
1118                  log_error("Invalid page_id = %d, not in range [0, %d)\n", page_id, *p_page_count);                  log_error("Invalid page_id = %d, not in range [0, %d)", page_id, *p_page_count);
1119                  ret = -3;                  ret = -3;
1120                  goto cleanup;                  goto cleanup;
1121          }          }
# Line 945  cleanup: Line 1132  cleanup:
1132          // release lock of user list          // release lock of user list
1133          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1134          {          {
1135                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1136                  ret = -1;                  ret = -1;
1137          }          }
1138    
# Line 956  int get_user_list_count(int *p_user_cnt) Line 1143  int get_user_list_count(int *p_user_cnt)
1143  {  {
1144          if (p_user_cnt == NULL)          if (p_user_cnt == NULL)
1145          {          {
1146                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1147                  return -1;                  return -1;
1148          }          }
1149    
1150          // acquire lock of user list          // acquire lock of user list
1151          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1152          {          {
1153                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1154                  return -2;                  return -2;
1155          }          }
1156    
# Line 972  int get_user_list_count(int *p_user_cnt) Line 1159  int get_user_list_count(int *p_user_cnt)
1159          // release lock of user list          // release lock of user list
1160          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1161          {          {
1162                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1163                  return -2;                  return -2;
1164          }          }
1165    
# Line 983  int get_user_online_list_count(int *p_us Line 1170  int get_user_online_list_count(int *p_us
1170  {  {
1171          if (p_user_cnt == NULL || p_guest_cnt == NULL)          if (p_user_cnt == NULL || p_guest_cnt == NULL)
1172          {          {
1173                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1174                  return -1;                  return -1;
1175          }          }
1176    
1177          // acquire lock of user list          // acquire lock of user list
1178          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1179          {          {
1180                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1181                  return -2;                  return -2;
1182          }          }
1183    
# Line 1000  int get_user_online_list_count(int *p_us Line 1187  int get_user_online_list_count(int *p_us
1187          // release lock of user list          // release lock of user list
1188          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1189          {          {
1190                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1191                  return -2;                  return -2;
1192          }          }
1193    
# Line 1011  int get_user_login_count(int *p_login_cn Line 1198  int get_user_login_count(int *p_login_cn
1198  {  {
1199          if (p_login_cnt == NULL)          if (p_login_cnt == NULL)
1200          {          {
1201                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1202                  return -1;                  return -1;
1203          }          }
1204    
# Line 1026  int query_user_info(int32_t id, USER_INF Line 1213  int query_user_info(int32_t id, USER_INF
1213    
1214          if (p_user == NULL)          if (p_user == NULL)
1215          {          {
1216                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1217                  return -1;                  return -1;
1218          }          }
1219    
1220          // acquire lock of user list          // acquire lock of user list
1221          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1222          {          {
1223                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1224                  return -2;                  return -2;
1225          }          }
1226    
# Line 1046  int query_user_info(int32_t id, USER_INF Line 1233  int query_user_info(int32_t id, USER_INF
1233          // release lock of user list          // release lock of user list
1234          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1235          {          {
1236                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1237                  ret = -1;                  ret = -1;
1238          }          }
1239    
# Line 1063  int query_user_info_by_uid(int32_t uid, Line 1250  int query_user_info_by_uid(int32_t uid,
1250    
1251          if (p_user == NULL)          if (p_user == NULL)
1252          {          {
1253                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1254                  return -1;                  return -1;
1255          }          }
1256    
1257          // acquire lock of user list          // acquire lock of user list
1258          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1259          {          {
1260                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1261                  return -2;                  return -2;
1262          }          }
1263    
# Line 1112  int query_user_info_by_uid(int32_t uid, Line 1299  int query_user_info_by_uid(int32_t uid,
1299          // release lock of user list          // release lock of user list
1300          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1301          {          {
1302                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1303                  ret = -1;                  ret = -1;
1304          }          }
1305    
# Line 1133  int query_user_info_by_username(const ch Line 1320  int query_user_info_by_username(const ch
1320    
1321          if (username_prefix == NULL || uid_list == NULL || username_list == NULL)          if (username_prefix == NULL || uid_list == NULL || username_list == NULL)
1322          {          {
1323                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1324                  return -1;                  return -1;
1325          }          }
1326    
# Line 1142  int query_user_info_by_username(const ch Line 1329  int query_user_info_by_username(const ch
1329          // acquire lock of user list          // acquire lock of user list
1330          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1331          {          {
1332                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1333                  return -2;                  return -2;
1334          }          }
1335    
# Line 1170  int query_user_info_by_username(const ch Line 1357  int query_user_info_by_username(const ch
1357    
1358          if (strncasecmp(username_prefix, p_user_list_pool->user_list[p_user_list_pool->user_list_index_current].users[left].username, prefix_len) == 0) // Found          if (strncasecmp(username_prefix, p_user_list_pool->user_list[p_user_list_pool->user_list_index_current].users[left].username, prefix_len) == 0) // Found
1359          {          {
1360  #ifdef _DEBUG                  log_debug("Debug: match found, pos=%d", left);
                 log_error("Debug: match found, pos=%d\n", left);  
 #endif  
1361    
1362                  left_save = left;                  left_save = left;
1363                  right = left;                  right = left;
# Line 1198  int query_user_info_by_username(const ch Line 1383  int query_user_info_by_username(const ch
1383                          }                          }
1384                  }                  }
1385    
1386  #ifdef _DEBUG                  log_debug("Debug: first match found, pos=%d", right);
                 log_error("Debug: first match found, pos=%d\n", right);  
 #endif  
1387    
1388                  left = left_save;                  left = left_save;
1389                  left_save = right;                  left_save = right;
# Line 1226  int query_user_info_by_username(const ch Line 1409  int query_user_info_by_username(const ch
1409                          }                          }
1410                  }                  }
1411    
1412  #ifdef _DEBUG                  log_debug("Debug: last match found, pos=%d", left);
                 log_error("Debug: last match found, pos=%d\n", left);  
 #endif  
1413    
1414                  right = left;                  right = left;
1415                  left = left_save;                  left = left_save;
# Line 1246  cleanup: Line 1427  cleanup:
1427          // release lock of user list          // release lock of user list
1428          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1429          {          {
1430                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1431                  ret = -1;                  ret = -1;
1432          }          }
1433    
# Line 1259  int query_user_online_info(int32_t id, U Line 1440  int query_user_online_info(int32_t id, U
1440    
1441          if (p_user == NULL)          if (p_user == NULL)
1442          {          {
1443                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1444                  return -1;                  return -1;
1445          }          }
1446    
1447          // acquire lock of user list          // acquire lock of user list
1448          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1449          {          {
1450                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1451                  return -2;                  return -2;
1452          }          }
1453    
# Line 1279  int query_user_online_info(int32_t id, U Line 1460  int query_user_online_info(int32_t id, U
1460          // release lock of user list          // release lock of user list
1461          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1462          {          {
1463                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1464                  ret = -1;                  ret = -1;
1465          }          }
1466    
# Line 1298  int query_user_online_info_by_uid(int32_ Line 1479  int query_user_online_info_by_uid(int32_
1479    
1480          if (p_users == NULL || p_user_cnt == NULL)          if (p_users == NULL || p_user_cnt == NULL)
1481          {          {
1482                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1483                  return -1;                  return -1;
1484          }          }
1485    
# Line 1308  int query_user_online_info_by_uid(int32_ Line 1489  int query_user_online_info_by_uid(int32_
1489          // acquire lock of user list          // acquire lock of user list
1490          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1491          {          {
1492                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1493                  return -2;                  return -2;
1494          }          }
1495    
# Line 1370  int query_user_online_info_by_uid(int32_ Line 1551  int query_user_online_info_by_uid(int32_
1551          // release lock of user list          // release lock of user list
1552          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1553          {          {
1554                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1555                  ret = -1;                  ret = -1;
1556          }          }
1557    
# Line 1387  int get_user_id_list(int32_t *p_uid_list Line 1568  int get_user_id_list(int32_t *p_uid_list
1568    
1569          if (p_uid_list == NULL || p_user_cnt == NULL)          if (p_uid_list == NULL || p_user_cnt == NULL)
1570          {          {
1571                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
1572                  return -1;                  return -1;
1573          }          }
1574    
1575          // acquire lock of user list          // acquire lock of user list
1576          if (user_list_rd_lock() < 0)          if (user_list_rd_lock() < 0)
1577          {          {
1578                  log_error("user_list_rd_lock() error\n");                  log_error("user_list_rd_lock() error");
1579                  return -2;                  return -2;
1580          }          }
1581    
# Line 1428  int get_user_id_list(int32_t *p_uid_list Line 1609  int get_user_id_list(int32_t *p_uid_list
1609          // release lock of user list          // release lock of user list
1610          if (user_list_rd_unlock() < 0)          if (user_list_rd_unlock() < 0)
1611          {          {
1612                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error");
1613                  ret = -1;                  ret = -1;
1614          }          }
1615    
# Line 1453  int get_user_article_cnt(int32_t uid) Line 1634  int get_user_article_cnt(int32_t uid)
1634          ret = user_stat_get(&(p_user_list_pool->user_stat_map), uid, &p_stat);          ret = user_stat_get(&(p_user_list_pool->user_stat_map), uid, &p_stat);
1635          if (ret < 0)          if (ret < 0)
1636          {          {
1637                  log_error("user_stat_get(uid=%d) error: %d\n", uid, ret);                  log_error("user_stat_get(uid=%d) error: %d", uid, ret);
1638                  return -1;                  return -1;
1639          }          }
1640          else if (ret == 0) // user not found          else if (ret == 0) // user not found


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

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