- Timestamp:
- Jan 9, 2019, 4:11:59 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/prototype-v0/zoo-project/zoo-kernel/service_internal.c
r877 r890 31 31 #include "service_internal.h" 32 32 33 #ifndef TRUE34 #define TRUE 135 #endif36 #ifndef FALSE37 #define FALSE -138 #endif39 40 33 #ifdef WIN32 41 // cf. https://stackoverflow.com/questions/3168504/lockfileex-read-write-upgrade-downgrade 42 // only works for (SEEK_SET, start=0, len=0) file locking. 34 // ref. https://docs.microsoft.com/en-us/windows/desktop/fileio/locking-and-unlocking-byte-ranges-in-files 43 35 __inline int fcntl(int fd, int cmd, ...) 44 36 { 45 46 47 37 va_list a; 38 va_start(a, cmd); 39 switch(cmd) 48 40 { 49 41 case F_SETLK: 50 { 51 struct flock *l = va_arg(a, struct flock*); 52 switch(l->l_type) 53 { 54 case F_RDLCK: 55 { 56 LPOVERLAPPED o = { 0 }; 57 HANDLE h = (HANDLE)_get_osfhandle(fd); 58 if (l->l_whence != SEEK_SET || l->l_start != 0 || l->l_len != 0) 59 { 60 _set_errno(ENOTSUP); 61 return -1; 62 } 63 if (!LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY, 0, 0, 1, o)) // read lock 64 { 65 unsigned long x = GetLastError(); 66 _set_errno(GetLastError() == ERROR_LOCK_VIOLATION ? EAGAIN : EBADF); 67 return -1; 68 } 69 UnlockFile(h, 0, 0, 1, 1); // write lock 70 } 71 break; 72 case F_WRLCK: 73 { 74 LPOVERLAPPED o = { 0 }; 75 HANDLE h = (HANDLE)_get_osfhandle(fd); 76 if (l->l_whence != SEEK_SET || l->l_start != 0 || l->l_len != 0) 77 { 78 _set_errno(ENOTSUP); 79 return -1; 80 } 81 if (!LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 1, o)) // write lock 82 { 83 unsigned long x = GetLastError(); 84 _set_errno(GetLastError() == ERROR_LOCK_VIOLATION ? EAGAIN : EBADF); 85 return -1; 86 } 87 UnlockFile(h, 0, 0, 0, 1); // read lock 88 } 89 break; 90 case F_UNLCK: 91 { 92 HANDLE h = (HANDLE)_get_osfhandle(fd); 93 if (l->l_whence != SEEK_SET || l->l_start != 0 || l->l_len != 0) 94 { 95 _set_errno(ENOTSUP); 96 return -1; 97 } 98 UnlockFile(h, 0, 0, 0, 1); // read lock 99 UnlockFile(h, 0, 0, 1, 1); // write lock 100 } 101 break; 102 default: 103 _set_errno(ENOTSUP); 104 return -1; 105 } 106 } 107 break; 108 case F_SETLKW: 109 { 110 struct flock *l = va_arg(a, struct flock*); 111 switch(l->l_type) 112 { 113 case F_RDLCK: 114 { 115 LPOVERLAPPED o = { 0 }; 116 HANDLE h = (HANDLE)_get_osfhandle(fd); 117 if (l->l_whence != SEEK_SET || l->l_start != 0 || l->l_len != 0) 118 { 119 _set_errno(ENOTSUP); 120 return -1; 121 } 122 if(!LockFileEx(h, 0, 0, 0, 1, o)) // read lock 123 { 124 unsigned long x = GetLastError(); 125 return -1; 126 } 127 UnlockFile(h, 0, 0, 1, 1); // write lock 128 } 129 break; 130 case F_WRLCK: 131 { 132 LPOVERLAPPED o = { 0 }; 133 HANDLE h = (HANDLE)_get_osfhandle(fd); 134 if (l->l_whence != SEEK_SET || l->l_start != 0 || l->l_len != 0) 135 { 136 _set_errno(ENOTSUP); 137 return -1; 138 } 139 if (!LockFileEx(h, LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 1, o)) // write lock 140 { 141 unsigned long x = GetLastError(); 142 return -1; 143 } 144 UnlockFile(h, 0, 0, 0, 1); // read lock 145 } 146 break; 147 case F_UNLCK: 148 { 149 flock *l = va_arg(a, flock*); 150 HANDLE h = (HANDLE)_get_osfhandle(fd); 151 if (l->l_whence != SEEK_SET || l->l_start != 0 || l->l_len != 0) 152 { 153 _set_errno(ENOTSUP); 154 return -1; 155 } 156 UnlockFile(h, 0, 0, 0, 1); // read lock 157 UnlockFile(h, 0, 0, 1, 1); // write lock 158 } 159 break; 160 default: 161 _set_errno(ENOTSUP); 162 return -1; 163 } 164 } 165 break; 42 { 43 HANDLE h = (HANDLE)_get_osfhandle(fd); 44 struct flock* l= va_arg(a, struct flock*); 45 OVERLAPPED sOverlapped; 46 sOverlapped.Offset = 0; 47 sOverlapped.OffsetHigh = 0; 48 switch(l->l_type) 49 { 50 case F_RDLCK: 51 { 52 if (!LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY, 0, l->l_len, 0, &sOverlapped)) 53 { 54 _set_errno(GetLastError() == ERROR_LOCK_VIOLATION ? EAGAIN : EBADF); 55 return -1; 56 } 57 } 58 break; 59 case F_WRLCK: 60 { 61 if (!LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK, 0, l->l_len, 0, &sOverlapped)) 62 { 63 _set_errno(GetLastError() == ERROR_LOCK_VIOLATION ? EAGAIN : EBADF); 64 return -1; 65 } 66 } 67 break; 68 case F_UNLCK: 69 { 70 UnlockFileEx(h, 0, l->l_len, 0, &sOverlapped); 71 } 72 break; 73 default: 74 _set_errno(ENOTSUP); 75 return -1; 76 } 77 } 78 break; 166 79 default: 167 _set_errno(ENOTSUP); 168 return -1; 169 } 170 171 return 0; 172 } 173 #endif 174 80 _set_errno(ENOTSUP); 81 return -1; 82 } 83 return 0; 84 } 85 #endif 175 86 #define ERROR_MSG_MAX_LENGTH 1024 176 87 … … 197 108 if(itn<ZOO_LOCK_MAX_RETRY){ 198 109 itn++; 199 fprintf(stderr,"(%d) Wait for write lock on %s, tried %d times (sleep) ... \n",getpid(),myLock->filename,itn); 110 #ifdef DEBUG 111 fprintf(stderr,"(%d) Wait for write lock on %s, tried %d times (sleep) ... \n",zGetpid(),myLock->filename,itn); 200 112 fflush(stderr); 113 #endif 201 114 zSleep(5); 202 115 free(myLock->filename); … … 216 129 myLock->lockfile=fopen(myLock->filename,local_mode); 217 130 char tmp[512]; 218 sprintf(tmp,"%d", getpid());131 sprintf(tmp,"%d",zGetpid()); 219 132 if(myLock->lockfile==NULL){ 220 133 myLock->lockfile=fopen(myLock->filename,"w+"); … … 249 162 return NULL; 250 163 } 251 fprintf(stderr,"(%d) Wait for lock on %s, tried %d times ... \n",getpid(),myLock->filename,cnt); 164 #ifdef DEBUG 165 fprintf(stderr,"(%d) Wait for lock on %s, tried %d times ... \n",zGetpid(),myLock->filename,cnt); 252 166 fflush(stderr); 167 #endif 253 168 zSleep(1); 254 169 cnt++; … … 265 180 else 266 181 tmp="The system has run out of file lock resources; there are already too many file locks in place."; 182 #ifdef DEBUG 267 183 fprintf(stderr,"Unable to get the lock on %s due to the following error: %s\n",myLock->filename,tmp); 184 #endif 268 185 return NULL; 269 186 } … … 285 202 if(res==-1) 286 203 return res; 204 fclose(s->lockfile); 205 #ifndef WIN32 287 206 // Check if there is any process locking a file and delete the lock if not. 288 207 s->lock.l_type = F_WRLCK; 289 208 if(fcntl(fileno(s->lockfile), F_GETLK, &s->lock)!=-1 && s->lock.l_type == F_UNLCK){ 290 unlink(s->filename); 291 } 292 fclose(s->lockfile); 209 #endif 210 zUnlink(s->filename); 211 #ifndef WIN32 212 } 213 #endif 293 214 free(s->filename); 294 215 free(s); … … 507 428 * sizeof (char)); 508 429 sprintf (fbkpid, "%s/%s.status", r_inputs->value, usid->value); 509 unlink(fbkpid);430 zUnlink(fbkpid); 510 431 free(fbkpid); 511 432 }
Note: See TracChangeset
for help on using the changeset viewer.