| 1 |
/*************************************************************************** |
/* SPDX-License-Identifier: GPL-3.0-or-later */ |
| 2 |
file_loader.c - description |
/* |
| 3 |
------------------- |
* file_loader |
| 4 |
Copyright : (C) 2004-2025 by Leaflet |
* - shared memory based file loader |
| 5 |
Email : leaflet@leafok.com |
* |
| 6 |
***************************************************************************/ |
* Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com> |
| 7 |
|
*/ |
|
/*************************************************************************** |
|
|
* * |
|
|
* This program is free software; you can redistribute it and/or modify * |
|
|
* it under the terms of the GNU General Public License as published by * |
|
|
* the Free Software Foundation; either version 3 of the License, or * |
|
|
* (at your option) any later version. * |
|
|
* * |
|
|
***************************************************************************/ |
|
| 8 |
|
|
| 9 |
#include "file_loader.h" |
#include "file_loader.h" |
|
#include "trie_dict.h" |
|
|
#include "str_process.h" |
|
| 10 |
#include "log.h" |
#include "log.h" |
| 11 |
#include <fcntl.h> |
#include "str_process.h" |
| 12 |
|
#include "trie_dict.h" |
| 13 |
#include <errno.h> |
#include <errno.h> |
| 14 |
#include <unistd.h> |
#include <fcntl.h> |
| 15 |
#include <stdlib.h> |
#include <stdlib.h> |
| 16 |
#include <string.h> |
#include <string.h> |
| 17 |
#include <time.h> |
#include <time.h> |
| 18 |
|
#include <unistd.h> |
| 19 |
|
#include <sys/ipc.h> |
| 20 |
#include <sys/mman.h> |
#include <sys/mman.h> |
|
#include <sys/stat.h> |
|
| 21 |
#include <sys/shm.h> |
#include <sys/shm.h> |
| 22 |
#include <sys/ipc.h> |
#include <sys/stat.h> |
| 23 |
|
|
| 24 |
struct shm_header_t |
struct shm_header_t |
| 25 |
{ |
{ |
| 52 |
{ |
{ |
| 53 |
int shmid = (int)value; |
int shmid = (int)value; |
| 54 |
|
|
| 55 |
if (shmctl(shmid, IPC_RMID, NULL) == -1) |
if (shmid != 0 && shmctl(shmid, IPC_RMID, NULL) == -1) |
| 56 |
{ |
{ |
| 57 |
log_error("shmctl(shmid=%d, IPC_RMID) error (%d)\n", shmid, errno); |
log_error("shmctl(shmid=%d, IPC_RMID) error (%d)\n", shmid, errno); |
| 58 |
} |
} |
| 113 |
return -1; |
return -1; |
| 114 |
} |
} |
| 115 |
|
|
| 116 |
line_total = split_data_lines(p_data, SCREEN_COLS, line_offsets, MAX_SPLIT_FILE_LINES, 1); |
line_total = split_data_lines(p_data, SCREEN_COLS, line_offsets, MAX_SPLIT_FILE_LINES, 1, NULL); |
| 117 |
|
|
| 118 |
// Allocate shared memory |
// Allocate shared memory |
| 119 |
proj_id = (int)(time(NULL) % getpid()); |
proj_id = (int)(time(NULL) % getpid()); |
| 141 |
((struct shm_header_t *)p_shm)->shmid = shmid; |
((struct shm_header_t *)p_shm)->shmid = shmid; |
| 142 |
((struct shm_header_t *)p_shm)->data_len = data_len; |
((struct shm_header_t *)p_shm)->data_len = data_len; |
| 143 |
((struct shm_header_t *)p_shm)->line_total = line_total; |
((struct shm_header_t *)p_shm)->line_total = line_total; |
| 144 |
memcpy(p_shm + sizeof(struct shm_header_t), p_data, data_len); |
memcpy((char *)p_shm + sizeof(struct shm_header_t), p_data, data_len); |
| 145 |
|
|
| 146 |
if (munmap(p_data, data_len) < 0) |
if (munmap(p_data, data_len) < 0) |
| 147 |
{ |
{ |
| 149 |
return -2; |
return -2; |
| 150 |
} |
} |
| 151 |
|
|
| 152 |
p_data = p_shm + sizeof(struct shm_header_t); |
p_data = (char *)p_shm + sizeof(struct shm_header_t); |
| 153 |
p_line_offsets = p_data + data_len + 1; |
p_line_offsets = (long *)((char *)p_data + data_len + 1); |
| 154 |
memcpy(p_line_offsets, line_offsets, sizeof(long) * (size_t)(line_total + 1)); |
memcpy(p_line_offsets, line_offsets, sizeof(long) * (size_t)(line_total + 1)); |
| 155 |
|
|
| 156 |
if (shmdt(p_shm) == -1) |
if (shmdt(p_shm) == -1) |
| 172 |
{ |
{ |
| 173 |
log_error("trie_dict_set(%s) error\n", filename); |
log_error("trie_dict_set(%s) error\n", filename); |
| 174 |
|
|
| 175 |
if (shmctl(shmid, IPC_RMID, NULL) == -1) |
if (shmid != 0 && shmctl(shmid, IPC_RMID, NULL) == -1) |
| 176 |
{ |
{ |
| 177 |
log_error("shmctl(shmid=%d, IPC_RMID) error (%d)\n", shmid, errno); |
log_error("shmctl(shmid=%d, IPC_RMID) error (%d)\n", shmid, errno); |
| 178 |
} |
} |
| 233 |
|
|
| 234 |
*p_data_len = ((struct shm_header_t *)p_shm)->data_len; |
*p_data_len = ((struct shm_header_t *)p_shm)->data_len; |
| 235 |
*p_line_total = ((struct shm_header_t *)p_shm)->line_total; |
*p_line_total = ((struct shm_header_t *)p_shm)->line_total; |
| 236 |
*pp_data = p_shm + sizeof(struct shm_header_t); |
*pp_data = (char *)p_shm + sizeof(struct shm_header_t); |
| 237 |
*pp_line_offsets = *pp_data + *p_data_len + 1; |
*pp_line_offsets = (const long *)((const char *)(*pp_data) + *p_data_len + 1); |
| 238 |
|
|
| 239 |
return p_shm; |
return p_shm; |
| 240 |
} |
} |