Squashed 'LYNQ_PUBLIC/' content from commit 79d8f932f
git-subtree-dir: LYNQ_PUBLIC
git-subtree-split: 79d8f932fb4ebc4b5aec6c5ace97634912394272
Change-Id: If2527ba937f56fe989487bf71e996f7cfd9fbe61
diff --git a/common_src/lib/liblynq-shm/lynq_shm.cpp b/common_src/lib/liblynq-shm/lynq_shm.cpp
new file mode 100755
index 0000000..e06ca96
--- /dev/null
+++ b/common_src/lib/liblynq-shm/lynq_shm.cpp
@@ -0,0 +1,194 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <binder/Parcel.h>
+//#include <sys/socket.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "lynq_shm.h"
+#include <sys/shm.h>
+#include "log/log.h"
+
+#undef LOG_TAG
+#define LOG_TAG "SHM"
+
+#define shm_key "shm_key"
+
+int shmid=-1;
+
+static int s_use_count=0;
+
+typedef struct{
+ int num_of_buffer;
+ int size_of_buffer;
+ int cur_index;
+}lynq_shm_type_config;
+
+typedef enum{
+ shm_buf_type_256,
+ shm_buf_type_1k,
+ shm_buf_type_max,
+}lynq_shm_buf_type;
+
+lynq_shm_type_config s_lynq_shm_config[shm_buf_type_max]={
+ {10,256,0},
+ {5,1024,0}
+};
+
+static void * s_ril_shm_buf=(void*) -1L;
+
+static pthread_mutex_t s_shm_mtx = PTHREAD_MUTEX_INITIALIZER;
+
+bool get_cur_shem_buffer_index(int size, int* level, int* index)
+{
+ pthread_mutex_lock(&s_shm_mtx);
+ for(int i=0;i<shm_buf_type_max;i++)
+ {
+ if(size<=s_lynq_shm_config[i].size_of_buffer)
+ {
+ (*level)=i;
+ (*index)=(s_lynq_shm_config[i].cur_index)%s_lynq_shm_config[i].num_of_buffer;
+ s_lynq_shm_config[i].cur_index++;
+ pthread_mutex_unlock(&s_shm_mtx);
+ return true;
+ }
+ }
+ pthread_mutex_unlock(&s_shm_mtx);
+ return false;
+}
+
+bool get_shem_buffer_level(int size, int* level)
+{
+ for(int i=0;i<shm_buf_type_max;i++)
+ {
+ if(size<=s_lynq_shm_config[i].size_of_buffer)
+ {
+ (*level)=i;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+char* get_shem_buffer(int level,int index)
+{
+ int offset=0;
+ for(int i=0;i<level;i++)
+ {
+ offset+=s_lynq_shm_config[i].num_of_buffer*s_lynq_shm_config[i].size_of_buffer;
+ }
+ offset+=s_lynq_shm_config[level].size_of_buffer*index;
+ return ((char*) s_ril_shm_buf)+offset;
+}
+
+int get_max_shem_buffer_size()
+{
+ return s_lynq_shm_config[shm_buf_type_max-1].size_of_buffer;
+}
+
+int get_total_shem_buffer_size()
+{
+ int total_size=0;
+ for(int i=0;i<shm_buf_type_max;i++)
+ {
+ total_size+=s_lynq_shm_config[i].num_of_buffer*s_lynq_shm_config[i].size_of_buffer;
+ }
+ return total_size;
+}
+
+static int create_shm_common(int size,int flags)
+{
+ RLOGD("create shared memory\n");
+
+// key_t key = ftok(shm_key, 's');
+ key_t key=0x123456;
+ if (key == -1)
+ {
+ RLOGE("ftok error.\n");
+ return -1;
+ }
+ RLOGD("key is 0x%x\n", key);
+
+ int shmid = shmget(key,size , flags);
+ if (shmid == -1)
+ {
+ RLOGE("shmget error.\n");
+ return -1;
+ }
+ RLOGD("shmid is %d\n", shmid);
+
+ return shmid;
+}
+
+int create_shm()
+{
+ shmid = create_shm_common(get_total_shem_buffer_size(),IPC_CREAT|0644);
+
+ if(shmid==-1)
+ {
+ return -1;
+ }
+ s_ril_shm_buf = shmat(shmid, NULL, 0);
+ if (s_ril_shm_buf == (void*) -1L)
+ {
+ RLOGE("shmat error.\n");
+ return -1;
+ }
+ return 0;
+}
+
+void remove_shm()
+{
+ if(shmid!=-1)
+ {
+ if (shmdt(s_ril_shm_buf) != 0)
+ {
+ RLOGE("shmdt error.\n");
+ }
+ shmid = -1;
+ }
+ s_ril_shm_buf = (void*) -1L;
+ return ;
+}
+
+int ril_init_mem()
+{
+ pthread_mutex_lock(&s_shm_mtx);
+ RLOGE("init begin, use count is %d.\n",s_use_count);
+ if(s_use_count==0)
+ {
+ if(create_shm()!=0)
+ {
+ RLOGE("init end, use count is %d.\n",s_use_count);
+ pthread_mutex_unlock(&s_shm_mtx);
+ return -1;
+ }
+ }
+ s_use_count++;
+ RLOGE("init end, use count is %d.\n",s_use_count);
+ pthread_mutex_unlock(&s_shm_mtx);
+ return 0;
+}
+
+void ril_deinit_mem()
+{
+ pthread_mutex_lock(&s_shm_mtx);
+
+ RLOGE("de-init begin, use count is %d.\n",s_use_count);
+ if(s_use_count==1)
+ {
+ remove_shm();
+ }
+
+ if(s_use_count>0)
+ {
+ s_use_count--;
+ }
+ RLOGE("de-init end, use count is %d.\n",s_use_count);
+ pthread_mutex_unlock(&s_shm_mtx);
+ return ;
+}
+