|
|
@@ -10,20 +10,31 @@ struct future {
|
|
|
void *env;
|
|
|
};
|
|
|
|
|
|
-void *future_poll(struct future *p, void *data);
|
|
|
+enum future_err_code {
|
|
|
+ FUTURE_ERR_OK,
|
|
|
+ FUTURE_ERR_MISSING_FUNC
|
|
|
+};
|
|
|
+
|
|
|
+struct future_err {
|
|
|
+ enum future_err_code code;
|
|
|
+ const char *name;
|
|
|
+};
|
|
|
+
|
|
|
+void *future_poll(struct future *p, void *data, struct future_err *err);
|
|
|
+
|
|
|
+void _future_err_set(struct future_err *err, enum future_err_code code);
|
|
|
|
|
|
#if defined(IMP) || defined(POLLABLE_IMP)
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
void *
|
|
|
-future_poll(struct future *p, void *data)
|
|
|
+future_poll(struct future *p, void *data, struct future_err *err)
|
|
|
{
|
|
|
+ void *res = p->f(p->env, data);
|
|
|
if ( p->then != NULL ) {
|
|
|
- void *res = p->f(p->env, data);
|
|
|
-
|
|
|
if ( res == NULL ) {
|
|
|
- return NULL;
|
|
|
+ goto exit_ok;
|
|
|
}
|
|
|
|
|
|
{
|
|
|
@@ -34,15 +45,34 @@ future_poll(struct future *p, void *data)
|
|
|
p->then = new_ftr.then;
|
|
|
}
|
|
|
|
|
|
- return NULL;
|
|
|
+ res = NULL;
|
|
|
+ goto exit_ok;
|
|
|
}
|
|
|
|
|
|
if ( p->f == NULL ) {
|
|
|
- /* TODO: Raire ERR */
|
|
|
+ _future_err_set(err, FUTURE_ERR_MISSING_FUNC);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
- return p->f(p->env, data);
|
|
|
+exit_ok:
|
|
|
+ _future_err_set(err, FUTURE_ERR_OK);
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+_future_err_set(struct future_err *err, enum future_err_code code)
|
|
|
+{
|
|
|
+ if ( err == NULL ) {
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ err->code = code;
|
|
|
+ switch ( code ) {
|
|
|
+#define _FUTURE_ERR_SET_CASE(c) case c: err->name = #c; break
|
|
|
+ _FUTURE_ERR_SET_CASE(FUTURE_ERR_OK);
|
|
|
+ _FUTURE_ERR_SET_CASE(FUTURE_ERR_MISSING_FUNC);
|
|
|
+#undef _FUTURE_ERR_SET_CASE
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
#endif /* defined(IMP) || defined(POLLABLE_IMP) */
|