Skip to content

Commit f9543e2

Browse files
committed
stat, lstat: Return timestamp in higher resolution if possible.
* bootstrap.conf: Import gnulib module stat-time. * liboctave/wrappers/stat-wrapper.h, liboctave/wrappers/stat-wrapper.c (octave_stat_wrapper, octave_lstat_wrapper, octave_fstat_wrapper, assign_stat_fields): Use nanosecond precision fraction of timestamps in stat structure. * liboctave/system/file-stat.cc (file_stat::update_internal, file_fstat::update_internal): Use constructor of octave::sys::time objects with microsecond fraction of timestamps.
1 parent 0be306d commit f9543e2

File tree

4 files changed

+57
-19
lines changed

4 files changed

+57
-19
lines changed

bootstrap.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ gnulib_modules="
9191
signal
9292
sigprocmask
9393
stat
94+
stat-time
9495
stddef
9596
stdio
9697
strcase

liboctave/system/file-stat.cc

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -216,16 +216,19 @@ file_stat::update_internal (bool force)
216216
const char *cname = full_file_name.c_str ();
217217

218218
time_t sys_atime, sys_mtime, sys_ctime;
219+
long int atime_nsec, mtime_nsec, ctime_nsec;
219220

220221
int status
221222
= (m_follow_links
222223
? octave_stat_wrapper (cname, &m_mode, &m_ino, &m_dev,
223224
&m_nlink, &m_uid, &m_gid, &m_size,
224-
&sys_atime, &sys_mtime, &sys_ctime,
225+
&sys_atime, &atime_nsec, &sys_mtime,
226+
&mtime_nsec, &sys_ctime, &ctime_nsec,
225227
&m_rdev, &m_blksize, &m_blocks)
226228
: octave_lstat_wrapper (cname, &m_mode, &m_ino, &m_dev,
227229
&m_nlink, &m_uid, &m_gid, &m_size,
228-
&sys_atime, &sys_mtime, &sys_ctime,
230+
&sys_atime, &atime_nsec, &sys_mtime,
231+
&mtime_nsec, &sys_ctime, &ctime_nsec,
229232
&m_rdev, &m_blksize, &m_blocks));
230233

231234
if (status < 0)
@@ -235,9 +238,12 @@ file_stat::update_internal (bool force)
235238
}
236239
else
237240
{
238-
m_atime = sys::time (static_cast<OCTAVE_TIME_T> (sys_atime));
239-
m_mtime = sys::time (static_cast<OCTAVE_TIME_T> (sys_mtime));
240-
m_ctime = sys::time (static_cast<OCTAVE_TIME_T> (sys_ctime));
241+
m_atime = sys::time (static_cast<OCTAVE_TIME_T> (sys_atime),
242+
atime_nsec/1000);
243+
m_mtime = sys::time (static_cast<OCTAVE_TIME_T> (sys_mtime),
244+
mtime_nsec/1000);
245+
m_ctime = sys::time (static_cast<OCTAVE_TIME_T> (sys_ctime),
246+
ctime_nsec/1000);
241247
}
242248

243249
m_initialized = true;
@@ -253,11 +259,13 @@ file_fstat::update_internal (bool force)
253259
m_fail = false;
254260

255261
time_t sys_atime, sys_mtime, sys_ctime;
262+
long int atime_nsec, mtime_nsec, ctime_nsec;
256263

257264
int status
258265
= octave_fstat_wrapper (m_fid, &m_mode, &m_ino, &m_dev,
259266
&m_nlink, &m_uid, &m_gid, &m_size,
260-
&sys_atime, &sys_mtime, &sys_ctime,
267+
&sys_atime, &atime_nsec, &sys_mtime,
268+
&mtime_nsec, &sys_ctime, &ctime_nsec,
261269
&m_rdev, &m_blksize, &m_blocks);
262270

