*
*/
-#ifndef POOL_H
-#define POOL_H
+#ifndef SATSOLVER_POOL_H
+#define SATSOLVER_POOL_H
#ifdef __cplusplus
extern "C" {
struct _Repo;
struct _Pool {
- int verbose; // pool is used everywhere, so put the verbose flag here
-
struct _Stringpool ss;
Reldep *rels; // table of rels: Id -> Reldep
* whatprovidesdata[Offset] -> ID_NULL-terminated list of solvables providing Id
*/
Offset *whatprovides; /* Offset to providers of a specific name, Id -> Offset */
+ Offset *whatprovides_rel; /* Offset to providers of a specific relation, Id -> Offset */
+
Id *whatprovidesdata; /* Ids of solvable providing Id */
Offset whatprovidesdataoff; /* next free slot within whatprovidesdata */
int whatprovidesdataleft; /* number of 'free slots' within whatprovidesdata */
char *dep2strbuf[DEP2STRBUF];
int dep2strlen[DEP2STRBUF];
int dep2strn;
+
+ /* debug mask and callback */
+ int debugmask;
+ void (*debugcallback)(struct _Pool *, void *data, int type, const char *str);
+ void *debugcallbackdata;
};
+#define SAT_FATAL (1<<0)
+#define SAT_ERROR (1<<1)
+#define SAT_WARN (1<<2)
+#define SAT_DEBUG_STATS (1<<3)
+#define SAT_DEBUG_RULE_CREATION (1<<4)
+#define SAT_DEBUG_PROPAGATE (1<<5)
+#define SAT_DEBUG_ANALYZE (1<<6)
+#define SAT_DEBUG_UNSOLVABLE (1<<7)
+#define SAT_DEBUG_SOLUTIONS (1<<8)
+#define SAT_DEBUG_POLICY (1<<9)
+#define SAT_DEBUG_RESULT (1<<10)
+#define SAT_DEBUG_JOB (1<<11)
+#define SAT_DEBUG_SCHUBI (1<<12)
+
#define TYPE_ID 1
#define TYPE_IDARRAY 2
#define TYPE_STR 3
#define TYPE_U32 4
-#define TYPE_BITMAP 128
+#define TYPE_REL_IDARRAY 5
//-----------------------------------------------
-// whatprovides
-// "foo" -> Id -> lookup in table, returns offset into whatprovidesdata where array of Ids providing 'foo' are located, 0-terminated
-
-
-#define GET_PROVIDESP(d, v) (ISRELDEP(d) ? \
- (v = GETRELID(pool, d), pool->whatprovides[v] ? \
- pool->whatprovidesdata + pool->whatprovides[v] : \
- pool_addrelproviders(pool, d) \
- ) : \
- (pool->whatprovidesdata + pool->whatprovides[d]))
-
-/* loop over all providers of d */
-#define FOR_PROVIDES(v, vp, d) \
- for (vp = GET_PROVIDESP(d, v) ; (v = *vp++) != ID_NULL; )
/* mark dependencies with relation by setting bit31 */
#define MAKERELDEP(id) ((id) | 0x80000000)
#define ISRELDEP(id) (((id) & 0x80000000) != 0)
-#define GETRELID(pool, id) ((pool)->ss.nstrings + ((id) ^ 0x80000000)) /* returns Id */
+#define GETRELID(id) ((id) ^ 0x80000000) /* returns Id */
#define GETRELDEP(pool, id) ((pool)->rels + ((id) ^ 0x80000000)) /* returns Reldep* */
#define REL_GT 1
#define REL_WITH 18
#define REL_NAMESPACE 19
+#if !defined(__GNUC__) && !defined(__attribute__)
+# define __attribute__(x)
+#endif
+
/**
* Creates a new pool
*/
*/
extern void pool_free(Pool *pool);
+extern void pool_debug(Pool *pool, int type, const char *format, ...) __attribute__((format(printf, 3, 4)));
+
/**
* Solvable management
*/
{
return pool->solvables + p;
}
+extern const char *solvable2str(Pool *pool, Solvable *s);
/**
* Prepares a pool for solving
*/
-extern void pool_prepare(Pool *pool);
+extern void pool_createwhatprovides(Pool *pool);
extern void pool_freewhatprovides(Pool *pool);
extern Id pool_queuetowhatprovides(Pool *pool, Queue *q);
-extern Id *pool_addrelproviders(Pool *pool, Id d);
-
static inline int pool_installable(Pool *pool, Solvable *s)
{
if (!s->arch || s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
return 1;
}
+extern Id *pool_addrelproviders(Pool *pool, Id d);
+
+static inline Id *pool_whatprovides(Pool *pool, Id d)
+{
+ Id v;
+ if (!ISRELDEP(d))
+ return pool->whatprovidesdata + pool->whatprovides[d];
+ v = GETRELID(d);
+ if (pool->whatprovides_rel[v])
+ return pool->whatprovidesdata + pool->whatprovides_rel[v];
+ return pool_addrelproviders(pool, d);
+}
+
+extern void pool_setdebuglevel(Pool *pool, int level);
+
+static inline void pool_setdebugcallback(Pool *pool, void (*debugcallback)(struct _Pool *, void *data, int type, const char *str), void *debugcallbackdata)
+{
+ pool->debugcallback = debugcallback;
+ pool->debugcallbackdata = debugcallbackdata;
+}
+
+static inline void pool_setdebugmask(Pool *pool, int mask)
+{
+ pool->debugmask = mask;
+}
+
+/* loop over all providers of d */
+#define FOR_PROVIDES(v, vp, d) \
+ for (vp = pool_whatprovides(pool, d) ; (v = *vp++) != 0; )
+
+#define POOL_DEBUG(type, ...) do {if ((pool->debugmask & (type)) != 0) pool_debug(pool, (type), __VA_ARGS__);} while (0)
+#define IF_POOLDEBUG(type) if ((pool->debugmask & (type)) != 0)
+
#ifdef __cplusplus
}
#endif
-#endif /* POOL_H */
+
+#endif /* SATSOLVER_POOL_H */