/[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.32 by sysadm, Tue Nov 11 00:28:05 2025 UTC Revision 1.34 by sysadm, Mon Nov 17 11:56:11 2025 UTC
# Line 26  Line 26 
26  #include <sys/sem.h>  #include <sys/sem.h>
27  #include <sys/shm.h>  #include <sys/shm.h>
28    
29  #ifdef _SEM_SEMUN_UNDEFINED  #if defined(_SEM_SEMUN_UNDEFINED) || defined(__MSYS__) || defined(__MINGW32__)
30  union semun  union semun
31  {  {
32          int val;                           /* Value for SETVAL */          int val;                           /* Value for SETVAL */
# Line 35  union semun Line 35  union semun
35          struct seminfo *__buf; /* Buffer for IPC_INFO          struct seminfo *__buf; /* Buffer for IPC_INFO
36                                                            (Linux-specific) */                                                            (Linux-specific) */
37  };  };
38  #endif // #ifdef _SEM_SEMUN_UNDEFINED  #endif // #if defined(_SEM_SEMUN_UNDEFINED)
39    
40  enum _user_list_constant_t  enum _user_list_constant_t
41  {  {
# Line 643  cleanup: Line 643  cleanup:
643  int user_list_try_rd_lock(int semid, int wait_sec)  int user_list_try_rd_lock(int semid, int wait_sec)
644  {  {
645          struct sembuf sops[2];          struct sembuf sops[2];
646    #if !defined(__MSYS__) && !defined(__MINGW32__)
647          struct timespec timeout;          struct timespec timeout;
648    #endif
649          int ret;          int ret;
650    
651          sops[0].sem_num = 1; // w_sem          sops[0].sem_num = 1; // w_sem
# Line 654  int user_list_try_rd_lock(int semid, int Line 656  int user_list_try_rd_lock(int semid, int
656          sops[1].sem_op = 1;                     // lock          sops[1].sem_op = 1;                     // lock
657          sops[1].sem_flg = SEM_UNDO; // undo on terminate          sops[1].sem_flg = SEM_UNDO; // undo on terminate
658    
659    #if defined(__MSYS__) || defined(__MINGW32__)
660            ret = semop(semid, sops, 2);
661    #else
662          timeout.tv_sec = wait_sec;          timeout.tv_sec = wait_sec;
663          timeout.tv_nsec = 0;          timeout.tv_nsec = 0;
664    
665          ret = semtimedop(semid, sops, 2, &timeout);          ret = semtimedop(semid, sops, 2, &timeout);
666    #endif
667          if (ret == -1 && errno != EAGAIN && errno != EINTR)          if (ret == -1 && errno != EAGAIN && errno != EINTR)
668          {          {
669                  log_error("semtimedop(lock read) error %d\n", errno);                  log_error("semop(lock read) error %d\n", errno);
670          }          }
671    
672          return ret;          return ret;
# Line 669  int user_list_try_rd_lock(int semid, int Line 675  int user_list_try_rd_lock(int semid, int
675  int user_list_try_rw_lock(int semid, int wait_sec)  int user_list_try_rw_lock(int semid, int wait_sec)
676  {  {
677          struct sembuf sops[3];          struct sembuf sops[3];
678    #if !defined(__MSYS__) && !defined(__MINGW32__)
679          struct timespec timeout;          struct timespec timeout;
680    #endif
681          int ret;          int ret;
682    
683          sops[0].sem_num = 1; // w_sem          sops[0].sem_num = 1; // w_sem
# Line 684  int user_list_try_rw_lock(int semid, int Line 692  int user_list_try_rw_lock(int semid, int
692          sops[2].sem_op = 0;      // wait until unlocked          sops[2].sem_op = 0;      // wait until unlocked
693          sops[2].sem_flg = 0;          sops[2].sem_flg = 0;
694    
695    #if defined(__MSYS__) || defined(__MINGW32__)
696            ret = semop(semid, sops, 3);
697    #else
698          timeout.tv_sec = wait_sec;          timeout.tv_sec = wait_sec;
699          timeout.tv_nsec = 0;          timeout.tv_nsec = 0;
700    
701          ret = semtimedop(semid, sops, 3, &timeout);          ret = semtimedop(semid, sops, 3, &timeout);
702    #endif
703          if (ret == -1 && errno != EAGAIN && errno != EINTR)          if (ret == -1 && errno != EAGAIN && errno != EINTR)
704          {          {
705                  log_error("semtimedop(lock write) error %d\n", errno);                  log_error("semop(lock write) error %d\n", errno);
706          }          }
707    
708          return ret;          return ret;
# Line 819  int query_user_list(int page_id, USER_IN Line 831  int query_user_list(int page_id, USER_IN
831                  goto cleanup;                  goto cleanup;
832          }          }
833    
834          *p_page_count = p_user_list_pool->p_current->user_count / BBS_user_limit_per_page +          *p_page_count = (p_user_list_pool->p_current->user_count + BBS_user_limit_per_page - 1) /
835                                          (p_user_list_pool->p_current->user_count % BBS_user_limit_per_page == 0 ? 0 : 1);                                          BBS_user_limit_per_page;
836    
837          if (page_id < 0 || page_id >= *p_page_count)          if (page_id < 0 || page_id >= *p_page_count)
838          {          {
# Line 875  int query_user_online_list(int page_id, Line 887  int query_user_online_list(int page_id,
887                  goto cleanup;                  goto cleanup;
888          }          }
889    
890          *p_page_count = p_user_list_pool->p_online_current->user_count / BBS_user_limit_per_page +          *p_page_count = (p_user_list_pool->p_online_current->user_count + BBS_user_limit_per_page - 1) / BBS_user_limit_per_page;
                                         (p_user_list_pool->p_online_current->user_count % BBS_user_limit_per_page == 0 ? 0 : 1);  
891    
892          if (page_id < 0 || page_id >= *p_page_count)          if (page_id < 0 || page_id >= *p_page_count)
893          {          {


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

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