ucrtbase: Implement _initialize_onexit_table().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
938cd952ad
commit
4551b72e75
|
@ -52,7 +52,7 @@
|
|||
@ cdecl _getdllprocaddr(long str long) ucrtbase._getdllprocaddr
|
||||
@ cdecl _getpid() ucrtbase._getpid
|
||||
@ cdecl _initialize_narrow_environment() ucrtbase._initialize_narrow_environment
|
||||
@ stub _initialize_onexit_table
|
||||
@ cdecl _initialize_onexit_table(ptr) ucrtbase._initialize_onexit_table
|
||||
@ cdecl _initialize_wide_environment() ucrtbase._initialize_wide_environment
|
||||
@ cdecl _initterm(ptr ptr) ucrtbase._initterm
|
||||
@ cdecl _initterm_e(ptr ptr) ucrtbase._initterm_e
|
||||
|
|
|
@ -34,6 +34,13 @@ static int MSVCRT_atexit_table_size = 0;
|
|||
static int MSVCRT_atexit_registered = 0; /* Points to free slot */
|
||||
static MSVCRT_purecall_handler purecall_handler = NULL;
|
||||
|
||||
typedef struct MSVCRT__onexit_table_t
|
||||
{
|
||||
MSVCRT__onexit_t *_first;
|
||||
MSVCRT__onexit_t *_last;
|
||||
MSVCRT__onexit_t *_end;
|
||||
} MSVCRT__onexit_table_t;
|
||||
|
||||
static const char szMsgBoxTitle[] = "Wine C++ Runtime Library";
|
||||
|
||||
extern int MSVCRT_app_type;
|
||||
|
@ -334,6 +341,22 @@ int CDECL MSVCRT__crt_atexit(void (*func)(void))
|
|||
return MSVCRT__onexit((MSVCRT__onexit_t)func) == (MSVCRT__onexit_t)func ? 0 : -1;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* _initialize_onexit_table (UCRTBASE.@)
|
||||
*/
|
||||
int CDECL MSVCRT__initialize_onexit_table(MSVCRT__onexit_table_t *table)
|
||||
{
|
||||
TRACE("(%p)\n", table);
|
||||
|
||||
if (!table)
|
||||
return -1;
|
||||
|
||||
if (table->_first == table->_end)
|
||||
table->_last = table->_end = table->_first = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* _set_purecall_handler (MSVCR71.@)
|
||||
*/
|
||||
|
|
|
@ -3,5 +3,6 @@ APPMODE = -mno-cygwin
|
|||
|
||||
C_SRCS = \
|
||||
cpp.c \
|
||||
misc.c \
|
||||
printf.c \
|
||||
string.c
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* Copyright 2016 Nikolay Sivov for CodeWeavers
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include "wine/test.h"
|
||||
|
||||
typedef int (CDECL *MSVCRT__onexit_t)(void);
|
||||
|
||||
typedef struct MSVCRT__onexit_table_t
|
||||
{
|
||||
MSVCRT__onexit_t *_first;
|
||||
MSVCRT__onexit_t *_last;
|
||||
MSVCRT__onexit_t *_end;
|
||||
} MSVCRT__onexit_table_t;
|
||||
|
||||
static int (CDECL *p_initialize_onexit_table)(MSVCRT__onexit_table_t *table);
|
||||
|
||||
static void test__initialize_onexit_table(void)
|
||||
{
|
||||
MSVCRT__onexit_table_t table, table2;
|
||||
int ret;
|
||||
|
||||
if (!p_initialize_onexit_table)
|
||||
{
|
||||
win_skip("_initialize_onexit_table() is not available.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = p_initialize_onexit_table(NULL);
|
||||
ok(ret == -1, "got %d\n", ret);
|
||||
|
||||
memset(&table, 0, sizeof(table));
|
||||
ret = p_initialize_onexit_table(&table);
|
||||
ok(ret == 0, "got %d\n", ret);
|
||||
ok(table._first == table._last && table._first == table._end, "got first %p, last %p, end %p\n",
|
||||
table._first, table._last, table._end);
|
||||
|
||||
memset(&table2, 0, sizeof(table2));
|
||||
ret = p_initialize_onexit_table(&table2);
|
||||
ok(ret == 0, "got %d\n", ret);
|
||||
ok(table2._first == table._first, "got %p, %p\n", table2._first, table._first);
|
||||
|
||||
/* uninitialized table */
|
||||
table._first = table._last = table._end = (void*)0x123;
|
||||
ret = p_initialize_onexit_table(&table);
|
||||
ok(ret == 0, "got %d\n", ret);
|
||||
ok(table._first == table._last && table._first == table._end, "got first %p, last %p, end %p\n",
|
||||
table._first, table._last, table._end);
|
||||
ok(table._first != (void*)0x123, "got %p\n", table._first);
|
||||
|
||||
table._first = (void*)0x123;
|
||||
table._last = (void*)0x456;
|
||||
table._end = (void*)0x123;
|
||||
ret = p_initialize_onexit_table(&table);
|
||||
ok(ret == 0, "got %d\n", ret);
|
||||
ok(table._first == table._last && table._first == table._end, "got first %p, last %p, end %p\n",
|
||||
table._first, table._last, table._end);
|
||||
ok(table._first != (void*)0x123, "got %p\n", table._first);
|
||||
|
||||
table._first = (void*)0x123;
|
||||
table._last = (void*)0x456;
|
||||
table._end = (void*)0x789;
|
||||
ret = p_initialize_onexit_table(&table);
|
||||
ok(ret == 0, "got %d\n", ret);
|
||||
ok(table._first == (void*)0x123, "got %p\n", table._first);
|
||||
ok(table._last == (void*)0x456, "got %p\n", table._last);
|
||||
ok(table._end == (void*)0x789, "got %p\n", table._end);
|
||||
|
||||
table._first = NULL;
|
||||
table._last = (void*)0x456;
|
||||
table._end = NULL;
|
||||
ret = p_initialize_onexit_table(&table);
|
||||
ok(ret == 0, "got %d\n", ret);
|
||||
ok(table._first == table._last && table._first == table._end, "got first %p, last %p, end %p\n",
|
||||
table._first, table._last, table._end);
|
||||
}
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
HMODULE module = LoadLibraryA("ucrtbase.dll");
|
||||
|
||||
p_initialize_onexit_table = (void*)GetProcAddress(module, "_initialize_onexit_table");
|
||||
}
|
||||
|
||||
START_TEST(misc)
|
||||
{
|
||||
init();
|
||||
|
||||
test__initialize_onexit_table();
|
||||
}
|
|
@ -419,7 +419,7 @@
|
|||
@ cdecl _i64tow(int64 ptr long) ntdll._i64tow
|
||||
@ cdecl _i64tow_s(int64 ptr long long) MSVCRT__i64tow_s
|
||||
@ cdecl _initialize_narrow_environment()
|
||||
@ stub _initialize_onexit_table
|
||||
@ cdecl _initialize_onexit_table(ptr) MSVCRT__initialize_onexit_table
|
||||
@ cdecl _initialize_wide_environment()
|
||||
@ cdecl _initterm(ptr ptr)
|
||||
@ cdecl _initterm_e(ptr ptr)
|
||||
|
|
Loading…
Reference in New Issue