263271
if (status < 0)
@@ -267,9 +275,12 @@ file_fstat::update_internal (bool force)
267275
}
268276
else
269277
{
270-
m_atime = sys::time (static_cast<OCTAVE_TIME_T> (sys_atime));
271-
m_mtime = sys::time (static_cast<OCTAVE_TIME_T> (sys_mtime));
272-
m_ctime = sys::time (static_cast<OCTAVE_TIME_T> (sys_ctime));
278+
m_atime = sys::time (static_cast<OCTAVE_TIME_T> (sys_atime),
279+
atime_nsec/1000);
280+
m_mtime = sys::time (static_cast<OCTAVE_TIME_T> (sys_mtime),
281+
mtime_nsec/1000);
282+
m_ctime = sys::time (static_cast<OCTAVE_TIME_T> (sys_ctime),
283+
ctime_nsec/1000);
273284
}
274285

275286
m_initialized = true;

liboctave/wrappers/stat-wrappers.c

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,19 @@
3737
#include <sys/types.h>
3838
#include <sys/stat.h>
3939

40+
// Silence compiler warning if stat doesn't support nanosecond-precision
41+
// time stamps (e.g., on Windows).
42+
#if defined (HAVE_PRAGMA_GCC_DIAGNOSTIC)
43+
# pragma GCC diagnostic push
44+
# pragma GCC diagnostic ignored "-Wunused-parameter"
45+
#endif
46+
47+
#include "stat-time.h"
48+
49+
#if defined (HAVE_PRAGMA_GCC_DIAGNOSTIC)
50+
# pragma GCC diagnostic pop
51+
#endif
52+
4053
#include "stat-wrappers.h"
4154
#include "uniconv-wrappers.h"
4255

