This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| #include <string.h> | |
| #include <assert.h> | |
| #include <pthread.h> | |
| #include <lua.h> | |
| #include <lauxlib.h> | |
| #include <lualib.h> | |
| #define THREADS 20000 | |
| // gcc test.c -lpthread -llua | |
| // gcc test.c -lpthread -llua -ljemalloc | |
| // sudo yum install time | |
| // ulimit -n 50000 | |
| // /usr/bin/time -v ./a.out | |
| static const char *SCRIPT = | |
| "function f_foo()\n" | |
| " local whatever = {\n" | |
| " ['00000'] = true,\n" | |
| " ['00001'] = true,\n" | |
| " ['00002'] = true,\n" | |
| " ['00003'] = true,\n" | |
| " ['00004'] = true,\n" | |
| " ['00005'] = true,\n" | |
| " ['00006'] = true,\n" | |
| " ['00007'] = true,\n" | |
| " ['00008'] = true,\n" | |
| " ['00009'] = true,\n" | |
| " ['00010'] = true,\n" | |
| " ['00011'] = true,\n" | |
| " ['00012'] = true,\n" | |
| " ['00013'] = true,\n" | |
| " ['00014'] = true,\n" | |
| " ['00015'] = true,\n" | |
| " ['00016'] = true,\n" | |
| " ['00017'] = true,\n" | |
| " ['00018'] = true,\n" | |
| " ['00019'] = true,\n" | |
| " ['00020'] = true,\n" | |
| " ['00021'] = true,\n" | |
| " ['00022'] = true,\n" | |
| " ['00023'] = true,\n" | |
| " ['00024'] = true,\n" | |
| " ['00025'] = true,\n" | |
| " ['00026'] = true,\n" | |
| " ['00027'] = true,\n" | |
| " ['00028'] = true,\n" | |
| " ['00029'] = true,\n" | |
| " ['00030'] = true,\n" | |
| " ['00031'] = true,\n" | |
| " ['00032'] = true,\n" | |
| " ['00033'] = true,\n" | |
| " ['00034'] = true,\n" | |
| " ['00035'] = true,\n" | |
| " ['00036'] = true,\n" | |
| " ['00037'] = true,\n" | |
| " ['00038'] = true,\n" | |
| " ['00039'] = true,\n" | |
| " ['00040'] = true,\n" | |
| " ['00041'] = true,\n" | |
| " ['00042'] = true,\n" | |
| " ['00043'] = true,\n" | |
| " ['00044'] = true,\n" | |
| " ['00045'] = true,\n" | |
| " ['00046'] = true,\n" | |
| " ['00047'] = true,\n" | |
| " ['00048'] = true,\n" | |
| " ['00049'] = true,\n" | |
| " ['00050'] = true,\n" | |
| " ['00051'] = true,\n" | |
| " ['00052'] = true,\n" | |
| " ['00053'] = true,\n" | |
| " ['00054'] = true,\n" | |
| " ['00055'] = true,\n" | |
| " ['00056'] = true,\n" | |
| " ['00057'] = true,\n" | |
| " ['00058'] = true,\n" | |
| " ['00059'] = true,\n" | |
| " ['00060'] = true,\n" | |
| " ['00061'] = true,\n" | |
| " ['00062'] = true,\n" | |
| " ['00063'] = true,\n" | |
| " ['00064'] = true,\n" | |
| " ['00065'] = true,\n" | |
| " ['00066'] = true,\n" | |
| " ['00067'] = true,\n" | |
| " ['00068'] = true,\n" | |
| " ['00069'] = true,\n" | |
| " ['00070'] = true,\n" | |
| " ['00071'] = true,\n" | |
| " ['00072'] = true,\n" | |
| " ['00073'] = true,\n" | |
| " ['00074'] = true,\n" | |
| " ['00075'] = true,\n" | |
| " ['00076'] = true,\n" | |
| " ['00077'] = true,\n" | |
| " ['00078'] = true,\n" | |
| " ['00079'] = true,\n" | |
| " ['00080'] = true,\n" | |
| " ['00081'] = true,\n" | |
| " ['00082'] = true,\n" | |
| " ['00083'] = true,\n" | |
| " ['00084'] = true,\n" | |
| " ['00085'] = true,\n" | |
| " ['00086'] = true,\n" | |
| " ['00087'] = true,\n" | |
| " ['00088'] = true,\n" | |
| " ['00089'] = true,\n" | |
| " ['00090'] = true,\n" | |
| " ['00091'] = true,\n" | |
| " ['00092'] = true,\n" | |
| " ['00093'] = true,\n" | |
| " ['00094'] = true,\n" | |
| " ['00095'] = true,\n" | |
| " ['00096'] = true,\n" | |
| " ['00097'] = true,\n" | |
| " ['00098'] = true,\n" | |
| " ['00099'] = true,\n" | |
| " ['00100'] = true,\n" | |
| " ['00101'] = true,\n" | |
| " ['00102'] = true,\n" | |
| " ['00103'] = true,\n" | |
| " ['00104'] = true,\n" | |
| " ['00105'] = true,\n" | |
| " ['00106'] = true,\n" | |
| " ['00107'] = true,\n" | |
| " ['00108'] = true,\n" | |
| " ['00109'] = true,\n" | |
| " ['00110'] = true,\n" | |
| " ['00111'] = true,\n" | |
| " ['00112'] = true,\n" | |
| " ['00113'] = true,\n" | |
| " ['00114'] = true,\n" | |
| " ['00115'] = true,\n" | |
| " ['00116'] = true,\n" | |
| " ['00117'] = true,\n" | |
| " ['00118'] = true,\n" | |
| " ['00119'] = true,\n" | |
| " ['00120'] = true,\n" | |
| " ['00121'] = true,\n" | |
| " ['00122'] = true,\n" | |
| " ['00123'] = true,\n" | |
| " ['00124'] = true,\n" | |
| " ['00125'] = true,\n" | |
| " ['00126'] = true,\n" | |
| " ['00127'] = true,\n" | |
| " ['00128'] = true,\n" | |
| " ['00129'] = true,\n" | |
| " ['00130'] = true,\n" | |
| " ['00131'] = true,\n" | |
| " ['00132'] = true,\n" | |
| " ['00133'] = true,\n" | |
| " ['00134'] = true,\n" | |
| " ['00135'] = true,\n" | |
| " ['00136'] = true,\n" | |
| " ['00137'] = true,\n" | |
| " ['00138'] = true,\n" | |
| " ['00139'] = true,\n" | |
| " ['00140'] = true,\n" | |
| " ['00141'] = true,\n" | |
| " ['00142'] = true,\n" | |
| " ['00143'] = true,\n" | |
| " ['00144'] = true,\n" | |
| " ['00145'] = true,\n" | |
| " ['00146'] = true,\n" | |
| " ['00147'] = true,\n" | |
| " ['00148'] = true,\n" | |
| " ['00149'] = true,\n" | |
| " ['00150'] = true,\n" | |
| " ['00151'] = true,\n" | |
| " ['00152'] = true,\n" | |
| " ['00153'] = true,\n" | |
| " ['00154'] = true,\n" | |
| " ['00155'] = true,\n" | |
| " ['00156'] = true,\n" | |
| " ['00157'] = true,\n" | |
| " ['00158'] = true,\n" | |
| " ['00159'] = true,\n" | |
| " ['00160'] = true,\n" | |
| " ['00161'] = true,\n" | |
| " ['00162'] = true,\n" | |
| " ['00163'] = true,\n" | |
| " ['00164'] = true,\n" | |
| " ['00165'] = true,\n" | |
| " ['00166'] = true,\n" | |
| " ['00167'] = true,\n" | |
| " ['00168'] = true,\n" | |
| " ['00169'] = true,\n" | |
| " ['00170'] = true,\n" | |
| " ['00171'] = true,\n" | |
| " ['00172'] = true,\n" | |
| " ['00173'] = true,\n" | |
| " ['00174'] = true,\n" | |
| " ['00175'] = true,\n" | |
| " ['00176'] = true,\n" | |
| " ['00177'] = true,\n" | |
| " ['00178'] = true,\n" | |
| " ['00179'] = true,\n" | |
| " ['00180'] = true,\n" | |
| " ['00181'] = true,\n" | |
| " ['00182'] = true,\n" | |
| " ['00183'] = true,\n" | |
| " ['00184'] = true,\n" | |
| " ['00185'] = true,\n" | |
| " ['00186'] = true,\n" | |
| " ['00187'] = true,\n" | |
| " ['00188'] = true,\n" | |
| " ['00189'] = true,\n" | |
| " ['00190'] = true,\n" | |
| " ['00191'] = true,\n" | |
| " ['00192'] = true,\n" | |
| " ['00193'] = true,\n" | |
| " ['00194'] = true,\n" | |
| " ['00195'] = true,\n" | |
| " ['00196'] = true,\n" | |
| " ['00197'] = true,\n" | |
| " ['00198'] = true,\n" | |
| " ['00199'] = true,\n" | |
| " ['00200'] = true,\n" | |
| " ['00201'] = true,\n" | |
| " ['00202'] = true,\n" | |
| " ['00203'] = true,\n" | |
| " ['00204'] = true,\n" | |
| " ['00205'] = true,\n" | |
| " ['00206'] = true,\n" | |
| " ['00207'] = true,\n" | |
| " ['00208'] = true,\n" | |
| " ['00209'] = true,\n" | |
| " ['00210'] = true,\n" | |
| " ['00211'] = true,\n" | |
| " ['00212'] = true,\n" | |
| " ['00213'] = true,\n" | |
| " ['00214'] = true,\n" | |
| " ['00215'] = true,\n" | |
| " ['00216'] = true,\n" | |
| " ['00217'] = true,\n" | |
| " ['00218'] = true,\n" | |
| " ['00219'] = true,\n" | |
| " ['00220'] = true,\n" | |
| " ['00221'] = true,\n" | |
| " ['00222'] = true,\n" | |
| " ['00223'] = true,\n" | |
| " ['00224'] = true,\n" | |
| " ['00225'] = true,\n" | |
| " ['00226'] = true,\n" | |
| " ['00227'] = true,\n" | |
| " ['00228'] = true,\n" | |
| " ['00229'] = true,\n" | |
| " ['00230'] = true,\n" | |
| " ['00231'] = true,\n" | |
| " ['00232'] = true,\n" | |
| " ['00233'] = true,\n" | |
| " ['00234'] = true,\n" | |
| " ['00235'] = true,\n" | |
| " ['00236'] = true,\n" | |
| " ['00237'] = true,\n" | |
| " ['00238'] = true,\n" | |
| " ['00239'] = true,\n" | |
| " ['00240'] = true,\n" | |
| " ['00241'] = true,\n" | |
| " ['00242'] = true,\n" | |
| " ['00243'] = true,\n" | |
| " ['00244'] = true,\n" | |
| " ['00245'] = true,\n" | |
| " ['00246'] = true,\n" | |
| " ['00247'] = true,\n" | |
| " ['00248'] = true,\n" | |
| " ['00249'] = true,\n" | |
| " ['00250'] = true,\n" | |
| " ['00251'] = true,\n" | |
| " ['00252'] = true,\n" | |
| " ['00253'] = true,\n" | |
| " ['00254'] = true,\n" | |
| " ['00255'] = true,\n" | |
| " ['00256'] = true,\n" | |
| " ['00257'] = true,\n" | |
| " ['00258'] = true,\n" | |
| " ['00259'] = true,\n" | |
| " ['00260'] = true,\n" | |
| " ['00261'] = true,\n" | |
| " ['00262'] = true,\n" | |
| " ['00263'] = true,\n" | |
| " ['00264'] = true,\n" | |
| " ['00265'] = true,\n" | |
| " ['00266'] = true,\n" | |
| " ['00267'] = true,\n" | |
| " ['00268'] = true,\n" | |
| " ['00269'] = true,\n" | |
| " ['00270'] = true,\n" | |
| " ['00271'] = true,\n" | |
| " ['00272'] = true,\n" | |
| " ['00273'] = true,\n" | |
| " ['00274'] = true,\n" | |
| " ['00275'] = true,\n" | |
| " ['00276'] = true,\n" | |
| " ['00277'] = true,\n" | |
| " ['00278'] = true,\n" | |
| " ['00279'] = true,\n" | |
| " ['00280'] = true,\n" | |
| " ['00281'] = true,\n" | |
| " ['00282'] = true,\n" | |
| " ['00283'] = true,\n" | |
| " ['00284'] = true,\n" | |
| " ['00285'] = true,\n" | |
| " ['00286'] = true,\n" | |
| " ['00287'] = true,\n" | |
| " ['00288'] = true,\n" | |
| " ['00289'] = true,\n" | |
| " ['00290'] = true,\n" | |
| " ['00291'] = true,\n" | |
| " ['00292'] = true,\n" | |
| " ['00293'] = true,\n" | |
| " ['00294'] = true,\n" | |
| " ['00295'] = true,\n" | |
| " ['00296'] = true,\n" | |
| " ['00297'] = true,\n" | |
| " ['00298'] = true,\n" | |
| " ['00299'] = true,\n" | |
| " ['00300'] = true,\n" | |
| " ['00301'] = true,\n" | |
| " ['00302'] = true,\n" | |
| " ['00303'] = true,\n" | |
| " ['00304'] = true,\n" | |
| " ['00305'] = true,\n" | |
| " ['00306'] = true,\n" | |
| " ['00307'] = true,\n" | |
| " ['00308'] = true,\n" | |
| " ['00309'] = true,\n" | |
| " ['00310'] = true,\n" | |
| " ['00311'] = true,\n" | |
| " ['00312'] = true,\n" | |
| " ['00313'] = true,\n" | |
| " ['00314'] = true,\n" | |
| " ['00315'] = true,\n" | |
| " ['00316'] = true,\n" | |
| " ['00317'] = true,\n" | |
| " ['00318'] = true,\n" | |
| " ['00319'] = true,\n" | |
| " ['00320'] = true,\n" | |
| " ['00321'] = true,\n" | |
| " ['00322'] = true,\n" | |
| " ['00323'] = true,\n" | |
| " ['00324'] = true,\n" | |
| " ['00325'] = true,\n" | |
| " ['00326'] = true,\n" | |
| " ['00327'] = true,\n" | |
| " ['00328'] = true,\n" | |
| " ['00329'] = true,\n" | |
| " ['00330'] = true,\n" | |
| " ['00331'] = true,\n" | |
| " ['00332'] = true,\n" | |
| " ['00333'] = true,\n" | |
| " ['00334'] = true,\n" | |
| " ['00335'] = true,\n" | |
| " ['00336'] = true,\n" | |
| " ['00337'] = true,\n" | |
| " ['00338'] = true,\n" | |
| " ['00339'] = true,\n" | |
| " ['00340'] = true,\n" | |
| " ['00341'] = true,\n" | |
| " ['00342'] = true,\n" | |
| " ['00343'] = true,\n" | |
| " ['00344'] = true,\n" | |
| " ['00345'] = true,\n" | |
| " ['00346'] = true,\n" | |
| " ['00347'] = true,\n" | |
| " ['00348'] = true,\n" | |
| " ['00349'] = true,\n" | |
| " ['00350'] = true,\n" | |
| " ['00351'] = true,\n" | |
| " ['00352'] = true,\n" | |
| " ['00353'] = true,\n" | |
| " ['00354'] = true,\n" | |
| " ['00355'] = true,\n" | |
| " ['00356'] = true,\n" | |
| " ['00357'] = true,\n" | |
| " ['00358'] = true,\n" | |
| " ['00359'] = true,\n" | |
| " ['00360'] = true,\n" | |
| " ['00361'] = true,\n" | |
| " ['00362'] = true,\n" | |
| " ['00363'] = true,\n" | |
| " ['00364'] = true,\n" | |
| " ['00365'] = true,\n" | |
| " ['00366'] = true,\n" | |
| " ['00367'] = true,\n" | |
| " ['00368'] = true,\n" | |
| " ['00369'] = true,\n" | |
| " ['00370'] = true,\n" | |
| " ['00371'] = true,\n" | |
| " ['00372'] = true,\n" | |
| " ['00373'] = true,\n" | |
| " ['00374'] = true,\n" | |
| " ['00375'] = true,\n" | |
| " ['00376'] = true,\n" | |
| " ['00377'] = true,\n" | |
| " ['00378'] = true,\n" | |
| " ['00379'] = true,\n" | |
| " ['00380'] = true,\n" | |
| " ['00381'] = true,\n" | |
| " ['00382'] = true,\n" | |
| " ['00383'] = true,\n" | |
| " ['00384'] = true,\n" | |
| " ['00385'] = true,\n" | |
| " ['00386'] = true,\n" | |
| " ['00387'] = true,\n" | |
| " ['00388'] = true,\n" | |
| " ['00389'] = true,\n" | |
| " ['00390'] = true,\n" | |
| " ['00391'] = true,\n" | |
| " ['00392'] = true,\n" | |
| " ['00393'] = true,\n" | |
| " ['00394'] = true,\n" | |
| " ['00395'] = true,\n" | |
| " ['00396'] = true,\n" | |
| " ['00397'] = true,\n" | |
| " ['00398'] = true,\n" | |
| " ['00399'] = true,\n" | |
| " ['00400'] = true,\n" | |
| " ['00401'] = true,\n" | |
| " ['00402'] = true,\n" | |
| " ['00403'] = true,\n" | |
| " ['00404'] = true,\n" | |
| " ['00405'] = true,\n" | |
| " ['00406'] = true,\n" | |
| " ['00407'] = true,\n" | |
| " ['00408'] = true,\n" | |
| " ['00409'] = true,\n" | |
| " ['00410'] = true,\n" | |
| " ['00411'] = true,\n" | |
| " ['00412'] = true,\n" | |
| " ['00413'] = true,\n" | |
| " ['00414'] = true,\n" | |
| " ['00415'] = true,\n" | |
| " ['00416'] = true,\n" | |
| " ['00417'] = true,\n" | |
| " ['00418'] = true,\n" | |
| " ['00419'] = true,\n" | |
| " ['00420'] = true,\n" | |
| " ['00421'] = true,\n" | |
| " ['00422'] = true,\n" | |
| " ['00423'] = true,\n" | |
| " ['00424'] = true,\n" | |
| " ['00425'] = true,\n" | |
| " ['00426'] = true,\n" | |
| " ['00427'] = true,\n" | |
| " ['00428'] = true,\n" | |
| " ['00429'] = true,\n" | |
| " ['00430'] = true,\n" | |
| " ['00431'] = true,\n" | |
| " ['00432'] = true,\n" | |
| " ['00433'] = true,\n" | |
| " ['00434'] = true,\n" | |
| " ['00435'] = true,\n" | |
| " ['00436'] = true,\n" | |
| " ['00437'] = true,\n" | |
| " ['00438'] = true,\n" | |
| " ['00439'] = true,\n" | |
| " ['00440'] = true,\n" | |
| " ['00441'] = true,\n" | |
| " ['00442'] = true,\n" | |
| " ['00443'] = true,\n" | |
| " ['00444'] = true,\n" | |
| " ['00445'] = true,\n" | |
| " ['00446'] = true,\n" | |
| " ['00447'] = true,\n" | |
| " ['00448'] = true,\n" | |
| " ['00449'] = true,\n" | |
| " ['00450'] = true,\n" | |
| " ['00451'] = true,\n" | |
| " ['00452'] = true,\n" | |
| " ['00453'] = true,\n" | |
| " ['00454'] = true,\n" | |
| " ['00455'] = true,\n" | |
| " ['00456'] = true,\n" | |
| " ['00457'] = true,\n" | |
| " ['00458'] = true,\n" | |
| " ['00459'] = true,\n" | |
| " ['00460'] = true,\n" | |
| " ['00461'] = true,\n" | |
| " ['00462'] = true,\n" | |
| " ['00463'] = true,\n" | |
| " ['00464'] = true,\n" | |
| " ['00465'] = true,\n" | |
| " ['00466'] = true,\n" | |
| " ['00467'] = true,\n" | |
| " ['00468'] = true,\n" | |
| " ['00469'] = true,\n" | |
| " ['00470'] = true,\n" | |
| " ['00471'] = true,\n" | |
| " ['00472'] = true,\n" | |
| " ['00473'] = true,\n" | |
| " ['00474'] = true,\n" | |
| " ['00475'] = true,\n" | |
| " ['00476'] = true,\n" | |
| " ['00477'] = true,\n" | |
| " ['00478'] = true,\n" | |
| " ['00479'] = true,\n" | |
| " ['00480'] = true,\n" | |
| " ['00481'] = true,\n" | |
| " ['00482'] = true,\n" | |
| " ['00483'] = true,\n" | |
| " ['00484'] = true,\n" | |
| " ['00485'] = true,\n" | |
| " ['00486'] = true,\n" | |
| " ['00487'] = true,\n" | |
| " ['00488'] = true,\n" | |
| " ['00489'] = true,\n" | |
| " ['00490'] = true,\n" | |
| " ['00491'] = true,\n" | |
| " ['00492'] = true,\n" | |
| " ['00493'] = true,\n" | |
| " ['00494'] = true,\n" | |
| " ['00495'] = true,\n" | |
| " ['00496'] = true,\n" | |
| " ['00497'] = true,\n" | |
| " ['00498'] = true,\n" | |
| " ['00499'] = true,\n" | |
| " ['00500'] = true,\n" | |
| " }\n" | |
| "\n" | |
| " return 42\n" | |
| "end"; | |
| static pthread_mutex_t MUTEX = PTHREAD_MUTEX_INITIALIZER; | |
| static lua_State *LUA = NULL; | |
| static int CYCLE = 0; | |
| static void execute() | |
| { | |
| assert(pthread_mutex_lock(&MUTEX) == 0); | |
| if (LUA == NULL) { | |
| LUA = luaL_newstate(); | |
| luaL_openlibs(LUA); | |
| assert(luaL_loadbuffer(LUA, SCRIPT, strlen(SCRIPT), "@script") == 0); | |
| assert(lua_pcall(LUA, 0, 0, 0) == 0); | |
| } | |
| lua_getglobal(LUA, "f_foo"); | |
| assert(lua_isfunction(LUA, -1)); | |
| assert(lua_pcall(LUA, 0, 1, -1) == 0); | |
| lua_pop(LUA, 1); | |
| CYCLE++; | |
| if (CYCLE % 100000 == 0) { | |
| lua_gc(LUA, LUA_GCCOLLECT, 0); | |
| printf("%d> %d KB\n", CYCLE, lua_gc(LUA, LUA_GCCOUNT, 0)); | |
| } | |
| assert(pthread_mutex_unlock(&MUTEX) == 0); | |
| } | |
| static void *loop(void *data) | |
| { | |
| while (1) { | |
| execute(); | |
| usleep(1000000); | |
| } | |
| return NULL; | |
| } | |
| int main() | |
| { | |
| int i; | |
| pthread_t threads[THREADS]; | |
| for (i = 0; i < THREADS; i++) { | |
| assert(pthread_create(&(threads[i]), NULL, loop, NULL) == 0); | |
| } | |
| for (i = 0; i < THREADS; i++) { | |
| assert(pthread_join(threads[i], NULL) == 0); | |
| } | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment