vxWorks function call optimization bug
От: Hard_Club  
Дата: 13.07.11 19:03
Оценка:
Есть код:
return prvWrlCpssStatusToLuaPush(status, L, error_message) +
pvrCpssBooleanToLuaPush(status, L, chekingResult) +
pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk) +
pvrCpssStringToLuaPush(status, L, conditionWarningString);

Под Windows и Linux работает правильно, но под vxWorks "pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk)" вызывается перед "pvrCpssBooleanToLuaPush(status, L, chekingResult)".

Решается проблема:


return prvWrlCpssStatusToLuaPush(status, L, error_message) +
pvrCpssBooleanToLuaPush(status, L, chekingResult) +
#ifdef VXWORKS
prvWrlCpssNothingToLuaPush() +
#endif
pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk) +
pvrCpssStringToLuaPush(status, L, conditionWarningString);

prvWrlCpssNothingToLuaPush — пустая функция, возвращает 0.

Что это за проблема. И может есть какое-то более оптимальное решение?
Re: vxWorks function call optimization bug
От: quodum  
Дата: 14.07.11 05:27
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Есть код:

H_C> return prvWrlCpssStatusToLuaPush(status, L, error_message) +
H_C> pvrCpssBooleanToLuaPush(status, L, chekingResult) +
H_C> pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk) +
H_C> pvrCpssStringToLuaPush(status, L, conditionWarningString);

H_C>Под Windows и Linux работает правильно, но под vxWorks "pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk)" вызывается перед "pvrCpssBooleanToLuaPush(status, L, chekingResult)".


Порядок вычисления операндов сложения не определён. Под Windows и Linux это тоже работает только чудом и может сломаться, стоит лишь поменять настройки оптимизации.

H_C>Решается проблема:



H_C> return prvWrlCpssStatusToLuaPush(status, L, error_message) +

H_C> pvrCpssBooleanToLuaPush(status, L, chekingResult) +
H_C>#ifdef VXWORKS
H_C> prvWrlCpssNothingToLuaPush() +
H_C>#endif
H_C> pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk) +
H_C> pvrCpssStringToLuaPush(status, L, conditionWarningString);

H_C>prvWrlCpssNothingToLuaPush — пустая функция, возвращает 0.


Это такое же решение, как битие в бубен для вызова дождя.
Перепишите код с внесением точек следования между вызовами. Например:
    rc =  prvWrlCpssStatusToLuaPush(status, L, error_message);
    rc += pvrCpssBooleanToLuaPush(status, L, chekingResult);
    rc += pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk);
    rc += pvrCpssStringToLuaPush(status, L, conditionWarningString);
    return rc;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.