Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 975c524

Browse files
committed
Refresh of bugfix-21305-win32_write_cache
1 parent c220219 commit 975c524

File tree

8 files changed

+41
-11
lines changed

8 files changed

+41
-11
lines changed

engine/src/dispatch.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1282,7 +1282,9 @@ IO_stat MCDispatch::dosavestack(MCStack *sptr, const MCStringRef p_fname, uint32
12821282
}
12831283
IO_handle stream;
12841284

1285-
if ((stream = MCS_open(*t_linkname, kMCOpenFileModeWrite, True, False, 0)) == NULL)
1285+
/* Ask to open the stackfile stream for buffered write. Whether this will
1286+
* make a difference depends on the platform. */
1287+
if ((stream = MCS_open(*t_linkname, kMCOpenFileModeBufferedWrite, True, False, 0)) == NULL)
12861288
{
12871289
MCresult->sets("can't open stack file");
12881290
cleanup(stream, *t_linkname, *t_backup);

engine/src/dsklnx.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ class MCLinuxDesktop: public MCSystemInterface
11791179
const char *t_mode;
11801180
if (p_mode == kMCOpenFileModeRead)
11811181
t_mode = IO_READ_MODE;
1182-
else if (p_mode == kMCOpenFileModeWrite)
1182+
else if (p_mode == kMCOpenFileModeWrite || p_mode == kMCOpenFileModeBufferedWrite)
11831183
t_mode = IO_WRITE_MODE;
11841184
else if (p_mode == kMCOpenFileModeUpdate)
11851185
t_mode = IO_UPDATE_MODE;
@@ -1212,6 +1212,7 @@ class MCLinuxDesktop: public MCSystemInterface
12121212
t_fptr = fdopen(p_fd, IO_READ_MODE);
12131213
break;
12141214
case kMCOpenFileModeWrite:
1215+
case kMCOpenFileModeBufferedWrite:
12151216
t_fptr = fdopen(p_fd, IO_WRITE_MODE);
12161217
break;
12171218
case kMCOpenFileModeUpdate:
@@ -1244,7 +1245,7 @@ class MCLinuxDesktop: public MCSystemInterface
12441245

12451246
if (p_mode == kMCOpenFileModeRead)
12461247
t_fptr = fopen(*t_path_sys, IO_READ_MODE);
1247-
else if (p_mode == kMCOpenFileModeWrite)
1248+
else if (p_mode == kMCOpenFileModeWrite || p_mode == kMCOpenFileModeBufferedWrite)
12481249
t_fptr = fopen(*t_path_sys, IO_WRITE_MODE);
12491250
else if (p_mode == kMCOpenFileModeUpdate)
12501251
t_fptr = fopen(*t_path_sys, IO_UPDATE_MODE);

engine/src/dskmac.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3960,6 +3960,7 @@ struct MCMacDesktop: public MCSystemInterface, public MCMacSystemService
39603960
fptr = fopen(*t_path_utf, IO_APPEND_MODE);
39613961
break;
39623962
case kMCOpenFileModeWrite:
3963+
case kMCOpenFileModeBufferedWrite:
39633964
fptr = fopen(*t_path_utf, IO_WRITE_MODE);
39643965
break;
39653966
default:
@@ -3996,6 +3997,7 @@ struct MCMacDesktop: public MCSystemInterface, public MCMacSystemService
39963997
t_stream = fdopen(p_fd, IO_UPDATE_MODE);
39973998
break;
39983999
case kMCOpenFileModeWrite:
4000+
case kMCOpenFileModeBufferedWrite:
39994001
t_stream = fdopen(p_fd, IO_WRITE_MODE);
40004002
break;
40014003
default:
@@ -4006,7 +4008,7 @@ struct MCMacDesktop: public MCSystemInterface, public MCMacSystemService
40064008
return NULL;
40074009

40084010
// MH-2007-05-17: [[Bug 3196]] Opening the write pipe to a process should not be buffered.
4009-
if (p_mode == kMCOpenFileModeWrite)
4011+
if (p_mode == kMCOpenFileModeWrite || p_mode == kMCOpenFileModeBufferedWrite)
40104012
setvbuf(t_stream, NULL, _IONBF, 0);
40114013

40124014
IO_handle t_handle;
@@ -4041,6 +4043,7 @@ struct MCMacDesktop: public MCSystemInterface, public MCMacSystemService
40414043
fptr = fopen(*t_path_utf, IO_UPDATE_MODE);
40424044
break;
40434045
case kMCOpenFileModeWrite:
4046+
case kMCOpenFileModeBufferedWrite:
40444047
fptr = fopen(*t_path_utf, IO_WRITE_MODE);
40454048
break;
40464049
default:

engine/src/dskw32.cpp

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,14 +1170,15 @@ struct MCMemoryMappedFileHandle: public MCMemoryFileHandle
11701170

11711171
struct MCStdioFileHandle: public MCSystemFileHandle
11721172
{
1173-
MCStdioFileHandle(MCWinSysHandle p_handle, bool p_is_pipe = false)
1173+
MCStdioFileHandle(MCWinSysHandle p_handle, bool p_is_pipe = false, bool p_buffered_write = false)
11741174
{
11751175
m_handle = p_handle;
11761176
m_is_eof = false;
11771177
m_is_pipe = p_is_pipe;
11781178
m_putback = -1;
11791179

11801180
/* The write buffer starts off unallocated. */
1181+
m_should_buffer_writes = p_buffered_write;
11811182
m_write_buffer = nullptr;
11821183
m_write_buffer_frontier = 0;
11831184
}
@@ -1570,12 +1571,27 @@ struct MCStdioFileHandle: public MCSystemFileHandle
15701571
return 0;
15711572
}
15721573

1573-
/* As the API call returns the size in two pieces, combine them into a single 64-bit value. */
1574+
/* As the API call returns the size in two pieces, combine them into
1575+
* a single 64-bit value. */
15741576
uint64_t t_file_size =
15751577
(uint64_t)t_low_word | (uint64_t)t_high_word << 32;
15761578

1577-
/* Increase the offset by any currently (unwritten) buffered data. */
1578-
t_file_size += GetBufferedWriteSize();
1579+
/* If there is buffered data to write, then we must take the current
1580+
* file pointer into account. */
1581+
uint32_t t_buffered_write_size =
1582+
GetBufferedWriteSize();
1583+
if (t_buffered_write_size != 0)
1584+
{
1585+
/* Fetch the current file pointer - including any additional offset
1586+
* pending data to write. */
1587+
int64_t t_file_pointer =
1588+
Tell();
1589+
1590+
/* The file size is either the current file pointer, or the current
1591+
* actual file size adjusted by the size of pending data. */
1592+
t_file_size = MCMax(t_file_size + t_buffered_write_size,
1593+
t_file_pointer);
1594+
}
15791595

15801596
/* Return the final, computed, file size. */
15811597
return t_file_size;
@@ -1593,7 +1609,8 @@ struct MCStdioFileHandle: public MCSystemFileHandle
15931609
{
15941610
/* If there is no write buffer, or the write buffer is empty then there
15951611
* is nothing to do. */
1596-
if (m_write_buffer == nullptr ||
1612+
if (!m_should_buffer_writes ||
1613+
m_write_buffer == nullptr ||
15971614
m_write_buffer_frontier == 0)
15981615
{
15991616
return true;
@@ -1663,6 +1680,7 @@ struct MCStdioFileHandle: public MCSystemFileHandle
16631680
/* The maximum single write size which will be buffered. */
16641681
kMaximumSingleBufferedWriteSize = 16384,
16651682
};
1683+
bool m_should_buffer_writes;
16661684
byte_t *m_write_buffer;
16671685
uint32_t m_write_buffer_frontier;
16681686
};
@@ -2343,7 +2361,7 @@ struct MCWindowsDesktop: public MCSystemInterface, public MCWindowsSystemService
23432361
omode = GENERIC_READ;
23442362
createmode = OPEN_EXISTING;
23452363
}
2346-
if (p_mode== kMCOpenFileModeWrite || p_mode == kMCOpenFileModeCreate)
2364+
if (p_mode == kMCOpenFileModeBufferedWrite || p_mode== kMCOpenFileModeWrite || p_mode == kMCOpenFileModeCreate)
23472365
{
23482366
omode = GENERIC_WRITE;
23492367
createmode = CREATE_ALWAYS;
@@ -2452,7 +2470,9 @@ struct MCWindowsDesktop: public MCSystemInterface, public MCWindowsSystemService
24522470
}
24532471
else
24542472
{
2455-
t_handle = new (nothrow) MCStdioFileHandle((MCWinSysHandle)t_file_handle);
2473+
t_handle = new (nothrow) MCStdioFileHandle((MCWinSysHandle)t_file_handle,
2474+
false,
2475+
p_mode == kMCOpenFileModeBufferedWrite);
24562476
t_close_file_handler = t_handle == NULL;
24572477
}
24582478

engine/src/em-system.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,7 @@ MCEmscriptenSystem::OpenFile(MCStringRef p_path,
759759
t_open_flags = O_RDONLY;
760760
break;
761761
case kMCOpenFileModeWrite:
762+
case kMCOpenFileModeBufferedWrite:
762763
t_open_flags = O_WRONLY | O_TRUNC | O_CREAT;
763764
break;
764765
case kMCOpenFileModeUpdate:

engine/src/mblandroidio.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ IO_handle MCAndroidSystem::OpenFile(MCStringRef p_path, intenum_t p_mode, Boolea
258258
t_mode = 0;
259259
break;
260260
case kMCOpenFileModeWrite:
261+
case kMCOpenFileModeBufferedWrite:
261262
t_mode = 1;
262263
break;
263264
case kMCOpenFileModeUpdate:

engine/src/mbliphone.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ virtual uint64_t GetFileSize(void)
600600
t_mode = 0;
601601
break;
602602
case kMCOpenFileModeWrite:
603+
case kMCOpenFileModeBufferedWrite:
603604
t_mode = 1;
604605
break;
605606
case kMCOpenFileModeUpdate:

engine/src/mcio.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ enum MCOpenFileMode
5151
{
5252
kMCOpenFileModeRead,
5353
kMCOpenFileModeWrite,
54+
kMCOpenFileModeBufferedWrite,
5455
kMCOpenFileModeUpdate,
5556
kMCOpenFileModeAppend,
5657
kMCOpenFileModeCreate,

0 commit comments

Comments
 (0)