Hello, On Mon, Apr 18, 2016 at 02:55:27PM +0000, Wang Nan wrote: > Use 'trigger' to model operations which need to be executed when > an event (a signal, for example) is observed. > > States and transits: > > OFF--(on)--> READY --(toggle)--> TOGGLED > ^ | > | (ready) > | | > \__________________/ > > is_toggled and is_ready are two key functions to query the state of > a trigger. is_toggled means the event already happen; is_ready means the > trigger is waiting for the event.
Not sure 'toggle' is the right word in this case. Maybe 'set/reset' or 'ready/hit' can be used, if each operation is one-way. But this is not a big deal anyway. Btw why not split this patch into two parts - introducing trigger logic and replacing snapshot code with the trigger? > > Signed-off-by: Wang Nan <[email protected]> > Cc: Adrian Hunter <[email protected]> > Cc: He Kuang <[email protected]> > Cc: Jiri Olsa <[email protected]> > Cc: Masami Hiramatsu <[email protected]> > Cc: Namhyung Kim <[email protected]> > Cc: Zefan Li <[email protected]> > Cc: [email protected] > --- [SNIP] > +#define __TRIGGER_VAR(n) n##_state > +#define __DEF_TRIGGER_VOID_FUNC(n, op) \ > +static inline void n##_##op(void) {trigger_##op(&__TRIGGER_VAR(n)); } > +#define __DEF_TRIGGER_BOOL_FUNC(n, op) \ > +static inline bool n##_##op(void) {return trigger_##op(&__TRIGGER_VAR(n)); } > + > +#define DEFINE_TRIGGER(n) \ > +struct trigger n##_state = {.state = TRIGGER_OFF, .name = #n}; \ > +__DEF_TRIGGER_VOID_FUNC(n, on) \ > +__DEF_TRIGGER_VOID_FUNC(n, ready) \ > +__DEF_TRIGGER_VOID_FUNC(n, toggle) \ > +__DEF_TRIGGER_VOID_FUNC(n, off) \ > +__DEF_TRIGGER_VOID_FUNC(n, error) \ > +__DEF_TRIGGER_BOOL_FUNC(n, is_ready) \ > +__DEF_TRIGGER_BOOL_FUNC(n, is_toggled) \ > +__DEF_TRIGGER_BOOL_FUNC(n, is_error) Why did you define all functions for each trigger variable? Wouldn't it be better using generic trigger code and passing the trigger instead? Thanks, Namhyung

