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

Diff of /lbbs/src/section_list.c

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

Revision 1.23 by sysadm, Mon May 26 03:20:39 2025 UTC Revision 1.27 by sysadm, Tue May 27 01:53:42 2025 UTC
# Line 108  int article_block_init(const char *filen Line 108  int article_block_init(const char *filen
108                  return -1;                  return -1;
109          }          }
110    
111          if (block_count > ARTICLE_BLOCK_PER_POOL)          if (block_count <= 0 || block_count > ARTICLE_BLOCK_PER_POOL)
112          {          {
113                  log_error("article_block_count exceed limit %d\n", ARTICLE_BLOCK_PER_POOL);                  log_error("article_block_count exceed limit %d\n", ARTICLE_BLOCK_PER_POOL);
114                  return -2;                  return -2;
# Line 236  void article_block_cleanup(void) Line 236  void article_block_cleanup(void)
236          p_article_block_pool = NULL;          p_article_block_pool = NULL;
237  }  }
238    
239    int set_article_block_shm_readonly(void)
240    {
241            int shmid;
242            void *p_shm;
243            int i;
244    
245            if (p_article_block_pool == NULL)
246            {
247                    log_error("article_block_pool not initialized\n");
248                    return -1;
249            }
250    
251            for (i = 0; i < p_article_block_pool->shm_count; i++)
252            {
253                    shmid = (p_article_block_pool->shm_pool + i)->shmid;
254    
255                    // Remap shared memory in read-only mode
256                    p_shm = shmat(shmid, (p_article_block_pool->shm_pool + i)->p_shm, SHM_RDONLY | SHM_REMAP);
257                    if (p_shm == (void *)-1)
258                    {
259                            log_error("shmat(article_block_pool shmid = %d) error (%d)\n", shmid, errno);
260                            return -2;
261                    }
262            }
263    
264            return 0;
265    }
266    
267    int detach_article_block_shm(void)
268    {
269            int shmid;
270    
271            if (p_article_block_pool == NULL)
272            {
273                    return -1;
274            }
275    
276            for (int i = 0; i < p_article_block_pool->shm_count; i++)
277            {
278                    if ((p_article_block_pool->shm_pool + i)->p_shm != NULL && shmdt((p_article_block_pool->shm_pool + i)->p_shm) == -1)
279                    {
280                            log_error("shmdt(shmid = %d) error (%d)\n", (p_article_block_pool->shm_pool + i)->shmid, errno);
281                            return -2;
282                    }
283            }
284    
285            shmid = p_article_block_pool->shmid;
286    
287            if (shmdt(p_article_block_pool) == -1)
288            {
289                    log_error("shmdt(shmid = %d) error (%d)\n", shmid, errno);
290                    return -3;
291            }
292    
293            p_article_block_pool = NULL;
294    
295            return 0;
296    }
297    
298  inline static ARTICLE_BLOCK *pop_free_article_block(void)  inline static ARTICLE_BLOCK *pop_free_article_block(void)
299  {  {
300          ARTICLE_BLOCK *p_block = NULL;          ARTICLE_BLOCK *p_block = NULL;
# Line 452  extern int section_list_init(const char Line 511  extern int section_list_init(const char
511          return 0;          return 0;
512  }  }
513    
514    void section_list_cleanup(void)
515    {
516            int shmid;
517    
518            if (p_section_list_pool == NULL)
519            {
520                    return;
521            }
522    
523            if (p_section_list_pool->p_trie_dict_section_by_name != NULL)
524            {
525                    trie_dict_destroy(p_section_list_pool->p_trie_dict_section_by_name);
526                    p_section_list_pool->p_trie_dict_section_by_name = NULL;
527            }
528    
529            if (p_section_list_pool->p_trie_dict_section_by_sid != NULL)
530            {
531                    trie_dict_destroy(p_section_list_pool->p_trie_dict_section_by_sid);
532                    p_section_list_pool->p_trie_dict_section_by_sid = NULL;
533            }
534    
535            shmid = p_section_list_pool->shmid;
536    
537            if (semctl(p_section_list_pool->semid, 0, IPC_RMID) == -1)
538            {
539                    log_error("semctl(semid = %d, IPC_RMID) error (%d)\n", p_section_list_pool->semid, errno);
540            }
541    
542            if (shmdt(p_section_list_pool) == -1)
543            {
544                    log_error("shmdt(shmid = %d) error (%d)\n", shmid, errno);
545            }
546    
547            if (shmctl(shmid, IPC_RMID, NULL) == -1)
548            {
549                    log_error("shmctl(shmid = %d, IPC_RMID) error (%d)\n", shmid, errno);
550            }
551    
552            p_section_list_pool = NULL;
553    }
554    
555    int set_section_list_shm_readonly(void)
556    {
557            int shmid;
558            void *p_shm;
559    
560            if (p_section_list_pool == NULL)
561            {
562                    log_error("p_section_list_pool not initialized\n");
563                    return -1;
564            }
565    
566            shmid = p_section_list_pool->shmid;
567    
568            // Remap shared memory in read-only mode
569            p_shm = shmat(shmid, p_section_list_pool, SHM_RDONLY | SHM_REMAP);
570            if (p_shm == (void *)-1)
571            {
572                    log_error("shmat(section_list_pool shmid = %d) error (%d)\n", shmid, errno);
573                    return -3;
574            }
575    
576            p_section_list_pool = p_shm;
577    
578            return 0;
579    }
580    
581    int detach_section_list_shm(void)
582    {
583            if (p_section_list_pool != NULL && shmdt(p_section_list_pool) == -1)
584            {
585                    log_error("shmdt(section_list_pool) error (%d)\n", errno);
586                    return -1;
587            }
588    
589            p_section_list_pool = NULL;
590    
591            return 0;
592    }
593    
594  inline static void sid_to_str(int32_t sid, char *p_sid_str)  inline static void sid_to_str(int32_t sid, char *p_sid_str)
595  {  {
596          uint32_t u_sid;          uint32_t u_sid;
# Line 530  void section_list_reset_articles(SECTION Line 669  void section_list_reset_articles(SECTION
669          p_section->last_page_visible_article_count = 0;          p_section->last_page_visible_article_count = 0;
670  }  }
671    
 void section_list_cleanup(void)  
 {  
         int shmid;  
   
         if (p_section_list_pool == NULL)  
         {  
                 return;  
         }  
   
         if (p_section_list_pool->p_trie_dict_section_by_name != NULL)  
         {  
                 trie_dict_destroy(p_section_list_pool->p_trie_dict_section_by_name);  
                 p_section_list_pool->p_trie_dict_section_by_name = NULL;  
         }  
   
         if (p_section_list_pool->p_trie_dict_section_by_sid != NULL)  
         {  
                 trie_dict_destroy(p_section_list_pool->p_trie_dict_section_by_sid);  
                 p_section_list_pool->p_trie_dict_section_by_sid = NULL;  
         }  
   
         if (p_section_list_pool != NULL)  
         {  
                 if (semctl(p_section_list_pool->semid, 0, IPC_RMID) == -1)  
                 {  
                         log_error("semctl(semid = %d, IPC_RMID) error (%d)\n", p_section_list_pool->semid, errno);  
                 }  
   
                 shmid = p_section_list_pool->shmid;  
   
                 if (shmdt(p_section_list_pool) == -1)  
                 {  
                         log_error("shmdt(shmid = %d) error (%d)\n", shmid, errno);  
                 }  
   
                 if (shmctl(shmid, IPC_RMID, NULL) == -1)  
                 {  
                         log_error("shmctl(shmid = %d, IPC_RMID) error (%d)\n", shmid, errno);  
                 }  
   
                 p_section_list_pool = NULL;  
         }  
 }  
   