@@ -75,7 +88,8 @@ static inline void
7588
assign_stat_fields (struct stat *buf, mode_t *mode, ino_t *ino,
7689
dev_t *dev, nlink_t *nlink, uid_t *uid,
7790
gid_t *gid, off_t *size, time_t *atime,
78-
time_t *mtime, time_t *ctime, dev_t *rdev,
91+
long int *atime_nsec, time_t *mtime, long int *mtime_nsec,
92+
time_t *ctime, long int *ctime_nsec, dev_t *rdev,
7993
long *blksize, long *blocks)
8094
{
8195
*mode = buf->st_mode;
@@ -86,8 +100,11 @@ assign_stat_fields (struct stat *buf, mode_t *mode, ino_t *ino,
86100
*gid = buf->st_gid;
87101
*size = buf->st_size;
88102
*atime = buf->st_atime;
103+
*atime_nsec = get_stat_atime_ns (buf);
89104
*mtime = buf->st_mtime;
105+
*mtime_nsec = get_stat_mtime_ns (buf);
90106
*ctime = buf->st_ctime;
107+
*ctime_nsec = get_stat_ctime_ns (buf);
91108

92109
#if defined (HAVE_STRUCT_STAT_ST_RDEV)
93110
*rdev = buf->st_rdev;
@@ -112,7 +129,8 @@ int
112129
octave_stat_wrapper (const char *fname, mode_t *mode, ino_t *ino,
113130
dev_t *dev, nlink_t *nlink, uid_t *uid,
114131
gid_t *gid, off_t *size, time_t *atime,
115-
time_t *mtime, time_t *ctime, dev_t *rdev,
132+
long int *atime_nsec, time_t *mtime, long int *mtime_nsec,
133+
time_t *ctime, long int *ctime_nsec, dev_t *rdev,
116134
long *blksize, long *blocks)
117135
{
118136
struct stat buf;
@@ -126,7 +144,8 @@ octave_stat_wrapper (const char *fname, mode_t *mode, ino_t *ino,
126144
#endif
127145

128146
assign_stat_fields (&buf, mode, ino, dev, nlink, uid, gid, size,
129-
atime, mtime, ctime, rdev, blksize, blocks);
147+
atime, atime_nsec, mtime, mtime_nsec, ctime, ctime_nsec,
148+
rdev, blksize, blocks);
130149

131150
return status;
132151
}
@@ -135,7 +154,8 @@ int
135154
octave_lstat_wrapper (const char *lname, mode_t *mode, ino_t *ino,
136155
dev_t *dev, nlink_t *nlink, uid_t *uid,
137156
gid_t *gid, off_t *size, time_t *atime,
138-
time_t *mtime, time_t *ctime, dev_t *rdev,
157+
long int *atime_nsec, time_t *mtime, long int *mtime_nsec,
158+
time_t *ctime, long int *ctime_nsec, dev_t *rdev,
139159
long *blksize, long *blocks)
140160
{
141161
struct stat buf;
@@ -150,7 +170,8 @@ octave_lstat_wrapper (const char *lname, mode_t *mode, ino_t *ino,
150170
#endif
151171

152172
assign_stat_fields (&buf, mode, ino, dev, nlink, uid, gid, size,
153-
atime, mtime, ctime, rdev, blksize, blocks);
173+
atime, atime_nsec, mtime, mtime_nsec, ctime, ctime_nsec,
174+
rdev, blksize, blocks);
154175

155176
return status;
156177
}
@@ -159,15 +180,17 @@ int
159180
octave_fstat_wrapper (int fid, mode_t *mode, ino_t *ino,
160181
dev_t *dev, nlink_t *nlink, uid_t *uid,
161182
gid_t *gid, off_t *size, time_t *atime,
162-
time_t *mtime, time_t *ctime, dev_t *rdev,
183+
long int *atime_nsec, time_t *mtime, long int *mtime_nsec,
184+
time_t *ctime, long int *ctime_nsec, dev_t *rdev,
163185
long *blksize, long *blocks)
164186
{
165187
struct stat buf;
166188

167189
int status = fstat (fid, &buf);
168190

169191
assign_stat_fields (&buf, mode, ino, dev, nlink, uid, gid, size,
170-
atime, mtime, ctime, rdev, blksize, blocks);
192+
atime, atime_nsec, mtime, mtime_nsec, ctime, ctime_nsec,
193+
rdev, blksize, blocks);
171194

172195
return status;
173196
}

liboctave/wrappers/stat-wrappers.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,24 @@ extern OCTAVE_API int
4949
octave_stat_wrapper (const char *fname, mode_t *mode, ino_t *ino,
5050
dev_t *dev, nlink_t *nlink, uid_t *uid,
5151
gid_t *gid, off_t *size, time_t *atime,
52-
time_t *mtime, time_t *ctime, dev_t *rdev,
52+
long int *atime_nsec, time_t *mtime, long int *mtime_nsec,
53+
time_t *ctime, long int *ctime_nsec, dev_t *rdev,
5354
long *blksize, long *blocks);
5455

5556
extern OCTAVE_API int
5657
octave_lstat_wrapper (const char *lname, mode_t *mode, ino_t *ino,
5758
dev_t *dev, nlink_t *nlink, uid_t *uid,
5859
gid_t *gid, off_t *size, time_t *atime,
59-
time_t *mtime, time_t *ctime, dev_t *rdev,
60+
long int *atime_nsec, time_t *mtime, long int *mtime_nsec,
61+
time_t *ctime, long int *ctime_nsec, dev_t *rdev,
6062
long *blksize, long *blocks);
6163

6264
extern OCTAVE_API int
6365
octave_fstat_wrapper (int fid, mode_t *mode, ino_t *ino,
6466
dev_t *dev, nlink_t *nlink, uid_t *uid,
6567
gid_t *gid, off_t *size, time_t *atime,
66-
time_t *mtime, time_t *ctime, dev_t *rdev,
68+
long int *atime_nsec, time_t *mtime, long int *mtime_nsec,
69+
time_t *ctime, long int *ctime_nsec, dev_t *rdev,
6770
long *blksize, long *blocks);
6871

6972
extern OCTAVE_API bool octave_is_blk_wrapper (mode_t mode);

0 commit comments

Comments
 (0)