Verlihub / verlihub

Verlihub 1.5.0.0
https://github.com/verlihub/
GNU General Public License v3.0
57 stars 15 forks source link

$Search - string reserve #163

Closed pavel-pimenov closed 5 years ago

pavel-pimenov commented 5 years ago

я в своей ветке добавил логирование

https://github.com/pavel-pimenov/verlihub/blob/ppa-dev/src/cconndc.cpp#L92

емкость строки возрастает до 144

Dec 29 17:38:35 oracle verlihub-debug[1144]: [SearchToAll] Dec 29 17:38:35 oracle verlihub-debug[1144]: send data=[$SP 4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA kramisha][capacity=52 size= 52] addpipe = 1 flush = 0 Dec 29 17:38:35 oracle verlihub-debug[1144]: send data append=[$SP 4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA kramisha|][capacity=104 size= 53] addpipe = 1 flush = 0 Dec 29 17:38:35 oracle verlihub-debug[1144]: send data=[$Search Hub:kramisha F?T?0?9?TTH:4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA][capacity=72 size= 72] addpipe = 1 flush = 0 Dec 29 17:38:35 oracle verlihub-debug[1144]: send data append=[$Search Hub:kramisha F?T?0?9?TTH:4H57CE3JBMFRDE5FFWCHC3Y6GCJAQMSAPZJSDGA|][capacity=144 size= 73] addpipe = 1 flush = 0

т.е. где-то потерялся reserve Cделал тест

include

include

using namespace std;

int main() { // your code goes here string data; data.reserve(81); data = "[$Search 5.167.174.226:50860 F?T?0?9?TTH:IHXPGJ5VK2ILSIQWIKLUCOTIXYTJGFULN27W2II"; printf ("send[1] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); data.append(1, '|'); printf ("send[2] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); }

default

RoLex commented 5 years ago

везде стоит резерв. может быть такое что после "data.erase(len - 1, 1)" меняется capacity()?

pavel-pimenov commented 5 years ago

нет.

default

include

include

using namespace std;

int main() { // your code goes here string data; data.reserve(81); data = "[$Search 5.167.174.226:50860 F?T?0?9?TTH:IHXPGJ5VK2ILSIQWIKLUCOTIXYTJGFULN27W2II"; printf ("send[1] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); data.append(1, '|'); printf ("send[2] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size()); data.erase(data.size() - 1, 1); printf ("send[3] data=[%s]\r\n[capacity=%d size= %d]", data.c_str(), data.capacity(), data.size());

}

pavel-pimenov commented 5 years ago

починил эту проблему. сейчас сделаю PR

pavel-pimenov commented 5 years ago

Dec 30 17:11:47 oracle verlihub-debug[24513]: [1] + reserve +1 send data=[][capacity=0 size= 0] Dec 30 17:11:47 oracle verlihub-debug[24513]: [2] + reserve +1 send data=[][capacity=73 size= 0] Dec 30 17:11:47 oracle verlihub-debug[24513]: [3] + reserve +1 send data=[$Search Hub:z12412342 F?T?0?9?TTH:K7DQBWW6X6ZSIKY4D65K2UDJNPXXRCPE2POGCTQ][capacity=73 size= 73] Dec 30 17:11:47 oracle verlihub-debug[24513]: [SearchToAll] Dec 30 17:11:47 oracle verlihub-debug[24513]: [!] + reserve +1 send data=[$Search Hub:z12412342 F?T?0?9?TTH:K7DQBWW6X6ZSIKY4D65K2UDJNPXXRCPE2POGCTQ][capacity=146 size= 73] addpipe = 1 flush = 0 Dec 30 17:11:47 oracle verlihub-debug[24513]: send data append=[$Search Hub:z12412342 F?T?0?9?TTH:K7DQBWW6X6ZSIKY4D65K2UDJNPXXRCPE2POGCTQ|][capacity=146 size= 74] addpipe = 1 flush = 0

Вот тут ошибка резервирования - не добавляется 1 для pipe

default

pavel-pimenov commented 5 years ago
  1. тут pipe = false

default

а при вызове добавялется

default

где-то ошибка.

предлагаю тупо всегда добавлять +1 к reserve меньше CPU будет жрать на вычислениях условий.

RoLex commented 5 years ago

в Create_Search() - pipe = false, все верно, потому что далее идет вот такой код:

https://github.com/Verlihub/verlihub/blob/master/src/cserverdc.cpp#L871-L875

тут создается копия поискового запроса и заранее резервируется, т.к это сообщение пойдет всем одинаковое. я сделал так чтоб каждый раз перед отправкой новому юзеру не делать резерв.

либо получается что _tths = tths; передает в _tths не только содержимое tths, но и само хранилище для него. может быть такое?

я временно сделаю резерв для пипки для этого места вне зависимости от копии.