672  SECTION_LIST *section_list_find_by_name(const char *sname)  SECTION_LIST *section_list_find_by_name(const char *sname)
673  {  {
674          int64_t index;          int64_t index;
675            int ret;
676    
677          if (p_section_list_pool == NULL)          if (p_section_list_pool == NULL)
678          {          {
# Line 584  SECTION_LIST *section_list_find_by_name( Line 680  SECTION_LIST *section_list_find_by_name(
680                  return NULL;                  return NULL;
681          }          }
682    
683          if (trie_dict_get(p_section_list_pool->p_trie_dict_section_by_name, sname, &index) != 1)          ret = trie_dict_get(p_section_list_pool->p_trie_dict_section_by_name, sname, &index);
684            if (ret < 0)
685          {          {
686                  log_error("trie_dict_get(section, %s) error\n", sname);                  log_error("trie_dict_get(section, %s) error\n", sname);
687                  return NULL;                  return NULL;
688          }          }
689            else if (ret == 0)
690            {
691                    return NULL;
692            }
693    
694          return (p_section_list_pool->sections + index);          return (p_section_list_pool->sections + index);
695  }  }
# Line 596  SECTION_LIST *section_list_find_by_name( Line 697  SECTION_LIST *section_list_find_by_name(
697  SECTION_LIST *section_list_find_by_sid(int32_t sid)  SECTION_LIST *section_list_find_by_sid(int32_t sid)
698  {  {
699          int64_t index;          int64_t index;
700            int ret;
701          char sid_str[SID_STR_LEN];          char sid_str[SID_STR_LEN];
702    
703          if (p_section_list_pool == NULL)          if (p_section_list_pool == NULL)
# Line 606  SECTION_LIST *section_list_find_by_sid(i Line 708  SECTION_LIST *section_list_find_by_sid(i
708    
709          sid_to_str(sid, sid_str);          sid_to_str(sid, sid_str);
710    
711          if (trie_dict_get(p_section_list_pool->p_trie_dict_section_by_sid, sid_str, &index) != 1)          ret = trie_dict_get(p_section_list_pool->p_trie_dict_section_by_sid, sid_str, &index);
712            if (ret < 0)
713          {          {
714                  log_error("trie_dict_get(section, %d) error\n", sid);                  log_error("trie_dict_get(section, %d) error\n", sid);
715                  return NULL;                  return NULL;
716          }          }
717            else if (ret == 0)
718            {
719                    return NULL;
720            }
721    
722          return (p_section_list_pool->sections + index);          return (p_section_list_pool->sections + index);
723  }  }
# Line 1023  int section_list_calculate_page(SECTION_ Line 1130  int section_list_calculate_page(SECTION_
1130          return 0;          return 0;
1131  }  }
1132    
1133    int32_t article_block_last_aid(void)
1134    {
1135            ARTICLE_BLOCK *p_block = p_article_block_pool->p_block[p_article_block_pool->block_count - 1];
1136            int32_t last_aid = p_block->articles[p_block->article_count - 1].aid;
1137    
1138            return last_aid;
1139    }
1140    
1141    int article_block_article_count(void)
1142    {
1143            int ret;
1144    
1145            if (p_article_block_pool == NULL || p_article_block_pool->block_count <= 0)
1146            {
1147                    return -1;
1148            }
1149    
1150            ret = (p_article_block_pool->block_count - 1) * ARTICLE_PER_BLOCK +
1151                      p_article_block_pool->p_block[p_article_block_pool->block_count - 1]->article_count;
1152    
1153            return ret;
1154    }
1155    
1156  int article_count_of_topic(int32_t aid)  int article_count_of_topic(int32_t aid)
1157  {  {
1158          ARTICLE *p_article;          ARTICLE *p_article;


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

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