00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "engine.h"
00022 #include "engine_internals.h"
00023
00024 OSyncFlag *osync_flag_new(OSyncFlag *parent)
00025 {
00026 OSyncFlag *flag = g_malloc0(sizeof(OSyncFlag));
00027 flag->is_set = FALSE;
00028 if (parent) {
00029 flag->comb_flag = parent;
00030 parent->num_not_set++;
00031 osync_flag_calculate_comb(parent);
00032 }
00033 return flag;
00034 }
00035
00036 void osync_flag_free(OSyncFlag *flag)
00037 {
00038 g_free(flag);
00039 }
00040
00041 OSyncFlag *osync_comb_flag_new(osync_bool any, osync_bool default_val)
00042 {
00043 OSyncFlag *flag = osync_flag_new(NULL);
00044 flag->is_comb = TRUE;
00045 flag->is_any = any;
00046 flag->default_val = default_val;
00047 flag->is_set = default_val;
00048 return flag;
00049 }
00050
00051 void osync_flag_attach(OSyncFlag *flag, OSyncFlag *target)
00052 {
00053 if (flag->comb_flag)
00054 return;
00055 g_assert(target->is_comb);
00056 flag->comb_flag = target;
00057 if (flag->is_set) {
00058 target->num_set++;
00059 } else {
00060 target->num_not_set++;
00061 }
00062 osync_flag_calculate_comb(target);
00063 }
00064
00065 osync_bool osync_flag_is_attached(OSyncFlag *flag)
00066 {
00067 if (flag->comb_flag)
00068 return TRUE;
00069 return FALSE;
00070 }
00071
00072 void osync_flag_detach(OSyncFlag *flag)
00073 {
00074 OSyncFlag *target = flag->comb_flag;
00075 if (!target)
00076 return;
00077 if (flag->is_set) {
00078 target->num_set--;
00079 } else {
00080 target->num_not_set--;
00081 }
00082 flag->comb_flag = NULL;
00083 osync_flag_calculate_comb(target);
00084 }
00085
00086 void osync_flag_set_pos_trigger(OSyncFlag *flag, OSyncFlagTriggerFunc func, void *data1, void *data2)
00087 {
00088 flag->pos_trigger_func = func;
00089 flag->pos_user_data1 = data1;
00090 flag->pos_user_data2 = data2;
00091 }
00092
00093 void osync_flag_set_neg_trigger(OSyncFlag *flag, OSyncFlagTriggerFunc func, void *data1, void *data2)
00094 {
00095 flag->neg_trigger_func = func;
00096 flag->neg_user_data1 = data1;
00097 flag->neg_user_data2 = data2;
00098 }
00099
00100 void osync_flag_calculate_comb(OSyncFlag *flag)
00101 {
00102 if (!flag->is_comb)
00103 return;
00104
00105 if (!flag->num_not_set && !flag->num_set) {
00106 if (flag->default_val)
00107 osync_flag_set(flag);
00108 else
00109 osync_flag_unset(flag);
00110 return;
00111 }
00112
00113 if (!flag->is_any) {
00114 if (!flag->num_not_set && flag->num_set) {
00115 osync_flag_set(flag);
00116 } else {
00117 osync_flag_unset(flag);
00118 }
00119 } else {
00120 if (flag->num_set) {
00121 osync_flag_set(flag);
00122 } else {
00123 osync_flag_unset(flag);
00124 }
00125 }
00126 }
00127
00128 osync_bool osync_flag_is_set(OSyncFlag *flag)
00129 {
00130 if (flag->is_set == TRUE && flag->is_changing == FALSE)
00131 return TRUE;
00132 return FALSE;
00133 }
00134
00135 osync_bool osync_flag_is_not_set(OSyncFlag *flag)
00136 {
00137 if (flag->is_set == FALSE && flag->is_changing == FALSE)
00138 return TRUE;
00139 return FALSE;
00140 }
00141
00142 void osync_comb_flag_update(OSyncFlag *combflag, OSyncFlag *flag, osync_bool prev_state)
00143 {
00144 if (prev_state == flag->is_set)
00145 return;
00146 if (flag->is_set) {
00147 combflag->num_not_set--;
00148 combflag->num_set++;
00149 } else {
00150 combflag->num_not_set++;
00151 combflag->num_set--;
00152 }
00153 }
00154
00155 void osync_flag_changing(OSyncFlag *flag)
00156 {
00157 flag->is_changing = TRUE;
00158 }
00159
00160 void osync_flag_cancel(OSyncFlag *flag)
00161 {
00162 flag->is_changing = FALSE;
00163 }
00164
00165 void osync_flag_unset(OSyncFlag *flag)
00166 {
00167 osync_bool oldstate = flag->is_set;
00168 flag->is_set = FALSE;
00169 flag->is_changing = FALSE;
00170 osync_flag_calc_trigger(flag, oldstate);
00171 if (flag->comb_flag) {
00172 osync_comb_flag_update(flag->comb_flag, flag, oldstate);
00173 osync_flag_calculate_comb(flag->comb_flag);
00174 }
00175 }
00176
00177 void osync_flag_set(OSyncFlag *flag)
00178 {
00179 osync_bool oldstate = flag->is_set;
00180 flag->is_set = TRUE;
00181 flag->is_changing = FALSE;
00182 osync_flag_calc_trigger(flag, oldstate);
00183 if (flag->comb_flag) {
00184 osync_comb_flag_update(flag->comb_flag, flag, oldstate);
00185 osync_flag_calculate_comb(flag->comb_flag);
00186 }
00187 }
00188
00189 void osync_flag_set_state(OSyncFlag *flag, osync_bool state)
00190 {
00191 osync_bool oldstate = flag->is_set;
00192 flag->is_set = state;
00193 flag->is_changing = FALSE;
00194 if (flag->comb_flag) {
00195 osync_comb_flag_update(flag->comb_flag, flag, oldstate);
00196 }
00197 if (flag->is_comb) {
00198
00199
00200 }
00201 }
00202
00203 osync_bool osync_flag_get_state(OSyncFlag *flag)
00204 {
00205 return flag->is_set;
00206 }
00207
00208 void osync_flag_calc_trigger(OSyncFlag *flag, osync_bool oldstate)
00209 {
00210 if (flag->is_set != oldstate) {
00211 if (flag->is_set == TRUE) {
00212 if (flag->pos_trigger_func) {
00213 flag->pos_trigger_func(flag->pos_user_data1, flag->pos_user_data2);
00214 }
00215 } else {
00216 if (flag->neg_trigger_func) {
00217 flag->neg_trigger_func(flag->neg_user_data1, flag->neg_user_data2);
00218 }
00219 }
00220 }
00221 }