added HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED
accept the second parameter bitwise-ORed with HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED in hio_svc_marc_querywithbchars. the introduction of this flag results in limiting the highest sid requestable
This commit is contained in:
		@ -245,10 +245,23 @@ int main (int argc, char* argv[])
 | 
			
		||||
		goto oops;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 0, HIO_SVC_MARC_QTYPE_SELECT, "SHOW STATUS", 11, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 0, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM", 11, on_result, HIO_NULL);
 | 
			
		||||
//	hio_svc_marc_querywithbchars (marc, 0, HIO_SVC_MARC_QTYPE_SELECT, "SHOW STATUS", 11, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 0, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM XXX", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_SELECT, "SHOW STATUS", 11, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM", 11, on_result, HIO_NULL);
 | 
			
		||||
//	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_SELECT, "SHOW STATUS", 11, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM XXX", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM ZZZ", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM TTT", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM QQQ", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 4 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 10 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 10 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
	hio_svc_marc_querywithbchars (marc, 10 | HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED, HIO_SVC_MARC_QTYPE_ACTION, "DELETE FROM RRR", 14, on_result, HIO_NULL);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
	memset (&mi, 0, HIO_SIZEOF(mi));
 | 
			
		||||
 | 
			
		||||
@ -175,6 +175,16 @@ enum hio_svc_marc_rcode_t
 | 
			
		||||
};
 | 
			
		||||
typedef enum hio_svc_marc_rcode_t hio_svc_marc_rcode_t;
 | 
			
		||||
 | 
			
		||||
enum hio_svc_marc_sid_flag_t
 | 
			
		||||
{
 | 
			
		||||
	HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED = ((hio_oow_t)1 << (HIO_SIZEOF_OOW_T - 1)),
 | 
			
		||||
	HIO_SVC_MARC_SID_FLAG_RESERVED_1 = ((hio_oow_t)1 << (HIO_SIZEOF_OOW_T - 2)),
 | 
			
		||||
	HIO_SVC_MARC_SID_FLAG_RESERVED_2 = ((hio_oow_t)1 << (HIO_SIZEOF_OOW_T - 3)),
 | 
			
		||||
 | 
			
		||||
	HIO_SVC_MARC_SID_FLAG_ALL = (HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED | HIO_SVC_MARC_SID_FLAG_RESERVED_1 | HIO_SVC_MARC_SID_FLAG_RESERVED_2)
 | 
			
		||||
};
 | 
			
		||||
typedef enum hio_svc_marc_sid_flag_t hio_svc_marc_sid_flag_t;
 | 
			
		||||
 | 
			
		||||
