The attached patch should address this issue. The patch is essentially this
commit af73e397da01a4f70c01387f284e87262e42e7a3
Author: Dave Love <[email protected]>
Date: Thu Apr 21 12:44:36 2011 +0000
Introduce lUlong64 to fix wrong vmem reporting on 64-bit GNU/Linux
(from Univa)
from http://arc.liv.ac.uk/repos/git/sge
combined with a minor change for backporting to 6.2u5-7.1
--- a/gridengine_add64bit_support.patch 2013-06-05 14:24:17.415377163 +0200
+++ b/gridengine_add64bit_support.patch 2013-06-05 15:15:59.137610718 +0200
@@ -366,7 +366,7 @@
+ if (pos < 0) {
+ /* someone has called lGetPosUlong64() */
+ /* makro with an invalid nm */
-+ CRITICAL((SGE_EVENT, SFNMAX,
MSG_CULL_GETPOSULONG64_GOTINVALIDPOSITION ));
++ CRITICAL((SGE_EVENT, MSG_CULL_GETPOSULONG64_GOTINVALIDPOSITION ));
+ DEXIT;
+ abort();
+ }
I've tested the patch using this procedure:
On wheezy machine, I downloaded the source package of gridengine 6.2u5-7.1
apt-get -b source gridengine
Then applied the attached patch to the extracted source, and rebuild the
package in the following way:
dpkg-buildpackage -rfakeroot -uc -b
and it builds cleanly and can be installed.
diff --git a/source/common/basis_types.h b/source/common/basis_types.h
index aa4fb28..12d21f3 100644
--- a/source/common/basis_types.h
+++ b/source/common/basis_types.h
@@ -30,6 +30,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <sys/types.h>
@@ -122,17 +123,29 @@ extern "C" {
# define u_long32 u_long
#endif
+#if defined(TARGET_64BIT)
+# define u_long64 u_long
+#elif defined(WIN32NATIVE)
+# define u_long64 unsigned long long
+#elif defined(FREEBSD) || defined(NETBSD)
+# define u_long64 uint64_t
+#else
+# define u_long64 unsigned long long
+#endif
+
#define U_LONG32_MAX 4294967295UL
#define LONG32_MAX 2147483647
/* set sge_u32 and sge_x32 for 64 or 32 bit machines */
/* sge_uu32 for strictly unsigned, not nice, but did I use %d for an unsigned? */
#if defined(TARGET_64BIT) || defined(FREEBSD) || defined(NETBSD)
+# define sge_u64 "%ld"
# define sge_u32 "%d"
# define sge_uu32 "%u"
# define sge_x32 "%x"
# define sge_fu32 "d"
#else
+# define sge_u64 "%lld"
# define sge_u32 "%ld"
# define sge_uu32 "%lu"
# define sge_x32 "%lx"
diff --git a/source/daemons/common/procfs.c b/source/daemons/common/procfs.c
index f78513a..6882ca5 100644
--- a/source/daemons/common/procfs.c
+++ b/source/daemons/common/procfs.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#if !defined(COMPILE_DC)
@@ -554,7 +555,7 @@ time_t last_time
lSetPosUlong(pr, pos_utime, utime);
lSetPosUlong(pr, pos_stime, stime);
- lSetPosUlong(pr, pos_vsize, vsize);
+ lSetPosUlong64(pr, pos_vsize, vsize);
close(fd);
}
@@ -770,7 +771,7 @@ time_t last_time
proc_elem->proc.pd_stime = ((double)lGetPosUlong(pr, pos_stime)) /
sysconf(_SC_CLK_TCK);
/* could retrieve uid/gid using stat() on stat file */
- proc_elem->vmem = lGetPosUlong(pr, pos_vsize);
+ proc_elem->vmem = lGetPosUlong64(pr, pos_vsize);
/*
* I/O accounting
diff --git a/source/libs/cull/cull_db.c b/source/libs/cull/cull_db.c
index f848902..4bbd6b2 100644
--- a/source/libs/cull/cull_db.c
+++ b/source/libs/cull/cull_db.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
#include <stdlib.h>
@@ -383,6 +384,9 @@ lList *lJoin(const char *name, int nm0, const lList *lp0,
case lUlongT:
needed = (ep0->cont[lp0_pos].ul == ep1->cont[lp1_pos].ul);
break;
+ case lUlong64T:
+ needed = (ep0->cont[lp0_pos].ul64 == ep1->cont[lp1_pos].ul64);
+ break;
case lStringT:
needed = !strcmp(ep0->cont[lp0_pos].str, ep1->cont[lp1_pos].str);
break;
diff --git a/source/libs/cull/cull_dump_scan.c b/source/libs/cull/cull_dump_scan.c
index 95472bb..2df8af7 100644
--- a/source/libs/cull/cull_dump_scan.c
+++ b/source/libs/cull/cull_dump_scan.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
#include <stdlib.h>
@@ -63,6 +64,7 @@ static int fGetKet(FILE *fp);
static int fGetDescr(FILE *fp, lDescr *dp);
static int fGetInt(FILE *fp, lInt *value);
static int fGetUlong(FILE *fp, lUlong *value);
+static int fGetUlong64(FILE *fp, lUlong64 *value);
static int fGetString(FILE *fp, lString *value);
static int fGetHost(FILE *fp, lHost *value);
static int fGetFloat(FILE *fp, lFloat *value);
@@ -310,6 +312,10 @@ int lDumpElemFp(FILE *fp, const lListElem *ep, int indent)
ret = fprintf(fp, "%s/* %-20.20s */ " sge_u32 "\n",
space, lNm2Str(ep->descr[i].nm), lGetPosUlong(ep, i));
break;
+ case lUlong64T:
+ ret = fprintf(fp, "%s/* %-20.20s */ " sge_u64 "\n",
+ space, lNm2Str(ep->descr[i].nm), lGetPosUlong64(ep, i));
+ break;
case lStringT:
str = lGetPosString(ep, i);
/* quote " inside str */
@@ -608,6 +614,9 @@ lListElem *lUndumpElemFp(FILE *fp, const lDescr *dp)
case lUlongT:
ret = fGetUlong(fp, &(ep->cont[i].ul));
break;
+ case lUlong64T:
+ ret = fGetUlong64(fp, &(ep->cont[i].ul64));
+ break;
case lStringT:
ret = fGetString(fp, &str);
if (ret == 0) {
@@ -1108,6 +1117,34 @@ static int fGetUlong(FILE *fp, lUlong *up)
return 0;
}
+static int fGetUlong64(FILE *fp, lUlong64 *up)
+{
+ char s[READ_LINE_LENGHT + 1];
+
+ DENTER(CULL_LAYER, "fGetUlong64");
+
+ if (!fp) {
+ LERROR(LEFILENULL);
+ DEXIT;
+ return -1;
+ }
+
+ if (fGetLine(fp, s, READ_LINE_LENGHT)) {
+ LERROR(LEFGETLINE);
+ DEXIT;
+ return -1;
+ }
+
+ if (sscanf(s, sge_u64, up) != 1) {
+ LERROR(LESSCANF);
+ DEXIT;
+ return -1;
+ }
+
+ DEXIT;
+ return 0;
+}
+
static int fGetString(FILE *fp, lString *tp)
{
int i, j;
diff --git a/source/libs/cull/cull_hash.c b/source/libs/cull/cull_hash.c
index b435f1e..d5d2d67 100644
--- a/source/libs/cull/cull_hash.c
+++ b/source/libs/cull/cull_hash.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
@@ -198,6 +199,10 @@ cull_htable cull_hash_create(const lDescr *descr, int size)
ht = sge_htable_create(size, dup_func_u_long32,
hash_func_u_long32, hash_compare_u_long32);
break;
+ case lUlong64T:
+ ht = sge_htable_create(size, dup_func_u_long64,
+ hash_func_u_long64, hash_compare_u_long64);
+ break;
default:
unknownType("cull_create_hash");
ht = NULL;
@@ -804,6 +809,10 @@ void *cull_hash_key(const lListElem *ep, int pos, char *host_key)
key = (void *)&(ep->cont[pos].ul);
break;
+ case lUlong64T:
+ key = (void *)&(ep->cont[pos].ul64);
+ break;
+
case lStringT:
key = ep->cont[pos].str;
break;
diff --git a/source/libs/cull/cull_list.c b/source/libs/cull/cull_list.c
index 94f95cc..c0afcd5 100644
--- a/source/libs/cull/cull_list.c
+++ b/source/libs/cull/cull_list.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
@@ -371,6 +372,9 @@ lCopySwitchPack(const lListElem *sep, lListElem *dep, int src_idx, int dst_idx,
case lUlongT:
dep->cont[dst_idx].ul = sep->cont[src_idx].ul;
break;
+ case lUlong64T:
+ dep->cont[dst_idx].ul64 = sep->cont[src_idx].ul64;
+ break;
case lStringT:
if (!sep->cont[src_idx].str)
dep->cont[dst_idx].str = NULL;
@@ -717,6 +721,9 @@ static void lWriteElem_(const lListElem *ep, dstring *buffer, int nesting_level)
case lUlongT:
sge_dstring_sprintf_append(buffer, "%s%-20.20s (Ulong) %c = " sge_u32"\n", space, name, changed ? '*' : ' ', lGetPosUlong(ep, i));
break;
+ case lUlong64T:
+ sge_dstring_sprintf_append(buffer, "%s%-20.20s (Ulong64) %c = " sge_u64"\n", space, name, changed ? '*' : ' ', lGetPosUlong64(ep, i));
+ break;
case lStringT:
str = lGetPosString(ep, i);
sge_dstring_sprintf_append(buffer, "%s%-20.20s (String) %c = %s\n", space, name, changed ? '*' : ' ', str ? str : "(null)");
@@ -1129,6 +1136,7 @@ void lFreeElem(lListElem **ep1)
case lIntT:
case lUlongT:
+ case lUlong64T:
case lFloatT:
case lDoubleT:
case lLongT:
diff --git a/source/libs/cull/cull_list.h b/source/libs/cull/cull_list.h
index f9eaba0..fa075a6 100644
--- a/source/libs/cull/cull_list.h
+++ b/source/libs/cull/cull_list.h
@@ -33,6 +33,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
@@ -62,6 +63,7 @@ typedef struct _WhereArg WhereArg, *WhereArgList;
typedef float lFloat;
typedef double lDouble;
typedef u_long32 lUlong;
+typedef u_long64 lUlong64;
typedef long lLong;
typedef char lChar;
typedef char lBool;
@@ -77,6 +79,7 @@ enum _enum_lMultiType {
lFloatT,
lDoubleT,
lUlongT,
+ lUlong64T,
lLongT,
lCharT,
lBoolT,
@@ -135,6 +138,7 @@ enum _enum_lMultiType {
#define SGE_CHAR(name,flags) { name, lCharT | flags, NULL },
#define SGE_LONG(name,flags) { name, lLongT | flags, NULL },
#define SGE_ULONG(name,flags) { name, lUlongT | flags, NULL },
+#define SGE_ULONG64(name,flags) { name, lUlong64T | flags, NULL },
#define SGE_BOOL(name,flags) { name, lBoolT | flags, NULL },
#define SGE_LIST(name,type,flags) { name, lListT | flags, NULL },
#define SGE_MAP(name,type,flags) { name, lListT | flags, NULL },
@@ -153,6 +157,7 @@ enum _enum_lMultiType {
#define SGE_CHAR_D(name,flags,def) { name, lCharT | flags, NULL },
#define SGE_LONG_D(name,flags,def) { name, lLongT | flags, NULL },
#define SGE_ULONG_D(name,flags,def) { name, lUlongT | flags, NULL },
+#define SGE_ULONG64_D(name,flags,def) { name, lUlong64T | flags, NULL },
#define SGE_BOOL_D(name,flags,def) { name, lBoolT | flags, NULL },
#define SGE_LIST_D(name,type,flags,def) { name, lListT | flags, NULL },
#define SGE_MAP_D(name,type,flags,defkey,keyvalue,jgdi_keyname,jgdi_valuename) { name, lListT | flags, NULL},
@@ -191,6 +196,7 @@ enum _enum_lMultiType {
#define SGE_CHAR(name,flags)
#define SGE_LONG(name,flags)
#define SGE_ULONG(name,flags)
+#define SGE_ULONG64(name,flags)
#define SGE_BOOL(name,flags)
#define SGE_LIST(name,type,flags) __SUBTYPE_MAPPING__ name type
#define SGE_MAP(name,type,flags) __SUBTYPE_MAPPING__ name type
@@ -205,6 +211,7 @@ enum _enum_lMultiType {
#define SGE_DOUBLE_D(name,flags,def)
#define SGE_CHAR_D(name,flags,def)
#define SGE_LONG_D(name,flags,def)
+#define SGE_LONG64_D(name,flags,def)
#define SGE_ULONG_D(name,flags,def)
#define SGE_BOOL_D(name,flags,def)
#define SGE_LIST_D(name,type,flags,def)
@@ -233,6 +240,7 @@ enum _enum_lMultiType {
#define SGE_CHAR(name,flags)
#define SGE_LONG(name,flags)
#define SGE_ULONG(name,flags)
+#define SGE_ULONG64(name,flags)
#define SGE_BOOL(name,flags)
#define SGE_LIST(name,type,flags)
#define SGE_MAP(name,type,flags)
@@ -248,6 +256,7 @@ enum _enum_lMultiType {
#define SGE_CHAR_D(name,flags,def)
#define SGE_LONG_D(name,flags,def)
#define SGE_ULONG_D(name,flags,def)
+#define SGE_ULONG64_D(name,flags,def)
#define SGE_BOOL_D(name,flags,def)
#define SGE_LIST_D(name,type,flags,def)
#define SGE_MAP_D(name,type,flags,defkey,keyvalue,jgdi_keyname,jgdi_valuename)
diff --git a/source/libs/cull/cull_multitype.c b/source/libs/cull/cull_multitype.c
index e9583b9..a26eb6a 100644
--- a/source/libs/cull/cull_multitype.c
+++ b/source/libs/cull/cull_multitype.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdarg.h>
#include <stdio.h>
@@ -65,6 +66,7 @@ const char *multitypes[] =
"lFloatT",
"lDoubleT",
"lUlongT",
+ "lUlong64T",
"lLongT",
"lCharT",
"lBoolT",
@@ -795,6 +797,75 @@ lUlong lGetUlong(const lListElem *ep, int name)
return (lUlong) ep->cont[pos].ul;
}
+/****** cull/multitype/lGetPosUlong64() **************************************
+* NAME
+* lGetPosUlong64() -- Returns the ulong64 value at position pos
+*
+* SYNOPSIS
+* lUlong64 lGetPosUlong64(const lListElem *ep, int pos)
+*
+* FUNCTION
+* Returns the ulong64 value at position pos
+*
+* INPUTS
+* const lListElem *ep - element
+* int pos - pos value
+*
+* RESULT
+* lUlong64 - ulong64
+******************************************************************************/
+lUlong64 lGetPosUlong64(const lListElem *ep, int pos)
+{
+ DENTER(CULL_BASIS_LAYER, "lGetPosUlong64");
+
+ if (pos < 0) {
+ /* someone has called lGetPosUlong64() */
+ /* makro with an invalid nm */
+ CRITICAL((SGE_EVENT, MSG_CULL_GETPOSULONG64_GOTINVALIDPOSITION ));
+ DEXIT;
+ abort();
+ }
+
+ if (mt_get_type(ep->descr[pos].mt) != lUlong64T)
+ incompatibleType("lGetPosUlong64");
+ DEXIT;
+ return (lUlong64) ep->cont[pos].ul64;
+}
+
+/****** cull/multitype/lGetUlong64() ******************************************
+* NAME
+* lGetUlong64() -- Return 'u_long64' value for specified fieldname
+*
+* SYNOPSIS
+* lUlong64 lGetUlong64(const lListElem *ep, int name)
+*
+* FUNCTION
+* Return the content of the field specified by fieldname 'name' of
+* list element 'ep'. The type of the field 'name' has to be of
+* type 'u_long64'.
+*
+* INPUTS
+* const lListElem *ep - Pointer to list element
+* int name - field name
+*
+* RESULT
+* lUlong64 - u_long64 value
+******************************************************************************/
+lUlong64 lGetUlong64(const lListElem *ep, int name)
+{
+ int pos;
+ DENTER(CULL_BASIS_LAYER, "lGetUlong64");
+
+ pos = lGetPosViaElem(ep, name, SGE_DO_ABORT);
+
+ if (mt_get_type(ep->descr[pos].mt) != lUlong64T)
+ incompatibleType2(MSG_CULL_GETULONG64_WRONGTYPEFORFIELDXY_SS,
+ lNm2Str(name), multitypes[mt_get_type(ep->descr[pos].mt)]);
+
+ DEXIT;
+ return (lUlong64) ep->cont[pos].ul64;
+}
+
/****** cull/multitype/lGetPosString() ****************************************
* NAME
* lGetPosString() -- Returns the string ptr value at position pos
@@ -1800,6 +1871,209 @@ int lAddUlong(lListElem *ep, int name, lUlong offset)
return 0;
}
+/****** cull/multitype/lSetUlong64() ******************************************
+* NAME
+* lSetUlong64() -- Set ulong value at the given field name id
+*
+* SYNOPSIS
+* int lSetUlong64(lListElem *ep, int name, lUlong64 value)
+*
+* FUNCTION
+* Set ulong64 value at the given field name id
+*
+* INPUTS
+* lListElem *ep - element
+* int name - field name id
+* lUlong64 value - new value
+*
+* RESULT
+* int - error state
+* 0 - OK
+* -1 - Error
+******************************************************************************/
+int lSetUlong64(lListElem *ep, int name, lUlong64 value)
+{
+ int pos;
+
+ DENTER(CULL_BASIS_LAYER, "lSetUlong64");
+
+ if (!ep) {
+ LERROR(LEELEMNULL);
+ DEXIT;
+ return -1;
+ }
+
+ pos = lGetPosViaElem(ep, name, SGE_NO_ABORT);
+ if (pos < 0) {
+ DPRINTF(("!!!!!!!!!! lSetUlong64(): %s not found in element !!!!!!!!!!\n",
+ lNm2Str(name)));
+ DEXIT;
+ return -1;
+ }
+
+ if (mt_get_type(ep->descr[pos].mt) != lUlong64T) {
+ incompatibleType2(MSG_CULL_SETULONG64_WRONGTYPEFORFIELDXY_SS , lNm2Str(name), multitypes[mt_get_type(ep->descr[pos].mt)]);
+ DEXIT;
+ return -1;
+ }
+
+ if(value != ep->cont[pos].ul64) {
+ /* remove old hash entry */
+ if(ep->descr[pos].ht != NULL) {
+ cull_hash_remove(ep, pos);
+ }
+
+ ep->cont[pos].ul64 = value;
+
+ /* create entry in hash table */
+ if(ep->descr[pos].ht != NULL) {
+ cull_hash_insert(ep, (void *)&(ep->cont[pos].ul64), ep->descr[pos].ht,
+ mt_is_unique(ep->descr[pos].mt));
+ }
+
+ /* remember that field changed */
+ sge_bitfield_set(&(ep->changed), pos);
+ }
+
+ DEXIT;
+ return 0;
+}
+
+/****** cull_multitype/lAddUlong64() *******************************************
+* NAME
+* lAddUlong64() -- Adds a lUlong64 offset to the lUlong64 field
+*
+* SYNOPSIS
+* int lAddUlong64(lListElem *ep, int name, lUlong64 offset)
+*
+* FUNCTION
+* The 'offset' is added to the lUlong64 field 'name' of
+* the CULL element 'ep'.
+*
+* INPUTS
+* lListElem *ep - element
+* int name - field name id
+* lUlong64 offset - the offset
+*
+* RESULT
+* int -
+*
+* EXAMPLE
+* int - error state
+* 0 - OK
+* -1 - Error
+*******************************************************************************/
+int lAddUlong64(lListElem *ep, int name, lUlong64 offset)
+{
+ int pos;
+
+ DENTER(CULL_BASIS_LAYER, "lAddUlong64");
+
+ if (!ep) {
+ LERROR(LEELEMNULL);
+ DEXIT;
+ return -1;
+ }
+
+ pos = lGetPosViaElem(ep, name, SGE_NO_ABORT);
+ if (pos < 0) {
+ DPRINTF(("!!!!!!!!!! lSetUlong64(): %s not found in element !!!!!!!!!!\n",
+ lNm2Str(name)));
+ DEXIT;
+ return -1;
+ }
+
+ if (mt_get_type(ep->descr[pos].mt) != lUlong64T) {
+ incompatibleType2(MSG_CULL_SETULONG64_WRONGTYPEFORFIELDXY_SS , lNm2Str(name), multitypes[mt_get_type(ep->descr[pos].mt)]);
+ DEXIT;
+ return -1;
+ }
+
+ if (offset != 0) {
+ /* remove old hash entry */
+ if(ep->descr[pos].ht != NULL) {
+ cull_hash_remove(ep, pos);
+ }
+
+ ep->cont[pos].ul64 += offset;
+
+ /* create entry in hash table */
+ if(ep->descr[pos].ht != NULL) {
+ cull_hash_insert(ep, (void *)&(ep->cont[pos].ul64), ep->descr[pos].ht,
+ mt_is_unique(ep->descr[pos].mt));
+ }
+
+ /* remember that field changed */
+ sge_bitfield_set(&(ep->changed), pos);
+ }
+
+ DEXIT;
+ return 0;
+}
+
+/****** cull/multitype/lSetPosUlong64() ***************************************
+* NAME
+* lSetPosUlong64() -- Get ulong64 at a certain position
+*
+* SYNOPSIS
+* int lSetPosUlong64(lListElem *ep, int pos, lUlong64 value)
+*
+* FUNCTION
+* Get ulong64 at a certain position
+*
+* INPUTS
+* lListElem *ep - element
+* int pos - position
+* lUlong64 value - new value
+*
+* RESULT
+* int - error state
+* 0 - OK
+* -1 - Error
+*******************************************************************************/
+int lSetPosUlong64(lListElem *ep, int pos, lUlong64 value)
+{
+ DENTER(CULL_BASIS_LAYER, "lSetPosUlong64");
+ if (!ep) {
+ LERROR(LEELEMNULL);
+ DEXIT;
+ return -1;
+ }
+
+ if (pos < 0) {
+ LERROR(LENEGPOS);
+ DEXIT;
+ return -1;
+ }
+
+ if (mt_get_type(ep->descr[pos].mt) != lUlong64T) {
+ incompatibleType("lSetPosUlong64");
+ DEXIT;
+ return -1;
+ }
+
+ if(value != ep->cont[pos].ul64) {
+ /* remove old hash entry */
+ if(ep->descr[pos].ht != NULL) {
+ cull_hash_remove(ep, pos);
+ }
+
+ ep->cont[pos].ul64 = value;
+
+ /* create entry in hash table */
+ if(ep->descr[pos].ht != NULL) {
+ cull_hash_insert(ep, (void *)&(ep->cont[pos].ul64), ep->descr[pos].ht,
+ mt_is_unique(ep->descr[pos].mt));
+ }
+
+ /* remember that field changed */
+ sge_bitfield_set(&(ep->changed), pos);
+ }
+
+ DEXIT;
+ return 0;
+}
+
/****** cull/multitype/lSetPosString() ***************************************
* NAME
* lSetPosString() -- Sets the string at a certain position
@@ -3343,6 +3617,15 @@ int bitmaskcmp(lUlong bm0, lUlong bm1)
}
/* ------------------------------------------------------------
+ compares two ulong64 values u0 and u1
+ return values like strcmp
+ */
+int ulong64cmp(lUlong64 u0, lUlong64 u1)
+{
+ return u0 == u1 ? 0 : (u0 < u1 ? -1 : 1);
+}
+
+/* ------------------------------------------------------------
compares two lFloat values f0 and f1
return values like strcmp
*/
@@ -4500,6 +4783,430 @@ lListElem *lGetElemUlongNext(const lList *lp, int nm, lUlong val,
return NULL;
}
+/****** cull/multitype/lAddSubUlong64() ***************************************
+* NAME
+* lAddSubUlong64() -- adds ulong64 to the ulong64 sublist of element ep
+*
+* SYNOPSIS
+* lListElem* lAddSubUlong64(lListElem* ep, int nm, lUlong64 val,
+* int snm, const lDescr* dp)
+*
+* FUNCTION
+* This function adds a new element into the sublist snm of the
+* element ep. The field nm of the added element will get the
+* initial value val.
+*
+* INPUTS
+* lListElem* ep - element
+* int nm - field which will get value val
+* lUlong64 val - initial value for nm
+* int snm - sublist within ep where the element
+* will be added
+* const lDescr* dp - Type of the new element (e.g. JB_Type)
+*
+* RESULT
+* NULL in case of error
+* or the pointer to the new element
+******************************************************************************/
+lListElem *lAddSubUlong64(lListElem *ep, int nm, lUlong64 val, int snm,
+ const lDescr *dp)
+{
+ lListElem *ret;
+ int sublist_pos;
+
+ DENTER(CULL_LAYER, "lAddSubUlong64");
+
+ if (!ep) {
+ DPRINTF(("error: NULL ptr passed to lAddSubUlong64\n"));
+ DEXIT;
+ return NULL;
+ }
+
+ if (!(ep->descr)) {
+ DPRINTF(("NULL descriptor in element not allowed !!!"));
+ DEXIT;
+ abort();
+ }
+
+ /* run time type checking */
+ if ((sublist_pos = lGetPosViaElem(ep, snm, SGE_NO_ABORT)) < 0) {
+ CRITICAL((SGE_EVENT, MSG_CULL_ADDSUBULONG64ERRORXRUNTIMETYPE_S , lNm2Str(snm)));
+ DEXIT;
+ return NULL;
+ }
+
+ ret = lAddElemUlong64(&(ep->cont[sublist_pos].glp), nm, val, dp);
+
+ /* remember that field changed */
+ if (ret != NULL) {
+ sge_bitfield_set(&(ep->changed), sublist_pos);
+ }
+
+ DEXIT;
+ return ret;
+}
+
+/****** cull/multitype/lAddElemUlong64() **************************************
+* NAME
+* lAddElemUlong64() -- adds a ulong64 to the ulong64 list
+*
+* SYNOPSIS
+* lListElem* lAddElemUlong64(lList** lpp, int nm, lUlong64 val,
+* const lDescr* dp)
+*
+* FUNCTION
+* Adds an new element to a list lpp where one field nm within
+* the new element gets an initial value val
+*
+* INPUTS
+* lList** lpp - list
+* int nm - field in the new element which will get
+* value val
+* lUlong64 val - initial value for nm
+* const lDescr* dp - type of the list (e.g. JB_Type)
+*
+* RESULT
+* NULL on error
+* or pointer to the added element
+******************************************************************************/
+lListElem *lAddElemUlong64(lList **lpp, int nm, lUlong64 val, const lDescr *dp)
+{
+ lListElem *sep;
+ int pos;
+
+ DENTER(CULL_LAYER, "lAddElemUlong64");
+
+ if (!lpp || !dp) {
+ DPRINTF(("error: NULL ptr passed to lAddElemUlong64\n"));
+ DEXIT;
+ return NULL;
+ }
+
+ /* get position of nm in sdp */
+ pos = lGetPosInDescr(dp, nm);
+
+ /* run time type checking */
+ if (pos < 0) {
+ CRITICAL((SGE_EVENT, MSG_CULL_ADDELEMULONG64ERRORXRUNTIMETYPE_S,
+ lNm2Str(nm)));
+ DEXIT;
+ return NULL;
+ }
+
+ if (!*lpp) {
+ /* ensure existence of a val list in ep */
+ *lpp = lCreateList("ulong64_sublist", dp);
+ }
+
+ /* add new host val element to sublist */
+ sep = lCreateElem(dp);
+ lSetPosUlong64(sep, pos, val);
+ lAppendElem(*lpp, sep);
+
+ DEXIT;
+ return sep;
+}
+
+/****** cull/multitype/lDelSubUlong64() ***************************************
+* NAME
+* lDelSubUlong64() -- removes an element from a sublist
+*
+* SYNOPSIS
+* int lDelSubUlong64(lListElem* ep, int nm, lUlong64 val, int snm)
+*
+* FUNCTION
+* This function removes an element specified by a ulong field nm
+* and the ulong64 val supposed to be in the sublist snm of the
+* element ep
+*
+* INPUTS
+* lListElem* ep - element
+* int nm - field id
+* lUlong64 val - value
+* int snm - field id of the sublist in ep
+*
+* RESULT
+* 1 element was found and removed
+* 0 in case of an error
+******************************************************************************/
+int lDelSubUlong64(lListElem *ep, int nm, lUlong64 val, int snm)
+{
+ int ret, sublist_pos;
+
+ DENTER(CULL_LAYER, "lDelSubUlong64");
+
+ /* get position of sublist in ep */
+ sublist_pos = lGetPosViaElem(ep, snm, SGE_DO_ABORT);
+
+ ret = lDelElemUlong64(&(ep->cont[sublist_pos].glp), nm, val);
+
+ /* remember that field changed */
+ if (ret == 1) {
+ sge_bitfield_set(&(ep->changed), sublist_pos);
+ }
+
+ DEXIT;
+ return ret;
+}
+
+/****** cull/multitype/lDelElemUlong64() **************************************
+* NAME
+* lDelElemUlong64() -- removes elem specified by a ulong64 field nm
+*
+* SYNOPSIS
+* int lDelElemUlong64(lList** lpp, int nm, lUlong64 val)
+*
+* FUNCTION
+* This function removes an element specified by a ulong64 field nm
+* with the value val from the list referenced by lpp.
+*
+* INPUTS
+* lList** lpp - reference to a list
+* int nm - field id
+* lUlong64 val - value if nm
+*
+* RESULT
+* 1 element was found and removed
+* 0 an error occured
+******************************************************************************/
+int lDelElemUlong64(lList **lpp, int nm, lUlong64 val)
+{
+ lListElem *ep;
+
+ DENTER(CULL_LAYER, "lDelElemUlong64");
+
+ if (!lpp || !val) {
+ DPRINTF(("error: NULL ptr passed to lDelElemUlong64\n"));
+ DEXIT;
+ return 0;
+ }
+
+ /* empty list ? */
+ if (!*lpp) {
+ DEXIT;
+ return 1;
+ }
+
+ /* seek element */
+ ep = lGetElemUlong64(*lpp, nm, val);
+ if (ep) {
+ lRemoveElem(*lpp, &ep);
+ if (lGetNumberOfElem(*lpp) == 0) {
+ lFreeList(lpp);
+ }
+ }
+
+ DEXIT;
+ return 1;
+}
+
+/****** cull/multitype/lGetSubUlong64() *****************************************
+* NAME
+* lGetSubUlong64() -- Element specified by a ulong64 field nm
+*
+* SYNOPSIS
+* lListElem* lGetSubUlong64(const lListElem* ep, int nm,
+* lUlong64 val, int snm)
+*
+* FUNCTION
+* returns an element specified by a ulong64 field nm an the ulong64
+* value val from the sublist snm of the element ep
+*
+* INPUTS
+* const lListElem* ep - element pointer
+* int nm - field id which is part of a sublist
+* element of ep
+* lUlong64 val - unsigned long value
+* int snm - field id of a list which is part of ep
+*
+* RESULT
+* NULL if element was not found or in case of an error
+* otherwise pointer to the element
+******************************************************************************/
+lListElem *lGetSubUlong64(const lListElem *ep, int nm, lUlong64 val, int snm)
+{
+ int sublist_pos;
+ lListElem *ret;
+
+ DENTER(CULL_LAYER, "lGetSubUlong64");
+
+ /* get position of sublist in ep */
+ sublist_pos = lGetPosViaElem(ep, snm, SGE_DO_ABORT);
+
+ ret = lGetElemUlong64(ep->cont[sublist_pos].glp, nm, val);
+
+ DEXIT;
+ return ret;
+}
+
+/****** cull/multitype/lGetElemUlong64() **************************************
+* NAME
+* lGetElemUlong64() -- returns element specified by a ulong64 field nm
+*
+* SYNOPSIS
+* lListElem* lGetElemUlong64(const lList* lp, int nm, lUlong64 val)
+*
+* FUNCTION
+* returns an element specified by a ulong64 field nm an an ulong64
+* value val from list lp
+*
+* INPUTS
+* const lList* lp - list pointer
+* int nm - field id
+* lUlong64 val - unsigned long value
+*
+* RESULT
+* NULL if element was not found or an error occured
+* otherwise pointer to element
+******************************************************************************/
+lListElem *lGetElemUlong64(const lList *lp, int nm, lUlong64 val)
+{
+ const void *iterator = NULL;
+ return lGetElemUlong64First(lp, nm, val, &iterator);
+}
+
+/****** cull/multitype/lGetElemUlong64First() *********************************
+* NAME
+* lGetElemUlong64First() -- Find first ulong64 within a list
+*
+* SYNOPSIS
+* lListElem* lGetElemUlong64First(const lList *lp,
+* int nm,
+* lUlong64 val,
+* const void **iterator)
+*
+* FUNCTION
+* Return the first element of list 'lp' where the attribute
+* with field name id 'nm' is equivalent with 'val'. Context
+* information will be stored in 'iterator'. 'iterator' might
+* be used in lGetElemUlong64Next() to get the next element.
+*
+* INPUTS
+* const lList *lp - list
+* int nm - ulong64 field name id
+* lUlong64 val - ulong64 value
+* const void **iterator - iterator
+*
+* RESULT
+* lListElem* - element or NULL
+******************************************************************************/
+lListElem *lGetElemUlong64First(const lList *lp, int nm, lUlong64 val,
+ const void **iterator)
+{
+ lListElem *ep = NULL;
+ int pos;
+
+ DENTER(CULL_LAYER, "lGetElemUlong64First");
+
+ /* empty list ? */
+ if (!lp) {
+ DEXIT;
+ return NULL;
+ }
+
+ /* get position of nm in sdp */
+ pos = lGetPosInDescr(lGetListDescr(lp), nm);
+
+ /* run time type checking */
+ if (pos < 0) {
+ CRITICAL((SGE_EVENT, MSG_CULL_GETELEMULONG64ERRORXRUNTIMETYPE_S, lNm2Str(nm)));
+ DEXIT;
+ return NULL;
+ }
+
+ *iterator = NULL;
+
+ if(lp->descr[pos].ht != NULL) {
+ /* hash access */
+ ep = cull_hash_first(lp->descr[pos].ht, &val,
+ mt_is_unique(lp->descr[pos].mt), iterator);
+ DEXIT;
+ return ep;
+ } else {
+ /* seek for element */
+ for_each(ep, lp) {
+ lUlong64 s = lGetPosUlong64(ep, pos);
+ if (s == val) {
+ *iterator = ep;
+ DEXIT;
+ return ep;
+ }
+ }
+ }
+
+ DEXIT;
+ return NULL;
+}
+
+/****** cull/multitype/lGetElemUlong64Next() **********************************
+* NAME
+* lGetElemUlong64Next() -- Find next ulong64 element within a list
+*
+* SYNOPSIS
+* lListElem* lGetElemUlong64Next(const lList *lp,
+* int nm,
+* lUlong64 val,
+* const void **iterator)
+*
+* FUNCTION
+* This function might be used after a call to lGetElemUlong64First().
+* It expects 'iterator' to contain context information which
+* makes it possible to find the next element within list 'lp'
+* where the attribute with field name id 'nm' is equivalent with
+* 'val'.
+*
+* INPUTS
+* const lList *lp - list
+* int nm - ulong64 field name id
+* lUlong64 val - value
+* const void **iterator - iterator
+*
+* RESULT
+* lListElem* - next element or NULL
+******************************************************************************/
+lListElem *lGetElemUlong64Next(const lList *lp, int nm, lUlong64 val,
+ const void **iterator)
+{
+ lListElem *ep;
+ int pos;
+
+ DENTER(CULL_LAYER, "lGetElemUlong64Next");
+
+ if(*iterator == NULL) {
+ return NULL;
+ }
+
+ /* get position of nm in sdp */
+ pos = lGetPosInDescr(lGetListDescr(lp), nm);
+
+ /* run time type checking */
+ if (pos < 0) {
+ CRITICAL((SGE_EVENT, MSG_CULL_GETELEMULONG64ERRORXRUNTIMETYPE_S, lNm2Str(nm)));
+ DEXIT;
+ return NULL;
+ }
+
+ if(lp->descr[pos].ht != NULL) {
+ /* hash access */
+ ep = cull_hash_next(lp->descr[pos].ht, iterator);
+ DEXIT;
+ return ep;
+ } else {
+ /* seek for element */
+ for (ep = ((lListElem *)*iterator)->next; ep; ep = ep->next) {
+ lUlong64 s = lGetPosUlong64(ep, pos);
+ if (s == val) {
+ *iterator = ep;
+ DEXIT;
+ return ep;
+ }
+ }
+ }
+
+ *iterator = NULL;
+ DEXIT;
+ return NULL;
+}
/****** cull/multitype/lDelSubCaseStr() ***************************************
* NAME
* lDelSubCaseStr() -- removes elem specified by a string field nm
diff --git a/source/libs/cull/cull_multitype.h b/source/libs/cull/cull_multitype.h
index a48c18e..d0ca65c 100644
--- a/source/libs/cull/cull_multitype.h
+++ b/source/libs/cull/cull_multitype.h
@@ -30,6 +30,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
@@ -75,6 +76,7 @@ int lSwapList(lListElem *to, int to_nm, lListElem *from, int from_nm);
lInt lGetPosInt(const lListElem *ep, int id);
lUlong lGetPosUlong(const lListElem *ep, int id);
+lUlong64 lGetPosUlong64(const lListElem *ep, int id);
const char *lGetPosString(const lListElem *ep, int id);
const char *lGetPosHost(const lListElem *ep, int id);
lList *lGetPosList(const lListElem *ep, int id);
@@ -88,6 +90,7 @@ lRef lGetPosRef(const lListElem *ep, int id);
int lSetPosInt(lListElem *ep, int pos, int value);
int lSetPosUlong(lListElem *ep, int pos, lUlong value);
+int lSetPosUlong64(lListElem *ep, int pos, lUlong64 value);
int lSetPosString(lListElem *ep, int pos, const char *value);
int lSetPosHost(lListElem *ep, int pos, const char *value);
@@ -102,6 +105,7 @@ int lSetPosRef(lListElem *ep, int pos, lRef value);
lInt lGetInt(const lListElem *ep, int name);
lUlong lGetUlong(const lListElem *ep, int name);
+lUlong64 lGetUlong64(const lListElem *ep, int name);
const char *lGetString(const lListElem *ep, int name);
const char *lGetHost(const lListElem *ep, int name);
lList *lGetList(const lListElem *ep, int name);
@@ -116,6 +120,7 @@ lRef lGetRef(const lListElem *ep, int name);
int lSetInt(lListElem *ep, int name, int value);
int lSetUlong(lListElem *ep, int name, lUlong value);
+int lSetUlong64(lListElem *ep, int name, lUlong64 value);
int lSetString(lListElem *ep, int name, const char *value);
int lSetHost(lListElem *ep, int name, const char *value);
int lSetList(lListElem *ep, int name, lList *value);
@@ -129,10 +134,12 @@ int lSetRef(lListElem *ep, int name, lRef value);
int lAddDouble(lListElem *ep, int name, lDouble offset);
int lAddUlong(lListElem *ep, int name, lUlong offset);
+int lAddUlong64(lListElem *ep, int name, lUlong64 offset);
int intcmp(lInt i0, lInt i1);
int ulongcmp(lUlong u0, lUlong u1);
int bitmaskcmp(lUlong bm0, lUlong bm1);
+int ulong64cmp(lUlong64 u0, lUlong64 u1);
int floatcmp(lFloat u0, lFloat u1);
int doublecmp(lDouble u0, lDouble u1);
int charcmp(lChar u0, lChar u1);
@@ -195,6 +202,25 @@ lListElem *lGetSubUlong(const lListElem *ep, int nm, lUlong val, int snm);
/* - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
+ functions for lists with a ulong64 as key
+
+*/
+lListElem* lAddElemUlong64(lList **lpp, int nm, lUlong64 val, const lDescr *dp);
+int lDelElemUlong64(lList **lpp, int nm, lUlong64 val);
+lListElem *lGetElemUlong64(const lList *lp, int nm, lUlong64 val);
+lListElem *lGetElemUlong64First(const lList *lp, int nm, lUlong64 val, const void **iterator);
+lListElem *lGetElemUlong64Next(const lList *lp, int nm, lUlong64 val, const void **iterator);
+
+/* - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
+
+ functions for sublists with a ulong64 as key
+
+*/
+lListElem* lAddSubUlong64(lListElem *ep, int nm, lUlong64 val, int snm, const lDescr *dp);
+int lDelSubUlong64(lListElem *ep, int nm, lUlong64 val, int snm);
+lListElem *lGetSubUlong64(const lListElem *ep, int nm, lUlong64 val, int snm);
+/* - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
+
functions for lists with a case insensitive char * as key
*/
diff --git a/source/libs/cull/cull_multitypeP.h b/source/libs/cull/cull_multitypeP.h
index 9d64ed1..713ae71 100644
--- a/source/libs/cull/cull_multitypeP.h
+++ b/source/libs/cull/cull_multitypeP.h
@@ -30,6 +30,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include "cull/cull_list.h"
@@ -39,6 +40,7 @@ union _lMultiType {
lFloat fl;
lDouble db;
lUlong ul;
+ lUlong64 ul64;
lLong l;
lChar c;
lBool b;
diff --git a/source/libs/cull/cull_pack.c b/source/libs/cull/cull_pack.c
index de3affc..25f593f 100644
--- a/source/libs/cull/cull_pack.c
+++ b/source/libs/cull/cull_pack.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
#include <stdlib.h>
@@ -110,6 +111,11 @@ int flags
dst->ul = i;
break;
+ case lUlong64T:
+ ret = unpackint(pb, &i);
+ dst->ul64 = i;
+ break;
+
case lStringT:
ret = unpackstr(pb, &(dst->str));
break;
@@ -179,6 +185,10 @@ cull_pack_switch(sge_pack_buffer *pb, const lMultiType *src, lEnumeration *what,
ret = packint(pb, src->ul);
break;
+ case lUlong64T:
+ ret = packint(pb, src->ul64);
+ break;
+
case lStringT:
ret = packstr(pb, src->str);
break;
diff --git a/source/libs/cull/cull_parse.c b/source/libs/cull/cull_parse.c
index 61ecc76..f71001f 100644
--- a/source/libs/cull/cull_parse.c
+++ b/source/libs/cull/cull_parse.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
#include <string.h>
@@ -102,6 +103,7 @@ cull_parse_state *state
"%d", /* INT */
"%s", /* STRING */
"%u", /* ULONG */
+ "%lu", /* ULONG64 */
"%l", /* SUBLIST */
"%f", /* FLOAT */
"%g", /* DOUBLE */
diff --git a/source/libs/cull/cull_parse.h b/source/libs/cull/cull_parse.h
index da3ecae..65d591b 100644
--- a/source/libs/cull/cull_parse.h
+++ b/source/libs/cull/cull_parse.h
@@ -30,6 +30,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
@@ -63,6 +64,7 @@ enum {
INT,
STRING,
ULONG,
+ ULONG64,
SUBLIST,
FLOAT,
DOUBLE,
diff --git a/source/libs/cull/cull_sort.c b/source/libs/cull/cull_sort.c
index 0798f09..07aad7a 100644
--- a/source/libs/cull/cull_sort.c
+++ b/source/libs/cull/cull_sort.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
#include <stdlib.h>
@@ -159,6 +160,9 @@ const lSortOrder *sp
case lUlongT:
result = ulongcmp(lGetPosUlong(ep0, sp[i].pos), lGetPosUlong(ep1, sp[i].pos));
break;
+ case lUlong64T:
+ result = ulong64cmp(lGetPosUlong64(ep0, sp[i].pos), lGetPosUlong64(ep1, sp[i].pos));
+ break;
case lFloatT:
result = floatcmp(lGetPosFloat(ep0, sp[i].pos), lGetPosFloat(ep1, sp[i].pos));
break;
diff --git a/source/libs/cull/cull_where.c b/source/libs/cull/cull_where.c
index c9f8199..118f256 100644
--- a/source/libs/cull/cull_where.c
+++ b/source/libs/cull/cull_where.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include <stdio.h>
@@ -273,6 +274,13 @@ static void lWriteWhereTo_(const lCondition *cp, int depth, FILE *fp)
fprintf(fp, "%s "sge_u32"\n", out, cp->operand.cmp.val.ul);
}
break;
+ case lUlong64T:
+ if (!fp) {
+ DPRINTF(("%s "sge_u64"\n", out, cp->operand.cmp.val.ul64));
+ } else {
+ fprintf(fp, "%s "sge_u64"\n", out, cp->operand.cmp.val.ul64);
+ }
+ break;
case lStringT:
if (!fp) {
DPRINTF(("%s \"%s\"\n", out, cp->operand.cmp.val.str));
@@ -705,6 +713,12 @@ static lCondition *read_val(lDescr *dp, cull_parse_state *state, va_list *app)
cp->operand.cmp.val.ul = va_arg(*app, lUlong);
break;
+ case ULONG64:
+ if (mt_get_type(cp->operand.cmp.mt) != lUlong64T)
+ incompatibleType(MSG_CULL_WHERE_SHOULDBEULONG64T);
+ cp->operand.cmp.val.ul64 = va_arg(*app, lUlong64);
+ break;
+
case FLOAT:
if (mt_get_type(cp->operand.cmp.mt) != lFloatT)
incompatibleType(MSG_CULL_WHERE_SHOULDBEFLOATT);
@@ -998,6 +1012,13 @@ static lCondition *_read_val(lDescr *dp, cull_parse_state *state, WhereArgList *
cp->operand.cmp.val.ul = (*wapp)++->value.ul;
break;
+ case ULONG64:
+ if (mt_get_type(cp->operand.cmp.mt) != lUlong64T)
+ incompatibleType(MSG_CULL_WHERE_SHOULDBEULONG64T);
+/* DPRINTF(("(*wapp)->value.ul64 = %ul\n", (*wapp)->value.ul64)); */
+ cp->operand.cmp.val.ul64 = (*wapp)++->value.ul64;
+ break;
+
case FLOAT:
if (mt_get_type(cp->operand.cmp.mt) != lFloatT)
incompatibleType(MSG_CULL_WHERE_SHOULDBEFLOATT);
@@ -1053,7 +1074,8 @@ static lCondition *_read_val(lDescr *dp, cull_parse_state *state, WhereArgList *
"p=" as operator is not allowed with other types than lStringT
"h=" as operator is not allowed with other types than lStringT
*/
- if ((cp->op == BITMASK && mt_get_type(cp->operand.cmp.mt) != lUlongT ) ||
+ if ((cp->op == BITMASK && mt_get_type(cp->operand.cmp.mt) != lUlongT ) ||
+ ( cp->op == BITMASK && mt_get_type(cp->operand.cmp.mt) != lUlong64T ) ||
( (cp->op == STRCASECMP && mt_get_type(cp->operand.cmp.mt) != lStringT) && (cp->op == STRCASECMP && mt_get_type(cp->operand.cmp.mt) != lHostT) ) ||
( (cp->op == HOSTNAMECMP && mt_get_type(cp->operand.cmp.mt) != lStringT) && (cp->op == HOSTNAMECMP && mt_get_type(cp->operand.cmp.mt) != lHostT) ) ||
( (cp->op == PATTERNCMP && mt_get_type(cp->operand.cmp.mt) != lStringT) && (cp->op == PATTERNCMP && mt_get_type(cp->operand.cmp.mt) != lHostT) ))
@@ -1215,6 +1237,10 @@ int lCompare(const lListElem *ep, const lCondition *cp)
result = ulongcmp(lGetPosUlong(ep, cp->operand.cmp.pos),
cp->operand.cmp.val.ul);
break;
+ case lUlong64T:
+ result = ulong64cmp(lGetPosUlong64(ep, cp->operand.cmp.pos),
+ cp->operand.cmp.val.ul64);
+ break;
case lListT:
result = (lFindFirst(lGetPosList(ep, cp->operand.cmp.pos),
cp->operand.cmp.val.cp) != NULL);
@@ -1431,6 +1457,9 @@ lCondition *lCopyWhere(const lCondition *cp)
case lUlongT:
new->operand.cmp.val.ul = cp->operand.cmp.val.ul;
break;
+ case lUlong64T:
+ new->operand.cmp.val.ul64 = cp->operand.cmp.val.ul64;
+ break;
case lStringT:
new->operand.cmp.val.str = strdup(cp->operand.cmp.val.str);
break;
diff --git a/source/libs/cull/msg_cull.h b/source/libs/cull/msg_cull.h
index 86f284b..f9b0572 100644
--- a/source/libs/cull/msg_cull.h
+++ b/source/libs/cull/msg_cull.h
@@ -30,6 +30,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include "basis_types.h"
@@ -199,5 +200,15 @@
#define MSG_CULL_XNOTFOUNDINELEMENT_S _MESSAGE(41068, _("!!!!!!!!!! "SFN" not found in element !!!!!!!!!!"))
#define MSG_CULL_POINTER_NULLELEMENTFORX_S _MESSAGE(41069, _("!!!!!!!!!! got NULL element for "SFN" !!!!!!!!!!"))
+/*
+** Messages for lUlong64
+*/
#endif /* __MSG_CULL_H */
-
+#define MSG_CULL_GETULONG64_WRONGTYPEFORFIELDXY_SS _MESSAGE(41170, _("lGetUlong64: wrong type for field "SFN" ("SFN")"))
+#define MSG_CULL_SETULONG64_WRONGTYPEFORFIELDXY_SS _MESSAGE(41171, _("lSetUlong64: wrong type for field "SFN" ("SFN")"))
+#define MSG_CULL_ADDSUBULONG64ERRORXRUNTIMETYPE_S _MESSAGE(41172, _("error: lAddSubUlong64("SFN"): run time type error"))
+#define MSG_CULL_ADDELEMULONG64ERRORXRUNTIMETYPE_S _MESSAGE(41173, _("error: lAddElemUlong64("SFN"): run time type error"))
+#define MSG_CULL_DELELEMULONG64ERRORXRUNTIMETYPE_S _MESSAGE(41174, _("error: lDelElemUlong64("SFN"): run time type error"))
+#define MSG_CULL_GETELEMULONG64ERRORXRUNTIMETYPE_S _MESSAGE(41175, _("error: lGetElemUlong64("SFN"): run time type error"))
+#define MSG_CULL_GETPOSULONG64_GOTINVALIDPOSITION _MESSAGE(41176, _("!!!!!!!!!! lGetPosUlong64() got an invalid pos !!!!!!!!!!!!"))
+#define MSG_CULL_WHERE_SHOULDBEULONG64T _MESSAGE(41177, _("lWhere (should be a lUlong64T)"))
diff --git a/source/libs/sgeobj/sge_procL.h b/source/libs/sgeobj/sge_procL.h
index b72a7d2..a75469b 100644
--- a/source/libs/sgeobj/sge_procL.h
+++ b/source/libs/sgeobj/sge_procL.h
@@ -30,6 +30,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
#include "cull/cull.h"
@@ -50,7 +51,7 @@ extern "C" {
* Number of jiffies that this process has been scheduled in user mode.
* SGE_ULONG (PRO_stime)
* Number of jiffies that this process has been scheduled in kernel mode.
-* SGE_ULONG (PRO_vsize)
+* SGE_ULONG64 (PRO_vsize)
* Virtual memory size in bytes.
* SGE_LIST (PRO_groups)
* GR_Type list with all groups associated with this process.
@@ -76,7 +77,7 @@ LISTDEF( PRO_Type )
SGE_ULONG ( PRO_pid, CULL_PRIMARY_KEY | CULL_HASH | CULL_UNIQUE )
SGE_ULONG ( PRO_utime, CULL_DEFAULT )
SGE_ULONG ( PRO_stime, CULL_DEFAULT )
- SGE_ULONG ( PRO_vsize, CULL_DEFAULT )
+ SGE_ULONG64 ( PRO_vsize, CULL_DEFAULT )
SGE_LIST ( PRO_groups, GR_Type, CULL_DEFAULT )
SGE_BOOL ( PRO_rel, CULL_DEFAULT )
SGE_BOOL ( PRO_run, CULL_DEFAULT )
diff --git a/source/libs/uti/sge_htable.c b/source/libs/uti/sge_htable.c
index 28b7040..7e8aa33 100644
--- a/source/libs/uti/sge_htable.c
+++ b/source/libs/uti/sge_htable.c
@@ -28,6 +28,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
/*
* Based on David Flanagan's Xmt libary's Hash.c
@@ -536,6 +537,18 @@ const void *dup_func_u_long32(const void *key)
return dup_key;
}
+const void *dup_func_u_long64(const void *key)
+{
+ u_long64 *dup_key = NULL;
+ u_long64 *cast = (u_long64 *)key;
+
+ if((dup_key = (u_long64 *)malloc(sizeof(u_long64))) != NULL) {
+ *dup_key = *cast;
+ }
+
+ return dup_key;
+}
+
const void *dup_func_long(const void *key)
{
long *dup_key = NULL;
@@ -597,6 +610,12 @@ int hash_func_u_long32(const void *key)
return (int)*cast;
}
+int hash_func_u_long64(const void *key)
+{
+ u_long64 *cast = (u_long64 *)key;
+ return (int)*cast;
+}
+
int hash_func_long(const void *key)
{
long *cast = (long*)key;
@@ -663,6 +682,13 @@ int hash_compare_u_long32(const void *a, const void *b)
return *cast_a - *cast_b;
}
+int hash_compare_u_long64(const void *a, const void *b)
+{
+ u_long64 *cast_a = (u_long64 *)a;
+ u_long64 *cast_b = (u_long64 *)b;
+ return *cast_a - *cast_b;
+}
+
int hash_compare_long(const void *a, const void *b)
{
long *cast_a = (long*)a;
diff --git a/source/libs/uti/sge_htable.h b/source/libs/uti/sge_htable.h
index 678646f..de6a65c 100644
--- a/source/libs/uti/sge_htable.h
+++ b/source/libs/uti/sge_htable.h
@@ -30,6 +30,7 @@
* All Rights Reserved.
*
************************************************************************/
+/* Portions of this code are Copyright (c) 2011 Univa Corporation. */
/*___INFO__MARK_END__*/
/*
* Based on the code of David Flanagan's Xmt library
@@ -56,17 +57,20 @@ void sge_htable_for_each(htable ht, sge_htable_for_each_proc proc);
const char *sge_htable_statistics(htable ht, dstring *buffer);
const void *dup_func_u_long32(const void *key);
+const void *dup_func_u_long64(const void *key);
const void *dup_func_string(const void *key);
const void *dup_func_long(const void *key);
const void *dup_func_pointer(const void *key);
int hash_func_u_long32(const void *key);
+int hash_func_u_long64(const void *key);
int hash_func_string(const void *key);
int hash_func_long(const void *key);
int hash_func_pointer(const void *key);
int hash_compare_u_long32(const void *a, const void *b);
+int hash_compare_u_long64(const void *a, const void *b);
int hash_compare_string(const void *a, const void *b);
int hash_compare_long(const void *a, const void *b);
int hash_compare_pointer(const void *a, const void *b);