diff options
| author | Benoit Germain <bnt.germain@gmail.com> | 2018-11-07 08:19:46 +0100 |
|---|---|---|
| committer | Benoit Germain <bnt.germain@gmail.com> | 2018-11-07 08:19:46 +0100 |
| commit | c57bc44324a767407d1eb9f95e3c7589700f042e (patch) | |
| tree | ad0fd1c15a31157c1ba4532840aa41decb04f124 /src | |
| parent | ef8fc2c4a215110b034424f9c423111d34963f31 (diff) | |
| download | lanes-c57bc44324a767407d1eb9f95e3c7589700f042e.tar.gz lanes-c57bc44324a767407d1eb9f95e3c7589700f042e.tar.bz2 lanes-c57bc44324a767407d1eb9f95e3c7589700f042e.zip | |
Fix potential crash at application shutdown when deep userdata were created before Lanes is required
Diffstat (limited to 'src')
| -rw-r--r-- | src/lanes.c | 5 | ||||
| -rw-r--r-- | src/universe.c | 9 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/lanes.c b/src/lanes.c index 7b1a707..d4b4c73 100644 --- a/src/lanes.c +++ b/src/lanes.c | |||
| @@ -1756,7 +1756,10 @@ static int selfdestruct_gc( lua_State* L) | |||
| 1756 | // Locks for 'tools.c' inc/dec counters | 1756 | // Locks for 'tools.c' inc/dec counters |
| 1757 | MUTEX_FREE( &U->deep_lock); | 1757 | MUTEX_FREE( &U->deep_lock); |
| 1758 | MUTEX_FREE( &U->mtid_lock); | 1758 | MUTEX_FREE( &U->mtid_lock); |
| 1759 | 1759 | // universe is no longer available (nor necessary) | |
| 1760 | // we need to do this in case some deep userdata objects were created before Lanes was initialized, | ||
| 1761 | // as potentially they will be garbage collected after Lanes at application shutdown | ||
| 1762 | universe_store( L, NULL); | ||
| 1760 | return 0; | 1763 | return 0; |
| 1761 | } | 1764 | } |
| 1762 | 1765 | ||
diff --git a/src/universe.c b/src/universe.c index 00de1f3..4689a09 100644 --- a/src/universe.c +++ b/src/universe.c | |||
| @@ -56,7 +56,14 @@ void universe_store( lua_State* L, Universe* U) | |||
| 56 | { | 56 | { |
| 57 | STACK_CHECK( L); | 57 | STACK_CHECK( L); |
| 58 | push_unique_key( L, UNIVERSE_REGKEY); | 58 | push_unique_key( L, UNIVERSE_REGKEY); |
| 59 | lua_pushlightuserdata( L, U); | 59 | if( NULL != U) |
| 60 | { | ||
| 61 | lua_pushlightuserdata( L, U); | ||
| 62 | } | ||
| 63 | else | ||
| 64 | { | ||
| 65 | lua_pushnil( L); | ||
| 66 | } | ||
| 60 | lua_rawset( L, LUA_REGISTRYINDEX); | 67 | lua_rawset( L, LUA_REGISTRYINDEX); |
| 61 | STACK_END( L, 0); | 68 | STACK_END( L, 0); |
| 62 | } | 69 | } |