struct hio_svc_marc_dev_error_t
 | 
			
		||||
{
 | 
			
		||||
	int mar_errcode;
 | 
			
		||||
@ -269,7 +279,7 @@ static HIO_INLINE hio_t* hio_svc_marc_gethio(hio_svc_marc_t* svc) { return hio_s
 | 
			
		||||
 | 
			
		||||
HIO_EXPORT int hio_svc_marc_querywithbchars (
 | 
			
		||||
	hio_svc_marc_t*            marc,
 | 
			
		||||
	hio_oow_t                  sid,
 | 
			
		||||
	hio_oow_t                  flagged_sid,
 | 
			
		||||
	hio_svc_marc_qtype_t       qtype,
 | 
			
		||||
	const hio_bch_t*           qptr,
 | 
			
		||||
	hio_oow_t                  qlen,
 | 
			
		||||
 | 
			
		||||
@ -57,6 +57,9 @@ struct hio_svc_marc_t
 | 
			
		||||
		sess_t* ptr;
 | 
			
		||||
		hio_oow_t capa;
 | 
			
		||||
	} sess;
 | 
			
		||||
 | 
			
		||||
	hio_oow_t autoi;
 | 
			
		||||
	hio_oow_t autoi2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct sess_qry_t
 | 
			
		||||
@ -398,11 +401,76 @@ static hio_dev_mar_t* alloc_device (hio_svc_marc_t* marc, hio_oow_t sid)
 | 
			
		||||
 | 
			
		||||
/* ------------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
static sess_t* get_session (hio_svc_marc_t* marc, hio_oow_t sid)
 | 
			
		||||
static sess_t* get_session (hio_svc_marc_t* marc, hio_oow_t flagged_sid)
 | 
			
		||||
{
 | 
			
		||||
	hio_t* hio = marc->hio;
 | 
			
		||||
	hio_oow_t sid;
 | 
			
		||||
	sess_t* sess;
 | 
			
		||||
 | 
			
		||||
	sid = flagged_sid & ~HIO_SVC_MARC_SID_FLAG_ALL;
 | 
			
		||||
 | 
			
		||||
	if ((flagged_sid & HIO_SVC_MARC_SID_FLAG_AUTO_BOUNDED) && marc->sess.capa > 0)
 | 
			
		||||
	{
 | 
			
		||||
		hio_oow_t i, ubound, mbound;
 | 
			
		||||
		hio_oow_t unused = INVALID_SID;
 | 
			
		||||
 | 
			
		||||
		/* automatic sid assignment. sid holds the largest session id that can be assigned */
 | 
			
		||||
		ubound = marc->sess.capa;
 | 
			
		||||
		if (sid < ubound) ubound = sid + 1;
 | 
			
		||||
 | 
			
		||||
		mbound = marc->autoi;
 | 
			
		||||
		if (mbound > ubound) mbound = ubound;
 | 
			
		||||
		for (i = mbound; i < ubound; i++)
 | 
			
		||||
		{
 | 
			
		||||
			sess = &marc->sess.ptr[i];
 | 
			
		||||
			if (sess->dev)
 | 
			
		||||
			{
 | 
			
		||||
				if (!get_first_session_query(sess)) 
 | 
			
		||||
				{
 | 
			
		||||
					marc->autoi = i;
 | 
			
		||||
					sid = marc->autoi;
 | 
			
		||||
					goto got_sid;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else unused = i;
 | 
			
		||||
		}
 | 
			
		||||
		for (i = 0; i < mbound; i++)
 | 
			
		||||
		{
 | 
			
		||||
			sess = &marc->sess.ptr[i];
 | 
			
		||||
			if (sess->dev)
 | 
			
		||||
			{
 | 
			
		||||
				if (!get_first_session_query(sess)) 
 | 
			
		||||
				{
 | 
			
		||||
					marc->autoi = i;
 | 
			
		||||
					sid = marc->autoi;
 | 
			
		||||
					goto got_sid;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else unused = i;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (unused == INVALID_SID)
 | 
			
		||||
		{
 | 
			
		||||
			if (sid >= ubound)
 | 
			
		||||
			{
 | 
			
		||||
				marc->autoi = sid;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* TODO: more optimizations - take the one with the least enqueued queries */
 | 
			
		||||
				marc->autoi2 = (marc->autoi2 + 1) % ubound;
 | 
			
		||||
				marc->autoi = marc->autoi;
 | 
			
		||||
				sid = marc->autoi2;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			marc->autoi = unused;
 | 
			
		||||
			sid = marc->autoi;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
got_sid:
 | 
			
		||||
	if (sid >= marc->sess.capa)
 | 
			
		||||
	{
 | 
			
		||||
		sess_t* tmp;
 | 
			
		||||
@ -412,7 +480,7 @@ static sess_t* get_session (hio_svc_marc_t* marc, hio_oow_t sid)
 | 
			
		||||
		if (newcapa <= sid) newcapa = sid + 1;
 | 
			
		||||
		newcapa = HIO_ALIGN_POW2(newcapa, 16);
 | 
			
		||||
 | 
			
		||||
		tmp = hio_reallocmem(hio, marc->sess.ptr, HIO_SIZEOF(sess_t) * newcapa);
 | 
			
		||||
		tmp = (sess_t*)hio_reallocmem(hio, marc->sess.ptr, HIO_SIZEOF(sess_t) * newcapa);
 | 
			
		||||
		if (HIO_UNLIKELY(!tmp)) return HIO_NULL;
 | 
			
		||||
 | 
			
		||||
		HIO_MEMSET (&tmp[marc->sess.capa], 0, HIO_SIZEOF(sess_t) * (newcapa - marc->sess.capa));
 | 
			
		||||
@ -471,13 +539,13 @@ static sess_t* get_session (hio_svc_marc_t* marc, hio_oow_t sid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int hio_svc_marc_querywithbchars (hio_svc_marc_t* marc, hio_oow_t sid, hio_svc_marc_qtype_t qtype, const hio_bch_t* qptr, hio_oow_t qlen, hio_svc_marc_on_result_t on_result, void* qctx)
 | 
			
		||||
int hio_svc_marc_querywithbchars (hio_svc_marc_t* marc, hio_oow_t flagged_sid, hio_svc_marc_qtype_t qtype, const hio_bch_t* qptr, hio_oow_t qlen, hio_svc_marc_on_result_t on_result, void* qctx)
 | 
			
		||||
{
 | 
			
		||||
	hio_t* hio = marc->hio;
 | 
			
		||||
	sess_t* sess;
 | 
			
		||||
	sess_qry_t* sq;
 | 
			
		||||
 | 
			
		||||
	sess = get_session(marc, sid);
 | 
			
		||||
	sess = get_session(marc, flagged_sid);
 | 
			
		||||
	if (HIO_UNLIKELY(!sess)) return -1;
 | 
			
		||||
 | 
			
		||||
	sq = make_session_query(hio, qtype, qptr, qlen, qctx, on_result);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user