blob: e06ca96c9e4e8ec19b5eb4ae8e5286d1460bc929 [file] [log] [blame]
#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 ;
}