#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include "myshm.h"
#include "mysem.h"
#define SHM_KEY 3345
#define SHM_PTR 1024
#define MYSHM_NORSTATUS 0
#define MYSHM_TOBEBLOCKED 10
//#define MYSHM_DEBUG 1
#define this() do{printf("%d\n",__LINE__);}while(0);
typedef struct ipNode ipNode;
struct ipNode{
char ipaddress[32];
time_t time1; /*the latest begin time for amount1*/
int amount1; /*in five mimutes*/
time_t time2; /*the latest begin time for amount2*/
int amount2; /*in 2 hours*/
time_t time3; /*the latest begin time for amount3*/
int amount3; /*in 4 hours*/
time_t time4; /*the latest begin time for amount2*/
int amount4; /*in 2 hours*/
time_t time5; /*the latest begin time for amount3*/
int amount5; /*in 4 hours*/
short int prior,next; /*to be created as a stack*/
};
typedef struct MyShm MyShm;
struct MyShm{
short int i_used;
short int head_used,tail_used; /*the head and tail of use queue*/
short int head_empty; /*the head of empty queue*/
ipNode node[SHM_PTR];
};
/*
*the numbers of children which will determine
*the limit of the value store in the share memory
*/
static int shm_chld;
unsigned short int myshmq[64];
unsigned short int myshmeq[64];
MyShm *myshm;
/**
* the Id of semaphore
*/
static int myshm_id = -1;
static key_t i_shm_key;
void set_shm_key(key_t i_key)
{
myshm_id = -1;
i_shm_key = i_key;
}
void init_myshm(short int i_flag)
{
short int i;
int ShmSize = sizeof(MyShm);
myshm_id = shmget(i_shm_key,ShmSize,0666|IPC_CREAT);
if(myshm_id==-1){
perror("crt shm err!\n");
exit(-1);
}
if((myshm = (MyShm *) shmat(myshm_id,0,0))==(MyShm *) -1){
perror("shm err:");
exit(-1);
}
if(i_flag == 1){
mywait(1);
myshm->i_used = 0;
myshm->head_used = -1;
myshm->tail_used = -1;
myshm->head_empty = 0; /*initiate the queue to be empty*/
for(i = 0;i < SHM_PTR;i++){
myshm->node[i].ipaddress[0] = '\0';
myshm->node[i].time1 = 0;
myshm->node[i].amount1 = 0;
myshm->node[i].time2 = 0;
myshm->node[i].amount2 = 0;
myshm->node[i].time3 = 0;
myshm->node[i].amount3 = 0;
myshm->node[i].time4 = 0;
myshm->node[i].amount4 = 0;
myshm->node[i].time5 = 0;
myshm->node[i].amount5 = 0;
myshm->node[i].prior = i - 1;
if(i == SHM_PTR - 1)
myshm->node[i].next = -1;
else
myshm->node[i].next = i + 1;
}
mysignal(1);
}
}
void drop_myshm()
{
shmdt(myshm);
}
/**
* check if the queue exists dead circle;
* @param q_type 1.uesed queue 0.empty queue
* @param i just to see if myshm->node[i] is in queue before
*
* @return if
*/
short int chkdead_myshm(short int q_type,short int i)
{
short int m,n,j;
m = i/16;
n = i%16;
j = 1;
j = j << n;
/*#if defined(MYSHM_DEBUG)
switch(q_type){
case 0:
printf("myshmeq[%d] = %d\n",m,myshmeq[m]);
break;
case 1:
printf("myshmq[%d] = %d\n",m,myshmq[m]);
break;
}
#endif*/
switch(q_type){
case 0:
if(j & myshmeq[m]){
return 1;
}else{
myshmeq[m] = myshmeq[m] | j;
return 0;
}
break;
case 1:
if(j & myshmq[m]){
return 1;
}else{
myshmq[m] = myshmq[m] | j;
return 0;
}
break;
default :
return 1; /*宁信其有不信其无*/
break;
}
return 1;
}
/**
* init_myshmq initial the value of myshmq
*/
void init_myshmq()
{
short int i;
for(i = 0;i < 64;i++){
myshmq[i] = 0;
}
}
/**
* init_myshmq initial the value of myshmeq
*/
void init_myshmeq()
{
short int i;
for(i = 0;i < 64;i++){
myshmeq[i] = 0;
}
}
/**
* 按照最简单的顺序查找方法,以后再改进算法
*/
short int query_myshm(char *s_ipaddr)
{
short int i;
if(myshm_id < 0){
init_myshm(0);
}
if(myshm->head_used < 0){
return -1;
}
init_myshmq();
i = myshm->head_used;
while(i >= 0){
if(strcmp(myshm->node[i].ipaddress,s_ipaddr) == 0){
return i;
}else{
if(chkdead_myshm(1,i)){
init_myshm(1);
return -1;
}
i = myshm->node[i].next;
}
}
if(i < 0)
return -1;
}
void reset_emptyq()
{
short int m,n,i,j;
init_myshmq();
i = myshm->head_used;
while(i >= 0){
m = i/16;
n = i%16;
j = 1;
j = j << n;
myshmq[m] = myshmq[m] | j;
i = myshm->node[i].next;
}
myshm->head_empty = -1;
for(i = 0;i < 1024;i++){
m = i/16;
n = i%16;
j = 1;
j = j << n;
if(!(myshmq[m] & j)){
myshm->node[i].next = myshm->head_empty;
myshm->head_empty = i;
}
}
}
void init_ipNode(ipNode *ipnode,char *ipaddr)
{
sprintf(ipnode->ipaddress,"%s",ipaddr);
ipnode->time1 = time(NULL);
ipnode->time2 = ipnode->time1;
ipnode->time3 = ipnode->time1;
ipnode->time4 = ipnode->time1;
ipnode->time5 = ipnode->time1;
ipnode->amount1 = 1;
ipnode->amount2 = 0;
ipnode->amount3 = 0;
ipnode->amount4 = 0;
ipnode->amount5 = 0;
}
void init_ipNodePtr(short int i, char *ipaddr)
{
init_ipNode(&(myshm->node[i]),ipaddr);
myshm->node[i].prior = -1;
myshm->node[i].next = myshm->head_used;
if(myshm->head_used >= 0){
myshm->node[myshm->head_used].prior = i;
}else{
myshm->tail_used = i; /*第一个入队列*/
}
myshm->head_used = i;
}
short int add_myshm(char *s_ipaddr)
{
short int i;
if(myshm_id < 0){
init_myshm(0);
}
i = query_myshm(s_ipaddr);
if(i >= 0){
opr_myshm(i);
return i;
}
if(myshm->head_empty >= 0){
i = myshm->head_empty;
myshm->head_empty = myshm->node[i].next;
}else{ /*最近最久未用*/
i = myshm->tail_used;
myshm->tail_used = myshm->node[i].prior;
myshm->node[myshm->tail_used].next = -1;
}
init_ipNodePtr(i, s_ipaddr);
return i;
}
void opr_myshm(short int i)
{
if(myshm_id < 0){
init_myshm(0);
}
myshm->node[i].amount1++;
if(i != myshm->head_used && myshm->head_used >=0){ /*Least Recently Used*/
if(i != myshm->tail_used)
myshm->node[myshm->node[i].next].prior = myshm->node[i].prior;
myshm->node[myshm->node[i].prior].next = myshm->node[i].next;
myshm->node[i].prior = -1;
myshm->node[myshm->head_used].prior = i;
myshm->node[i].next = myshm->head_used;
myshm->head_used = i;
}
}
sh
- 1
- 2
- 3
- 4
前往页