/* * Copyright 2018 Daniel Lehman * * 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 #include #include #include #include #include #include #include #include #include #include "wine/test.h" #include typedef void (*vtable_ptr)(void); typedef struct { const vtable_ptr *vtable; } Context; typedef struct { Context *ctx; } _Context; static char* (CDECL *p_setlocale)(int category, const char* locale); static size_t (CDECL *p___strncnt)(const char *str, size_t count); static unsigned int (CDECL *p_CurrentScheduler_GetNumberOfVirtualProcessors)(void); static unsigned int (CDECL *p__CurrentScheduler__GetNumberOfVirtualProcessors)(void); static unsigned int (CDECL *p_CurrentScheduler_Id)(void); static unsigned int (CDECL *p__CurrentScheduler__Id)(void); static Context* (__cdecl *p_Context_CurrentContext)(void); static _Context* (__cdecl *p__Context__CurrentContext)(_Context*); static int (__cdecl *p_strcmp)(const char *, const char *); static int (__cdecl *p_strncmp)(const char *, const char *, size_t); #define SETNOFAIL(x,y) x = (void*)GetProcAddress(module,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) static BOOL init(void) { HMODULE module; module = LoadLibraryA("msvcr110.dll"); if (!module) { win_skip("msvcr110.dll not installed\n"); return FALSE; } SET(p_setlocale, "setlocale"); SET(p___strncnt, "__strncnt"); SET(p_CurrentScheduler_GetNumberOfVirtualProcessors, "?GetNumberOfVirtualProcessors@CurrentScheduler@Concurrency@@SAIXZ"); SET(p__CurrentScheduler__GetNumberOfVirtualProcessors, "?_GetNumberOfVirtualProcessors@_CurrentScheduler@details@Concurrency@@SAIXZ"); SET(p_CurrentScheduler_Id, "?Id@CurrentScheduler@Concurrency@@SAIXZ"); SET(p__CurrentScheduler__Id, "?_Id@_CurrentScheduler@details@Concurrency@@SAIXZ"); SET(p__Context__CurrentContext, "?_CurrentContext@_Context@details@Concurrency@@SA?AV123@XZ"); if(sizeof(void*) == 8) { SET(p_Context_CurrentContext, "?CurrentContext@Context@Concurrency@@SAPEAV12@XZ"); } else { SET(p_Context_CurrentContext, "?CurrentContext@Context@Concurrency@@SAPAV12@XZ"); } SET(p_strcmp, "strcmp"); SET(p_strncmp, "strncmp"); return TRUE; } static void test_CurrentScheduler(void) { unsigned int id; unsigned int ncpus; unsigned int expect; SYSTEM_INFO si; expect = ~0; ncpus = p_CurrentScheduler_GetNumberOfVirtualProcessors(); ok(ncpus == expect, "expected %x, got %x\n", expect, ncpus); id = p_CurrentScheduler_Id(); ok(id == expect, "expected %u, got %u\n", expect, id); GetSystemInfo(&si); expect = si.dwNumberOfProcessors; /* these _CurrentScheduler calls trigger scheduler creation if either is commented out, the following CurrentScheduler (no _) tests will still work */ ncpus = p__CurrentScheduler__GetNumberOfVirtualProcessors(); id = p__CurrentScheduler__Id(); ok(ncpus == expect, "expected %u, got %u\n", expect, ncpus); ok(id == 0, "expected 0, got %u\n", id); /* these CurrentScheduler tests assume scheduler is created */ ncpus = p_CurrentScheduler_GetNumberOfVirtualProcessors(); ok(ncpus == expect, "expected %u, got %u\n", expect, ncpus); id = p_CurrentScheduler_Id(); ok(id == 0, "expected 0, got %u\n", id); } static void test_setlocale(void) { int i; char *ret; static const char *names[] = { "en-us", "en-US", "EN-US", "syr-SY", "uz-Latn-uz", }; for(i=0; i