frees any versions from list that have been applied by all processes */
| 938 | all processes |
| 939 | */ |
| 940 | static void cleanup_rtpengine_versions(void) |
| 941 | { |
| 942 | int i, min_version=0; |
| 943 | struct rtpe_version *crt_version, *prev_version; |
| 944 | |
| 945 | if (*rtpe_versions == NULL || (*rtpe_versions)->version_count == 0) |
| 946 | return; // nothing to do |
| 947 | |
| 948 | for (i=0; i<*child_versions_no; i++) { |
| 949 | if (!min_version || child_versions[i] < min_version) |
| 950 | min_version = child_versions[i]; |
| 951 | } |
| 952 | |
| 953 | for (crt_version = (*rtpe_versions)->version_first; crt_version != NULL;) { |
| 954 | if (crt_version->version >= min_version) |
| 955 | break; |
| 956 | prev_version = crt_version; |
| 957 | crt_version = prev_version->version_next; |
| 958 | |
| 959 | /* first version remove */ |
| 960 | if ((*rtpe_versions)->version_first == prev_version) |
| 961 | (*rtpe_versions)->version_first = crt_version; |
| 962 | |
| 963 | /* last version remove */ |
| 964 | if ((*rtpe_versions)->version_last == prev_version) |
| 965 | (*rtpe_versions)->version_last = NULL; |
| 966 | |
| 967 | shm_free(prev_version); |
| 968 | (*rtpe_versions)->version_count--; |
| 969 | } |
| 970 | |
| 971 | return; |
| 972 | } |
| 973 | |
| 974 | /* increments version and adds version to end of list */ |
| 975 | static int add_rtpengine_version(int flags) |
no test coverage detected