| 872 | sl_semaphore sem_demoworkerthread(1, NULL); // trigger demoworkerthread |
| 873 | |
| 874 | int demoworkerthread(void *logfileprefix) // demo worker thread: compress demo data and write demo files |
| 875 | { |
| 876 | int len; |
| 877 | while(1) |
| 878 | { |
| 879 | loopi(MAXDEMOS) if(demos[i].sequence) |
| 880 | { |
| 881 | demo_s &s = demos[i]; |
| 882 | while(s.gz && s.rb && (len = s.rb->length())) |
| 883 | { // compress until rb is empty |
| 884 | uchar *rbp = s.rb->peek(&len); |
| 885 | if(len != s.gz->write(rbp, len)) s.error = true; |
| 886 | s.rb->remove(&len); |
| 887 | } |
| 888 | if(s.finish && s.gz && s.rb && !s.rb->length()) |
| 889 | { // close and copy zip file |
| 890 | if(demo_debug) tlog(ACLOG_INFO, "demoworkerthread(): close slot %d, sequence #%d", i, s.sequence); |
| 891 | tigerhash_finish(s.tiger, s.tigerstate); |
| 892 | s.tigerstate = NULL; |
| 893 | string msg; |
| 894 | bin2hex(msg, s.tiger, TIGERHASHSIZE); |
| 895 | defformatstring(text)("SERVDEMOEND<%s>", msg); |
| 896 | ed25519_sign((uchar*)msg, NULL, (uchar*)text, strlen(text), ssk); |
| 897 | int stamp[3] = { -1, -1, TIGERHASHSIZE + 64 }; |
| 898 | lilswap(stamp, 3); |
| 899 | s.gz->write(stamp, sizeof(stamp)); |
| 900 | s.gz->write(s.tiger, TIGERHASHSIZE); |
| 901 | s.gz->write(msg, 64); |
| 902 | DELETEP(s.gz); |
| 903 | s.len = s.dbs->size(); |
| 904 | s.data = new uchar[s.len]; |
| 905 | s.dbs->seek(0, SEEK_SET); |
| 906 | s.dbs->read(s.data, s.len); |
| 907 | if(s.save) |
| 908 | { |
| 909 | stream *demo = openfile(s.filename, "wb"); |
| 910 | if(demo) |
| 911 | { |
| 912 | int wlen = (int) demo->write(s.data, s.len); |
| 913 | delete demo; |
| 914 | tlog(ACLOG_INFO, "demo #%d written to file \"%s\" (%d bytes)", s.sequence, s.filename, wlen); |
| 915 | } |
| 916 | else |
| 917 | { |
| 918 | tlog(ACLOG_INFO, "failed to write demo #%d to file \"%s\"", s.sequence, s.filename); |
| 919 | } |
| 920 | } |
| 921 | else tlog(ACLOG_INFO, "recording demo #%d \"%s\" (%d bytes) finished, not saved to file", s.sequence, s.filename, s.len); |
| 922 | s.done = true; |
| 923 | } |
| 924 | if(s.finish || s.error || s.remove) |
| 925 | { // cleanup demo slot |
| 926 | if(demo_debug) tlog(ACLOG_INFO, "demoworkerthread(): cleanup slot %d, sequence #%d", i, s.sequence); |
| 927 | if(s.error || s.remove) s.done = false; |
| 928 | DELETEP(s.gz); |
| 929 | DELETEP(s.dbs); |
| 930 | if(s.db) |
| 931 | { // keep the demo buffer for the next recording |
nothing calls this directly
no test coverage detected