Unrue
08-07-2008, 23:40
Ciao ragazzi,
ho implementato un lock su file tra vari processi con le struct flock. Perņ ho un problema: alcuni processi riescono a terminare, altri no, si bloccano in attesa. Come se qualcuno non rilasciasse il lock sul file.
Questo č il codice in cui definisco la struttura:
struct flock fl;
fl.l_type= F_WRLCK; // tipo di lock
fl.l_whence = SEEK_SET; // offset
fl.l_start = 0; // Offset per l_whence
fl.l_len = 0; // lunghezza
fl.l_pid = getpid(); // PID del processo
fd = open("/out",
O_WRONLY | O_CREAT,0777);
Questa č la routine per il locking, scrittura su file ed unlocking:
int write_plane(struct flock*fl,float*plane,int fd, int*local_planes, size_t*dim_mat, int me, int num_plane) {
int fun;
int jump, ris;
int dim_plane = dim_mat[0]*dim_mat[1];
fun = fcntl(fd, F_SETLKW, fl); // attendo per avere il lock
jump = 0;
if( me == 0) jump = dim_plane*num_plane*sizeof(float);
else {
for(int i=0; i < me; i++) jump += (dim_plane*local_planes[i])*sizeof(float);
jump += dim_plane*num_plane*sizeof(float);
}
lseek(fd,jump,fl->l_whence);
ris = write(fd,plane,dim_plane*sizeof(float));
fl->l_type = F_UNLCK; /* cambio il lock */
fcntl(fd, F_SETLK, fl); /* sblocco la regione */
return ris;
}
Thanks :)
ho implementato un lock su file tra vari processi con le struct flock. Perņ ho un problema: alcuni processi riescono a terminare, altri no, si bloccano in attesa. Come se qualcuno non rilasciasse il lock sul file.
Questo č il codice in cui definisco la struttura:
struct flock fl;
fl.l_type= F_WRLCK; // tipo di lock
fl.l_whence = SEEK_SET; // offset
fl.l_start = 0; // Offset per l_whence
fl.l_len = 0; // lunghezza
fl.l_pid = getpid(); // PID del processo
fd = open("/out",
O_WRONLY | O_CREAT,0777);
Questa č la routine per il locking, scrittura su file ed unlocking:
int write_plane(struct flock*fl,float*plane,int fd, int*local_planes, size_t*dim_mat, int me, int num_plane) {
int fun;
int jump, ris;
int dim_plane = dim_mat[0]*dim_mat[1];
fun = fcntl(fd, F_SETLKW, fl); // attendo per avere il lock
jump = 0;
if( me == 0) jump = dim_plane*num_plane*sizeof(float);
else {
for(int i=0; i < me; i++) jump += (dim_plane*local_planes[i])*sizeof(float);
jump += dim_plane*num_plane*sizeof(float);
}
lseek(fd,jump,fl->l_whence);
ris = write(fd,plane,dim_plane*sizeof(float));
fl->l_type = F_UNLCK; /* cambio il lock */
fcntl(fd, F_SETLK, fl); /* sblocco la regione */
return ris;
}
Thanks :)