mirror of https://github.com/AxioDL/metaforce.git
EINTR recovery for BlenderConnection I/O
This commit is contained in:
parent
8469ee8fac
commit
1c9708f261
|
@ -337,7 +337,7 @@ def register():
|
||||||
|
|
||||||
bpy.types.Object.retro_textpane_font_path = bpy.props.StringProperty(name='Retro: Font Path')
|
bpy.types.Object.retro_textpane_font_path = bpy.props.StringProperty(name='Retro: Font Path')
|
||||||
bpy.types.Object.retro_textpane_word_wrap = bpy.props.BoolProperty(name='Retro: Word Wrap')
|
bpy.types.Object.retro_textpane_word_wrap = bpy.props.BoolProperty(name='Retro: Word Wrap')
|
||||||
bpy.types.Object.retro_textpane_horizontal = bpy.props.BoolProperty(name='Retro: Horizontal')
|
bpy.types.Object.retro_textpane_horizontal = bpy.props.BoolProperty(name='Retro: Horizontal', default=True)
|
||||||
bpy.types.Object.retro_textpane_fill_color = bpy.props.FloatVectorProperty(name='Retro: Fill Color', min=0.0, max=1.0, size=4, subtype='COLOR')
|
bpy.types.Object.retro_textpane_fill_color = bpy.props.FloatVectorProperty(name='Retro: Fill Color', min=0.0, max=1.0, size=4, subtype='COLOR')
|
||||||
bpy.types.Object.retro_textpane_outline_color = bpy.props.FloatVectorProperty(name='Retro: Outline Color', min=0.0, max=1.0, size=4, subtype='COLOR')
|
bpy.types.Object.retro_textpane_outline_color = bpy.props.FloatVectorProperty(name='Retro: Outline Color', min=0.0, max=1.0, size=4, subtype='COLOR')
|
||||||
bpy.types.Object.retro_textpane_block_extent = bpy.props.FloatVectorProperty(name='Retro: Block Extent', min=0.0, size=2)
|
bpy.types.Object.retro_textpane_block_extent = bpy.props.FloatVectorProperty(name='Retro: Block Extent', min=0.0, size=2)
|
||||||
|
|
|
@ -83,10 +83,48 @@ static void InstallStartup(const char* path)
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int Read(int fd, void* buf, size_t size)
|
||||||
|
{
|
||||||
|
int intrCount = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
auto ret = read(fd, buf, size);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
++intrCount;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return ret;
|
||||||
|
} while (intrCount < 3);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Write(int fd, const void* buf, size_t size)
|
||||||
|
{
|
||||||
|
int intrCount = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
auto ret = write(fd, buf, size);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
if (errno == EINTR)
|
||||||
|
++intrCount;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return ret;
|
||||||
|
} while (intrCount < 3);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t BlenderConnection::_readStr(char* buf, uint32_t bufSz)
|
uint32_t BlenderConnection::_readStr(char* buf, uint32_t bufSz)
|
||||||
{
|
{
|
||||||
uint32_t readLen;
|
uint32_t readLen;
|
||||||
int ret = read(m_readpipe[0], &readLen, 4);
|
int ret = Read(m_readpipe[0], &readLen, 4);
|
||||||
if (ret < 4)
|
if (ret < 4)
|
||||||
{
|
{
|
||||||
_blenderDied();
|
_blenderDied();
|
||||||
|
@ -100,7 +138,7 @@ uint32_t BlenderConnection::_readStr(char* buf, uint32_t bufSz)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = read(m_readpipe[0], buf, readLen);
|
ret = Read(m_readpipe[0], buf, readLen);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
BlenderLog.report(logvisor::Fatal, strerror(errno));
|
BlenderLog.report(logvisor::Fatal, strerror(errno));
|
||||||
|
@ -122,10 +160,10 @@ uint32_t BlenderConnection::_readStr(char* buf, uint32_t bufSz)
|
||||||
uint32_t BlenderConnection::_writeStr(const char* buf, uint32_t len, int wpipe)
|
uint32_t BlenderConnection::_writeStr(const char* buf, uint32_t len, int wpipe)
|
||||||
{
|
{
|
||||||
int ret, nlerr;
|
int ret, nlerr;
|
||||||
nlerr = write(wpipe, &len, 4);
|
nlerr = Write(wpipe, &len, 4);
|
||||||
if (nlerr < 4)
|
if (nlerr < 4)
|
||||||
goto err;
|
goto err;
|
||||||
ret = write(wpipe, buf, len);
|
ret = Write(wpipe, buf, len);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
goto err;
|
||||||
return (uint32_t)ret;
|
return (uint32_t)ret;
|
||||||
|
@ -136,7 +174,7 @@ err:
|
||||||
|
|
||||||
size_t BlenderConnection::_readBuf(void* buf, size_t len)
|
size_t BlenderConnection::_readBuf(void* buf, size_t len)
|
||||||
{
|
{
|
||||||
int ret = read(m_readpipe[0], buf, len);
|
int ret = Read(m_readpipe[0], buf, len);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
goto err;
|
||||||
if (len >= 4)
|
if (len >= 4)
|
||||||
|
@ -150,7 +188,7 @@ err:
|
||||||
|
|
||||||
size_t BlenderConnection::_writeBuf(const void* buf, size_t len)
|
size_t BlenderConnection::_writeBuf(const void* buf, size_t len)
|
||||||
{
|
{
|
||||||
int ret = write(m_writepipe[1], buf, len);
|
int ret = Write(m_writepipe[1], buf, len);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
goto err;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue