Ignore:
Timestamp:
Jan 9, 2019, 4:11:59 PM (5 years ago)
Author:
djay
Message:

Make this ZOO-Kernel working properly on windows platform again.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/prototype-v0/zoo-project/zoo-kernel/service_internal.c

    r877 r890  
    3131#include "service_internal.h"
    3232
    33 #ifndef TRUE
    34 #define TRUE 1
    35 #endif
    36 #ifndef FALSE
    37 #define FALSE -1
    38 #endif
    39 
    4033#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
    4335__inline int fcntl(int fd, int cmd, ...)
    4436{
    45     va_list a;
    46     va_start(a, cmd);
    47     switch(cmd)
     37  va_list a;
     38  va_start(a, cmd);
     39  switch(cmd)
    4840    {
    4941    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;
    16679    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
    17586#define ERROR_MSG_MAX_LENGTH 1024
    17687
     
    197108    if(itn<ZOO_LOCK_MAX_RETRY){
    198109      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);
    200112      fflush(stderr);
     113#endif
    201114      zSleep(5);
    202115      free(myLock->filename);
     
    216129    myLock->lockfile=fopen(myLock->filename,local_mode);
    217130    char tmp[512];
    218     sprintf(tmp,"%d",getpid());
     131    sprintf(tmp,"%d",zGetpid());
    219132    if(myLock->lockfile==NULL){
    220133      myLock->lockfile=fopen(myLock->filename,"w+");
     
    249162            return NULL;
    250163          }
    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);
    252166          fflush(stderr);
     167#endif
    253168          zSleep(1);
    254169          cnt++;
     
    265180        else
    266181          tmp="The system has run out of file lock resources; there are already too many file locks in place.";
     182#ifdef DEBUG
    267183      fprintf(stderr,"Unable to get the lock on %s due to the following error: %s\n",myLock->filename,tmp);
     184#endif
    268185      return NULL;
    269186    }
     
    285202    if(res==-1)
    286203      return res;
     204    fclose(s->lockfile);
     205#ifndef WIN32
    287206    // Check if there is any process locking a file and delete the lock if not.
    288207    s->lock.l_type = F_WRLCK;
    289208    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
    293214    free(s->filename);
    294215    free(s);
     
    507428                     * sizeof (char));
    508429  sprintf (fbkpid, "%s/%s.status", r_inputs->value, usid->value);
    509   unlink(fbkpid);
     430  zUnlink(fbkpid);
    510431  free(fbkpid);
    511432}
Note: See TracChangeset for help on using the changeset viewer.

Search

Context Navigation

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png