{"push_id":595126210,"size":20,"distinct_size":20,"ref":"refs/heads/master","head":"fd5ff737d85a59a448f3efcabb029305e7e55c62","before":"a95192dd740a0be3adb0182eebf9910ceb164ecf","commits":[{"sha":"170f26ffd7450bd285181f22bfded7268fce4c74","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Ensure coroutines resumes on socket read readiness on buffer exhaustion\n\nThis patch essentially fixes the pipelining support added with commit\n7f191c9.  It introduces the connection flag CONN_MUST_READ, which\nforces the I/O loop to switch the epoll watch to a \"can read\" status,\nregardless of what kind of events a particular connection is interested\nin at the moment.  This way, if the request buffer is empty, a\ncoroutine will only be resumed if its associated connection is ready to\nbe read from.\n\nThe code in `resume_coro_if_needed()` is still pretty confusing,\nspecially regarding the meaning of the `write_events` variable and\n`CONN_WRITE_EVENTS` flag.  I've been postponing the rewrite of this\npart for a long time, and will eventually do this when I finally\nimplement timers.\n\nAlso, I'm not happy with the memmove() call in `read_request()`. The\nrequest buffer should probably be something else, such as a ring\nbuffer, and if a request is set to be pipelined, epoll should watch for\ninput events as well, and fill this buffer (i.e. the scheduler will\nprobably have to be rewritten, but for a good reason) as soon as data\nis available from the socket.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/170f26ffd7450bd285181f22bfded7268fce4c74"},{"sha":"c2894ddc8d99deb44a6096fba982941743f82a09","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Use `sizeof(http_verb) - 1` in identify_http_method() LUT","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/c2894ddc8d99deb44a6096fba982941743f82a09"},{"sha":"0d2d590c72df396e6fbbdfcc877e5ccc4b35324e","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Reorder `struct lwan_request_parse_t`, grouping by cache line size","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/0d2d590c72df396e6fbbdfcc877e5ccc4b35324e"},{"sha":"0e26537839a20e7c00144041506227f1d1239676","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Store pipelined request terminator\n\nAvoids a second memmem() for each request.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/0e26537839a20e7c00144041506227f1d1239676"},{"sha":"d649716fc029628f5d0d79eeea6153c9edb755bd","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Rename&untypedef lwan_request_parse_t to request_parser_helper.\n\nThis is a private helper structure, there's no need to typedef and\nname-prefix it.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/d649716fc029628f5d0d79eeea6153c9edb755bd"},{"sha":"00b161a19b3634f838e7ada9d4e475511b64880b","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Make get_http_method() a pure function.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/00b161a19b3634f838e7ada9d4e475511b64880b"},{"sha":"d52ca83c86a50ea6710c645b9cf49c7eadc85937","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Clean up tail of lwan_process_request().\n\nAlso adds two important comments.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/d52ca83c86a50ea6710c645b9cf49c7eadc85937"},{"sha":"49347fb647ef39139fb2cf9fe3c5d46e3391ef4e","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Reinitialize the helper using designated initializers\n\nThis is cleaner than saving to local variables, calling memset(),\nand restoring from the local variables. And it generates exact same\ncode, byte by byte, with GCC 4.9.2.\n\nThe \"It'll be back\" comment is gone however.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/49347fb647ef39139fb2cf9fe3c5d46e3391ef4e"},{"sha":"3a94f750ee41f5fce0765f389c92fd750105c4a0","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"When pipelining, store pointer to request method, not terminator\n\nSlightly reduces the number of instructions.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/3a94f750ee41f5fce0765f389c92fd750105c4a0"},{"sha":"fa78cd98bec309c08e780614e6322c5f256549b0","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Be consistent and use a return statement instead of a break","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/fa78cd98bec309c08e780614e6322c5f256549b0"},{"sha":"18363245067162b30c34f603fd13bef890f760d4","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Ensure a response's strbuf is initialized even when pipelining","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/18363245067162b30c34f603fd13bef890f760d4"},{"sha":"534f1edeceefefac4978fdfec98e637ddae291c2","author":{"email":"b152924237595efb42e97dd8a5ba4e6a7add020d@gmail.com","name":"Raphael Javaux"},"message":"Fixes an errornous call to pthread_rwlock_trywrlock instead of\npthread_rwlock_wrlock.\n\nThe lock could be acquired by a concurrent thread during the execution of\ncache_pruner_job.\nIf this happens, the cache will be in an invalid state, with some expired\nentries which will not be present in the LRU queue.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/534f1edeceefefac4978fdfec98e637ddae291c2"},{"sha":"2192606e9709279c4dcb7d411212f720f2ba4b3d","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Ensure lwan_request_t struct is cleaned up after each request\n\nThis is needed when dealing with pipelined stuff.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/2192606e9709279c4dcb7d411212f720f2ba4b3d"},{"sha":"a55c8b65a3e95f46732412b82b5d9e7cd6225d5a","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"No need to reset helper after parsing a request\n\nThe request parser will be called again and this will automatically\nfreshen the state.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/a55c8b65a3e95f46732412b82b5d9e7cd6225d5a"},{"sha":"c7bbcc622ca57edd0e89ee9dbb9e2d02a363a844","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Reduce amount of branching in process_request_coro()\n\nThis moves the \"is request pipelined\" check to process_request_coro(),\nremoving the check for lwan_process_request() return value.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/c7bbcc622ca57edd0e89ee9dbb9e2d02a363a844"},{"sha":"8ce6d060087b32a9b1a98ee834d9860c4ef7b87c","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Fix pipelining after 2192606\n\nNot sure if I really like how this turned out. But now that it's\nworking, I can resume refactoring this until I like it (probably never,\nthough :P).","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/8ce6d060087b32a9b1a98ee834d9860c4ef7b87c"},{"sha":"94d48596f0790ec0e83c7cb81bc269adbc666631","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Remove branch from identify_http_method()\n\nHaven't looked the asm output. Haven't profiled. Committing on\nintuition it's better.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/94d48596f0790ec0e83c7cb81bc269adbc666631"},{"sha":"49607addb31879e2aa2b701317773674662315aa","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Change type of events_by_write_flag[] to uin32_t[] to match epoll_event","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/49607addb31879e2aa2b701317773674662315aa"},{"sha":"a361dae55db1636115ea2481418ec1ed2d9c8638","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Fix possible file descriptor leak in initialize_odd_constant()\n\nIf getrandom() fails, then '/dev/urandom' or '/dev/random' is opened.\nIf reading from these fails fail, the file descriptor was not being\nclosed.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/a361dae55db1636115ea2481418ec1ed2d9c8638"},{"sha":"fd5ff737d85a59a448f3efcabb029305e7e55c62","author":{"email":"cff5713264a23ccefef24b6cefee6f1d9e448c40@hardinfo.org","name":"Leandro Pereira"},"message":"Add pipelined requests test.\n\nJust to ensure this won't get broken again. Due to the lack of\neasy-to-use pipelined HTTP libraries in Python, use a crappy homecooked\nversion that seems to do the job just fine.","distinct":true,"url":"https://api.github.com/repos/damag/lwan/commits/fd5ff737d85a59a448f3efcabb029305e7e55c62"}]}