00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "OW_config.h"
00037 #include "OW_File.hpp"
00038
00039 #ifdef OW_WIN32
00040 #include <io.h>
00041 #include <stdlib.h>
00042 #include <stdio.h>
00043 #include <memory.h>
00044 #else
00045 #include <fcntl.h>
00046 #ifdef OW_HAVE_UNISTD_H
00047 #include <unistd.h>
00048 #endif
00049 #endif
00050
00051
00052 namespace OW_NAMESPACE
00053 {
00054 #ifdef OW_WIN32
00055 namespace
00056 {
00058
00059 int
00060 doLock(HANDLE hFile, bool doWait)
00061 {
00062 if (hFile == INVALID_HANDLE_VALUE)
00063 {
00064 return -1;
00065 }
00066
00067 DWORD flags = LOCKFILE_EXCLUSIVE_LOCK;
00068 if (!doWait)
00069 {
00070 flags |= LOCKFILE_FAIL_IMMEDIATELY;
00071 }
00072
00073 OVERLAPPED ov;
00074 memset(&ov, 0, sizeof(ov));
00075 if (!LockFileEx(hFile, flags, 0, 0xffffffff,
00076 0xffffffff, &ov))
00077 {
00078 return -1;
00079 }
00080
00081 return 0;
00082 }
00083
00084 }
00085
00087 File::File(const File& x) : m_hdl(OW_INVALID_FILEHANDLE)
00088 {
00089 if( x.m_hdl != OW_INVALID_FILEHANDLE )
00090 {
00091 DuplicateHandle(GetCurrentProcess(), x.m_hdl, GetCurrentProcess(),
00092 &m_hdl , 0, FALSE, DUPLICATE_SAME_ACCESS);
00093 }
00094 }
00096 int
00097 File::getLock()
00098 {
00099 return doLock(m_hdl, true);
00100 }
00102 int
00103 File::tryLock()
00104 {
00105 return doLock(m_hdl, false);
00106 }
00108 int
00109 File::unlock()
00110 {
00111 if (m_hdl == INVALID_HANDLE_VALUE)
00112 {
00113 return -1;
00114 }
00115
00116 OVERLAPPED ov;
00117 memset(&ov, 0, sizeof(ov));
00118 if (!UnlockFileEx(m_hdl, 0, 0xffffffff, 0xffffffff, &ov))
00119 {
00120 return -1;
00121 }
00122
00123 return 0;
00124 }
00125
00126 #else // NOT WIN32
00127
00129 File::File(const File& x) : m_hdl(dup(x.m_hdl))
00130 {
00131 }
00132
00133 namespace {
00135
00136 int
00137 doLock(int hdl, int cmd, short int type)
00138 {
00139 struct flock lck;
00140 ::memset (&lck, '\0', sizeof (lck));
00141 lck.l_type = type;
00142 lck.l_whence = 0;
00143 lck.l_start = 0L;
00144 lck.l_len = 0L;
00145 return ::fcntl(hdl, cmd, &lck);
00146 }
00147 }
00149 int
00150 File::getLock()
00151 {
00152 return doLock(m_hdl, F_SETLKW, F_WRLCK);
00153 }
00155 int
00156 File::tryLock()
00157 {
00158 return doLock(m_hdl, F_SETLK, F_WRLCK);
00159 }
00161 int
00162 File::unlock()
00163 {
00164 return doLock(m_hdl, F_SETLK, F_UNLCK);
00165 }
00166 #endif
00167
00168 }
00169