MCPcopy Index your code
hub / github.com/assaultcube/AC / demoworkerthread

Function demoworkerthread

source/src/server.cpp:874–949  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

872sl_semaphore sem_demoworkerthread(1, NULL); // trigger demoworkerthread
873
874int 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

Callers

nothing calls this directly

Calls 15

tlogFunction · 0.85
tigerhash_finishFunction · 0.85
bin2hexFunction · 0.85
ed25519_signFunction · 0.85
lilswapFunction · 0.85
openfileFunction · 0.85
peekMethod · 0.80
fullMethod · 0.80
timedwaitMethod · 0.80
loopiFunction · 0.70
lengthMethod · 0.45
writeMethod · 0.45

Tested by

no test coverage detected