Fix runtime bug. Tested on Linux
parent
cdfb210052
commit
8f5f2ea1f7
|
@ -8,6 +8,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <error.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -81,12 +84,12 @@ ProcessSemaphore::ProcessSemaphore(int key, int action, int default_value) : _p(
|
||||||
|
|
||||||
if(action==1)
|
if(action==1)
|
||||||
{
|
{
|
||||||
_p->fd=open(_p->buff,O_RDWR|O_CREAT|O_TRUNC|O_EXCL);
|
_p->fd=open(_p->buff,O_RDWR|O_CREAT|O_EXCL,0666);
|
||||||
_p->owner=true;
|
_p->owner=true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_p->fd=open(_p->buff,O_RDWR);
|
_p->fd=open(_p->buff,O_RDWR,0666);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_p->fd>=0) /// Opened.
|
if(_p->fd>=0) /// Opened.
|
||||||
|
@ -103,6 +106,10 @@ ProcessSemaphore::ProcessSemaphore(int key, int action, int default_value) : _p(
|
||||||
flock(_p->fd,LOCK_UN);
|
flock(_p->fd,LOCK_UN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
perror("Failed to open file. ");
|
||||||
|
}
|
||||||
|
|
||||||
if(_p->status!=0&&_p->status!=2) /// Clean up
|
if(_p->status!=0&&_p->status!=2) /// Clean up
|
||||||
{
|
{
|
||||||
|
@ -152,7 +159,7 @@ int ProcessSemaphore::p()
|
||||||
typedef void (*fnvi)(int);
|
typedef void (*fnvi)(int);
|
||||||
_global_process_semaphore_value=0;
|
_global_process_semaphore_value=0;
|
||||||
fnvi old=signal(SIGUSR1,_global_process_semaphore_handler);
|
fnvi old=signal(SIGUSR1,_global_process_semaphore_handler);
|
||||||
//*/
|
*/
|
||||||
|
|
||||||
flock(_p->fd,LOCK_UN);
|
flock(_p->fd,LOCK_UN);
|
||||||
|
|
||||||
|
@ -162,6 +169,7 @@ int ProcessSemaphore::p()
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
flock(_p->fd,LOCK_EX);
|
flock(_p->fd,LOCK_EX);
|
||||||
|
x=impl::LockInfo::getFrom(_p->fd);
|
||||||
if(x.current_value>0) /// Someone has released resource!
|
if(x.current_value>0) /// Someone has released resource!
|
||||||
{
|
{
|
||||||
x.current_value=x.current_value-1;
|
x.current_value=x.current_value-1;
|
||||||
|
|
Loading…
Reference in New Issue