union SIGNAL* alloc(unsigned int size, unsigned int sigNo) -----------就没有free过,只是一个sigNo,从req变成rsp。内容填写的不同。message 类型填写的不同而已.
{
_signal* sigMgt;
union SIGNAL* sig;
sigMgt = (_signal*)malloc(sizeof(_signal) + size);
sigMgt->sender_id = currentPid;
sigMgt->dest_id = currentPid;
sigMgt->size = size;
//这样搞的目的是sig给user用。sigMgt是os用的。隐藏了一些info
//根据sigMgt struct 是3个整数,+1,这样偏移3个整数的位置。然后强制转化成1个整数的指针。在加1就是1个指针的位移了
sig = (union SIGNAL*)(sigMgt + 1);
sig->sigNo = sigNo;
memAlloc++;
return sig;
}
void free_buf(union SIGNAL** psig)
{
if (*psig == NULL)
{
redundant_free(psig);
return;
}
if (memAlloc == 0)
{
printf("\n*********MEMORY ALLOC/FREE Error ***********\n");
CPPUNIT_ASSERT(0);
return;
}
memAlloc--;
//和alloc 匹配,所以要-1
//虽然psig是1个整数大小。但是强制转成了3个整数大小的struct。然后-1,这样就回退3个整数大小的space
_signal* sigMgt = ((_signal*) *psig) - 1;
free(sigMgt);
*psig = NULL;
}
void send(union SIGNAL** psig, PROCESS p)
{
union SIGNAL* sig = *psig;
#ifdef SIG_CLONE
sig = sig_clone_and_free(sig);
#endif
pthread_mutex_lock(&sigqueue_mutex);
_signal* sigMgt = ((_signal*) sig) - 1;
sigMgt->dest_id = p;
sigMgt->sender_id = currentPid;
sig_queues[p].push_back(sigMgt);
*psig = NULL;
pthread_mutex_unlock(&sigqueue_mutex);
}
{
_signal* sigMgt;
union SIGNAL* sig;
sigMgt = (_signal*)malloc(sizeof(_signal) + size);
sigMgt->sender_id = currentPid;
sigMgt->dest_id = currentPid;
sigMgt->size = size;
//这样搞的目的是sig给user用。sigMgt是os用的。隐藏了一些info
//根据sigMgt struct 是3个整数,+1,这样偏移3个整数的位置。然后强制转化成1个整数的指针。在加1就是1个指针的位移了
sig = (union SIGNAL*)(sigMgt + 1);
sig->sigNo = sigNo;
memAlloc++;
return sig;
}
void free_buf(union SIGNAL** psig)
{
if (*psig == NULL)
{
redundant_free(psig);
return;
}
if (memAlloc == 0)
{
printf("\n*********MEMORY ALLOC/FREE Error ***********\n");
CPPUNIT_ASSERT(0);
return;
}
memAlloc--;
//和alloc 匹配,所以要-1
//虽然psig是1个整数大小。但是强制转成了3个整数大小的struct。然后-1,这样就回退3个整数大小的space
_signal* sigMgt = ((_signal*) *psig) - 1;
free(sigMgt);
*psig = NULL;
}
void send(union SIGNAL** psig, PROCESS p)
{
union SIGNAL* sig = *psig;
#ifdef SIG_CLONE
sig = sig_clone_and_free(sig);
#endif
pthread_mutex_lock(&sigqueue_mutex);
_signal* sigMgt = ((_signal*) sig) - 1;
sigMgt->dest_id = p;
sigMgt->sender_id = currentPid;
sig_queues[p].push_back(sigMgt);
*psig = NULL;
pthread_mutex_unlock(&sigqueue_mutex);
}